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