v$lock查询慢原来是MERGE JOIN CARTESIAN

查询v$LOCK视图耗时四十多秒

 

 

 执行计划如下:

 

 

 出现了MERGE JOIN CARTESIAN ,难怪慢。

exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KSUSE');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KSQRS');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KDNSSF');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KSQEQ');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTADM');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTATRFIL');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTATRFSL');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTATL');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTSTUSC');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTSTUSS');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTSTUSG');
exec dbms_stats.gather_table_stats(OWNNAME=>'SYS',tabname=>'X$KTCXB');

收集统计信息后再次执行还是慢,耗时是一样的,执行计划也还是一样,那就禁止merge join cartesian。

禁止执行 merge join cartesian,可以在系统级别设置隐含参数_optimizer_mjc_enabled=false;

alter system set "_optimizer_mjc_enabled" = false;

也可以在SESSION级别设置_optimizer_mjc_enabled=false;

alter session set "_optimizer_mjc_enabled" = false;

还可以在单个SQL级别使用HINT来禁止,/*+ OPT_PARAM('_optimizer_mjc_enabled','false') */。

select */*+ OPT_PARAM('_optimizer_mjc_enabled','false')*/ from v$lock;

 

加上hint后就正常了。

 

 

 

 

 

 

 

 

posted @ 2020-12-17 17:39  尘世间一个迷途小书童  阅读(665)  评论(1编辑  收藏  举报