filter造成的性能问题

      filter这个词总让人很费解,它下一级可以挂 一个子节点,二个节点,三个子节点...。

     挂一个子节点意思过滤,如对全表进行扫描后,按照条件过滤,丢弃不满足条件的数据。

     挂二个子节点类似是nest loop。

     挂三个子节点类似1和2做nest loop,结果集再与3做nest loop(这个是我推测的)。

SQL> set linesize 300
SQL> set timing on
SQL> set autotrace traceonly
SQL> SELECT count(DISTINCT BI.RISK_BASE_ID) count
  2    FROM GG_RISK_BASE_INFO           BI,
  3         GG_TASK_FORM_CLASSTEMPLATE   FC,
  4         GG_TASK_FORM_TEMPLATEVERSION FT,
  5         GG_TASK_FORM_RELATIONTEMPLAT FR,
  6         GG_TASK_WORK_SHEET           WS,
  7         GG_TASK_FORM_EXETASKRECORD   FE
  8   WHERE FC.RISK_BASE_ID = BI.RISK_BASE_ID
  9     and FT.TEMPLATE_FID = FC.TEMPLATE_ID
 10     and FR.TEMPLATE_VERSION_ID = FT.TEMPLATE_VERSION_ID
 11     and FR.OBJECT_ID = WS.WORK_SHEET_ID
 12     and FE.REL_TEMP_ID = FR.REL_TEMP_ID
 13     and FR.REL_OBJECT_TYPE = '1'
 14     AND FE.TASK_START_TIME > BI.RISK_ASSESS_TIME
 15     and (exists
 16          (SELECT 1
 17             FROM GG_TASK_FORM_RISK_CTL_LOG CL
 18            where CL.TEMPLATE_VERSION_ID = FT.TEMPLATE_VERSION_ID) or exists
 19          (SELECT 1
 20             FROM GG_TASK_FORM_NEW_RISK_INFO RI
 21            where RI.REL_TEMP_ID = FR.REL_TEMP_ID));


已用时间:  00: 04: 10.36
执行计划

filter造成的性能问题_第1张图片

数据规模:
select count(1) from GG_RISK_BASE_INFO; --2828 
select count(1) from GG_TASK_FORM_CLASSTEMPLATE;  --5600 
select count(1) from GG_TASK_FORM_TEMPLATEVERSION;  --7646 
select count(1) from GG_TASK_FORM_EXETASKRECORD;  --33064 
select count(1) from GG_TASK_FORM_RELATIONTEMPLAT;  --67319  
select count(1) from GG_TASK_FORM_RISK_CTL_LOG;--5210
select count(1) from GG_TASK_FORM_NEW_RISK_INFO;--27831


CREATE INDEX IDX_PTNRI_REL_TEMP_ID ON GG_TASK_FORM_NEW_RISK_INFO(REL_TEMP_ID);
CREATE INDEX IDX_PTFRCL_REL_T_V_ID ON GG_TASK_FORM_RISK_CTL_LOG(TEMPLATE_VERSION_ID);

filter造成的性能问题_第2张图片


你可能感兴趣的:(filter造成的性能问题)