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

本文提供Oracle数据库性能优化的实用步骤,包括检查表空间和回滚段的可用率,解锁被阻塞的表,查看SQL执行计划,以及处理表碎片。通过这些方法可以有效提升Oracle数据库的运行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、看回滚段和表空间是否充足,用以脚本在PL/SQL查看。

 

SELECT DISTINCT a.tablespace_name 表空间名称,                
       trunc((free_space / total_space) * 100) || '%' 可用率,                
       to_char(free_space / 1024 / 1024 / 1024, '9999999990.99') || 'G' 剩余空间,                
       to_char(total_space / 1024 / 1024 / 1024, '9999999990.99') || 'G' 总空间
  FROM (SELECT tablespace_name, SUM(bytes) free_space        
          FROM dba_free_space        
         GROUP BY tablespace_name) a,       
       (SELECT tablespace_name, SUM(bytes) total_space        
          FROM dba_data_files        
         GROUP BY tablespace_name) b
 WHERE a.tablespace_name = b.tablespace_name;

备注:回滚段一般以undo开头,当undo空间可用率低的时候,在牛的服务器也会卡爆,表空间不足的时候也会卡。及时查看这些空间的可用率,比较低的时候立刻想办法增加。如果回滚段和表空间比较富裕的时候,请采取下一步骤。

2、在PL/SQL依次单击"Tools"--->"Session",打开Oracle正在进行的会话,根据用户名找到自己的会话,在位置3的地方单击右键后选择“Copy”

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

alter system kill session 'sid,serial#';

alter system kill session '29,5497';

 3、查看语句执行计划

 备注:参考资料https://www.cnblogs.com/eastsea/p/4174754.html

4、如果分析了表还慢,可能表经常进行删除操作,所以碎片比较多。彻底删除该表。在用脚本重新创建表,然后导入数据再执行存过或脚本。oracle彻底删除表的语句(把表换成你自己的表)

DROP TABLE rpt_acct_xxxx_list PURGE;

使用oracle开发的时候,如果在存储过程中,或者是其他代码中使用了drop语句删除大量表,容易在回收站中产生垃圾,DBA会投诉,所以不要这样做,如果确定了要drop表,则最好加上purge,但是要慎用,因为无法闪回

以上方法还不行,请查看一下表里的数据量。如果数据量很大,就把不用历史数据放到备份表里,然后从正式表里删除这些不用的数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值