首页 > 软件开发 > ORACLE >

Oracle存储过程(存过)或SQL脚本执行慢的优化

来源:互联网 2023-03-17 00:00:39 523

维护Oracle数据库也有一段时间了,期间遇到了各种各样的问题,尤其是存过和SQL脚本执行10几个小时执行不完,而原本只需要几个小时,甚至十几分钟。下面是我在我解决这类问题时积累的经验,当大家遇到存过执行慢,会话长时间停留在一个点上,就用下面的步骤处理。wmG办公区 - 实用经验教程分享!

工具/原料

  • Oracle
  • PL/SQL

方法/步骤

  • 1

    看回滚段和表空间是否充足,用以脚本在PL/SQL查看。wmG办公区 - 实用经验教程分享!

    Select Distinct a.Tablespace_Name 表空间名称,wmG办公区 - 实用经验教程分享!

    Trunc((Free_Space / Total_Space) * 100) || '%' 可用率,wmG办公区 - 实用经验教程分享!

    To_Char(Free_Space / 1024 / 1024/1024, '9999999990.99') || 'G' 剩余空间,wmG办公区 - 实用经验教程分享!

    To_Char(Total_Space / 1024 / 1024/1024, '9999999990.99') || 'G' 总空间wmG办公区 - 实用经验教程分享!

    From (Select Tablespace_Name, Sum(Bytes) Free_SpacewmG办公区 - 实用经验教程分享!

    From Dba_Free_SpacewmG办公区 - 实用经验教程分享!

    Group By Tablespace_Name) a,wmG办公区 - 实用经验教程分享!

    (Select Tablespace_Name, Sum(Bytes) Total_SpacewmG办公区 - 实用经验教程分享!

    From Dba_Data_FileswmG办公区 - 实用经验教程分享!

    Group By Tablespace_Name) bwmG办公区 - 实用经验教程分享!

    Where a.Tablespace_Name = b.Tablespace_Name;wmG办公区 - 实用经验教程分享!

    回滚段一般以undo开头,当undo空间可用率低的时候,在牛的服务器也会卡爆,表空间不足的时候也会卡。及时查看这些空间的可用率,比较低的时候立刻想办法增加。如果回滚段和表空间比较富裕的时候,请采取下一步骤。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 2

    在PL/SQL依次单击"Tools"--->"Session",打开Oracle正在进行的会话,根据用户名找到自己的会话,在位置3的地方单击右键后选择“Copy”wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 3

    如果表在更新Update或插入Insert用以下脚本查看表是否被锁了。如果更新的表被锁住了,Oracle会等待该表提交commit。有时候人为的无意间锁住了该表,就算你等到猴年马月也执行不完。根据sid(图中红圈所示)杀掉进程,如果你自己知道这个进程是哪个存过,停掉该存过也可以。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 3该信息未经授权抓取自百度经验
  • 4

    如果不是上面的原因,接下来确认表的索引是否在起作用。从第二步的会话中复制执行的脚本到新窗口,将一些邦定的变量(图中红圈所示)改成实际值,随便写个值就可以。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 5

    接着按F5看执行计划,如果表没有使用索引(如图中红圈所示表示没有使用索引),要么是没有索引,给它建上索引。或者表经常被进行删除操作,表需要重新分析以下。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 6

    用下面脚本进行表分析操作,将其中的表换成你自己的表。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 7

    如果分析了表还慢,可能表经常进行删除操作,所以碎片比较多。彻底删除该表。在用脚本重新创建表,然后导入数据再执行存过或脚本。wmG办公区 - 实用经验教程分享!

    wmG办公区 - 实用经验教程分享!

    oracle彻底删除表的语句(把表换成你自己的表)wmG办公区 - 实用经验教程分享!

    DROP TABLE rpt_acct_xxxx_list PURGEwmG办公区 - 实用经验教程分享!

    wmG办公区 - 实用经验教程分享!

  • 8

    以上方法还不行,请查看一下表里的数据量。如果数据量很大,就把不用历史数据放到备份表里,然后从正式表里删除这些不用的数据。wmG办公区 - 实用经验教程分享!

    Oracle存储过程(存过)或SQL脚本执行慢的优化wmG办公区 - 实用经验教程分享!

  • 注意事项

    • 本篇经验是本人在实际操作过程中记录下来的,如果对大家有帮助的话,请点击正下方的或右上角的“大拇指”或“分享”或“关注TA”给我支持和鼓励,这样我会更努力的.

    以上方法由办公区教程网编辑摘抄自百度经验可供大家参考!wmG办公区 - 实用经验教程分享!


    标签: oracle

    办公区 Copyright © 2016-2023 www.bgqu.net. Some Rights Reserved. 备案号:湘ICP备2020019561号统计代码