失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > ORACLE 11G 查询DBA_SEGMENTS 慢的问题

ORACLE 11G 查询DBA_SEGMENTS 慢的问题

时间:2023-03-28 02:56:56

相关推荐

ORACLE 11G 查询DBA_SEGMENTS 慢的问题

ORACLE 11G 查询DBA_SEGMENTS表慢的问题

由于公司需要每天巡检数据库,定时跑巡检脚本,之前没有问题,今天发现一个很简单的查询语句居然跑的10个小时还没有出结果:

select sum(bytes)/1024/1024/1024 "SIZE G " from dba_segments;

系统是linux 6.9 11.2.0.4.0 rac 80T的数据量 之前基本上半个小时出结果,这次时间不对。开始怀疑是月底应用跑批,查看数据库的负载也不大,系统的负载也正常,想是不是统计信息该更新了,我来这个公司刚一个月,不知道之前是什么时候更新的,写了个定时任务,删除之前的统计信息,重新分析:

EXEC DBMS_STATS.GATHER_DICTIONARY_STATS:收集

EXEC DBMS_STATS.DELETE_DICTIONARY_STATS:删除

第二天再次跑,问题依旧,开始怀疑是不是有锁表?查看锁确实存在:enq:tx - contention 查询dba_segments 有锁的原因,

是因为一张表发生大量的数据变动,为了防止数据不一致,ba_segments 会从undo 获取数据,这样造成锁,而undo 因为该表的dml 没有提交,所以导致查询也被锁住了。开始通过下面的语句分析具体是哪个锁了:

SELECT LPAD(' ',5*(LEVEL-1))||S."USERNAME" , LPAD(' ',5*(LEVEL-1))||S."INST_ID"||','||S."SID" , S."SERIAL#" , S."SQL_ID", S."ROW_WAIT_OBJ#", S."WAIT_CLASS", S."EVENT", S."P1", S."P2", S."P3", S."SECONDS_IN_WAIT", s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION" FROM GV$SESSION S WHERE S."BLOCKING_SESSION" IS NOT NULL OR (S."INST_ID"||','||S."SID") IN(SELECT DISTINCT BLOCKING_INSTANCE||','||BLOCKING_SESSION FROM GV$SESSION) START WITH (s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION") = ',' CONNECT BY PRIOR (S."INST_ID"||','||S."SID") = (s."BLOCKING_INSTANCE"||','||s."BLOCKING_SESSION");

把大致的锁的语句发给应用方协助处理,应用方很容易的查出确实有锁并处理了,最后我的查询语句基本上10秒内就能输出结果。

总结:

1 数据量比较大的库要定期重新分析统计信息

2 注意锁,业务不正常肯定也会影响到系统表的性能

如果觉得《ORACLE 11G 查询DBA_SEGMENTS 慢的问题》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。