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后就正常了。

 

原文地址:https://www.cnblogs.com/historynote/p/14150899.html