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 没有提交,所以导致查询也被锁住了。开始通过下面的语句分析具体是哪个锁了: