开发的同事发来一条语句,让我帮忙查看下ods和源端的结果是否一致。因为一下执行没出来,问开发人员,这个语句要跑2-3分钟。 因为他们是从本地用dblink连到ods的,我这里把dblink去掉直接从ods查看执行计划。 SELECT XSY_CODE,--发展销售员编码 SLY_CODE,--受理销售员编码 XSD_CODE,--销售点编码 DZS_CODE,--店中商编码 JYZT_CODE--销售员所属经营主体编码 FROM (select /*+parallel(a,10) parallel(b,10) parallel(c,10) parallel(d,10)*/a.subs_id,c.serv_id,b.action_id,d.action_type,a.stat,a.stat_date from crm_gz.tb_ba_subscription_hist a, crm_gz.tb_ba_action_hist b, crm_gz.tb_ba_serv_hist c, crm_gz.tb_pm_action d where a.subs_id=b.subs_id and a.subs_id=c.subs_id and b.action_id=d.action_id and d.city_id='200' and a.stat='S0C') a, (select * from crm_gz.tb_ba_channelstaff where modi_date>=to_date('20141123','yyyymmdd')) b WHERE a.subs_id=b.subs_id(+) and a.stat_date>=to_date('20141123','yyyymmdd') and ((a.action_type='NEW' and a.action_id not in(14030,14266,7021)) or a.action_id in(14099,14260,6448)) AND SERV_ID in ('3751990561', '3751991941', '3751992281', '3751992431', '3751992831', '3751994541', '3751994561', '3753633921', '3753633981', '3753634021', '3753634041', '3753634111', '3753634271', '3753622431', '3753644141', '3753645051', '3753645261', '3753647021', '3745498320', '3751978420', '3751978950'); --于是看下执行计划 ----------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | ----------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 232 | 296 (0)| 00:00:05 | | | |* 1 | TABLE ACCESS BY LOCAL INDEX ROWID | TB_BA_SERV_HIST | 1 | 15 | 79 (0)| 00:00:02 | | | | 2 | NESTED LOOPS | | 2 | 232 | 296 (0)| 00:00:05 | | | | 3 | NESTED LOOPS OUTER | | 2 | 202 | 139 (0)| 00:00:02 | | | | 4 | NESTED LOOPS | | 2 | 98 | 136 (0)| 00:00:02 | | | | 5 | NESTED LOOPS | | 12 | 396 | 124 (0)| 00:00:02 | | | | 6 | PARTITION RANGE ALL | | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | | 7 | TABLE ACCESS BY LOCAL INDEX ROWID| ORDER_ITEM_HIST | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | |* 8 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | | 79 (0)| 00:00:02 | 1 | 39 | | 9 | TABLE ACCESS BY INDEX ROWID | TB_BA_ACTION_HIST | 1 | 13 | 3 (0)| 00:00:01 | | | |* 10 | INDEX RANGE SCAN | IX_BA_ACT_SUBSID_HIST | 1 | | 2 (0)| 00:00:01 | | | |* 11 | TABLE ACCESS BY INDEX ROWID | TB_PM_ACTION | 1 | 16 | 1 (0)| 00:00:01 | | | |* 12 | INDEX UNIQUE SCAN | PK_PM_ACTION | 1 | | 0 (0)| 00:00:01 | | | |* 13 | TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF | 1 | 52 | 2 (0)| 00:00:01 | | | |* 14 | INDEX UNIQUE SCAN | PK_CHANNELSTAFF_SUBS_ID | 1 | | 1 (0)| 00:00:01 | | | | 15 | PARTITION RANGE ALL | | 1 | | 78 (0)| 00:00:02 | 1 | 39 | |* 16 | INDEX RANGE SCAN | IX_BA_SERVSUBSID_HIST | 1 | | 78 (0)| 00:00:02 | 1 | 39 | ----------------------------------------------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("C"."SERV_ID"=3745498320 OR "C"."SERV_ID"=3751978420 OR "C"."SERV_ID"=3751978950 OR "C"."SERV_ID"=3751990561 OR "C"."SERV_ID"=3751991941 OR "C"."SERV_ID"=3751992281 OR "C"."SERV_ID"=3751992431 OR "C"."SERV_ID"=3751992831 OR "C"."SERV_ID"=3751994541 OR "C"."SERV_ID"=3751994561 OR "C"."SERV_ID"=3753622431 OR "C"."SERV_ID"=3753633921 OR "C"."SERV_ID"=3753633981 OR "C"."SERV_ID"=3753634021 OR "C"."SERV_ID"=3753634041 OR "C"."SERV_ID"=3753634111 OR "C"."SERV_ID"=3753634271 OR "C"."SERV_ID"=3753644141 OR "C"."SERV_ID"=3753645051 OR "C"."SERV_ID"=3753645261 OR "C"."SERV_ID"=3753647021) 8 - access("STAT"='S0C' AND "STATUS_DATE">=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 10 - access("ORDER_ITEM_ID"="B"."SUBS_ID") 11 - filter("D"."ACTION_TYPE"='NEW' AND "B"."ACTION_ID"<>14030 AND "B"."ACTION_ID"<>14266 AND "B"."ACTION_ID"<>7021 OR "B"."ACTION_ID"=6448 OR "B"."ACTION_ID"=14099 OR "B"."ACTION_ID"=14260) 12 - access("B"."ACTION_ID"="D"."ACTION_ID" AND "D"."CITY_ID"='200') 13 - filter("MODI_DATE"(+)>=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 14 - access("ORDER_ITEM_ID"="TB_BA_CHANNELSTAFF"."SUBS_ID"(+)) 16 - access("ORDER_ITEM_ID"="C"."SUBS_ID") --再查下相关的对象情况 ......getting segment size...... OWNER SEGMENT_NAME SEGMENT_TYPE Size(Mb) -------------------- ------------------------------ -------------------- ---------- CRM2_PUB PK_PM_ACTION INDEX 3 CRM_GZ PK_CHANNELSTAFF_SUBS_ID INDEX 1993 CRM_GZ IX_BA_ACT_SUBSID_HIST INDEX 8644.5 CRM_GZ IX_BA_SERVSUBSID_HIST INDEX PARTITION 3779.75 CRM_GZ IXH_ORDERITEM_STATDATE INDEX PARTITION 7927.5625 CRM2_PUB TB_PM_ACTION TABLE 34 CRM_GZ TB_BA_CHANNELSTAFF TABLE 9961 CRM_GZ TB_BA_ACTION_HIST TABLE 29305 CRM_GZ TB_BA_SERV_HIST TABLE PARTITION 30768.25 CRM_GZ ORDER_ITEM_HIST TABLE PARTITION 58503.625 10 rows selected. Elapsed: 00:00:00.34 ......getting table infomation...... OWNER TABLE_NAME Size(Mb) PAR DEGREE NUM_ROWS GLO STATS GATHER TIME -------------------- ------------------------------ ---------- --- ---------- ---------- --- ------------------ CRM2_PUB *TB_PM_ACTION 26.6463165 NO 1 120434 YES 78.6312153 CRM2_PUB TB_PM_ACTION 26.6463165 NO 1 120434 YES 78.6312153 CRM_GZ *TB_BA_CHANNELSTAFF 7909.30271 NO 1 94244375 YES 23.6510532 CRM_GZ TB_BA_CHANNELSTAFF 7909.30271 NO 1 94244375 YES 23.6510532 CRM_GZ *TB_BA_SERV_HIST 23083.6036 YES 1 129438036 YES 78.5309028 CRM_GZ TB_BA_SERV_HIST 23083.6036 YES 1 129438036 YES 78.5309028 CRM_GZ *ORDER_ITEM_HIST 43997.6631 YES 1 212603196 YES 78.6465972 CRM_GZ ORDER_ITEM_HIST 43997.6631 YES 1 212603196 YES 78.6465972 CRM_GZ *TB_BA_ACTION_HIST 22367.6905 NO 1 279216946 YES 78.6315972 CRM_GZ TB_BA_ACTION_HIST 22367.6905 NO 1 279216946 YES 78.6315972 10 rows selected. Elapsed: 00:00:00.12 ......getting index infomation...... OWNER INDEX_NAME TABLE_NAME PAR UNIQUENES DEGREE INDEX_TYPE LEAF_BLOCKS BLEVEL CLUSTERING_FACTOR -------------------- ------------------------------ ------------------------------ --- --------- ---------- ---------- ----------- ---------- ----------------- ----- CRM_GZ IX_BA_ACT_SUBSID_HIST TB_BA_ACTION_HIST NO NONUNIQUE 1 NORMAL 492002 2 220159998 100 CRM_GZ IX_BA_SERVSUBSID_HIST TB_BA_SERV_HIST YES NONUNIQUE 1 NORMAL 196468 2 97894132 100 CRM_GZ IXH_ORDERITEM_STATDATE ORDER_ITEM_HIST YES NONUNIQUE 1 NORMAL 433702 2 153506102 17.3428035 CRM_GZ PK_CHANNELSTAFF_SUBS_ID TB_BA_CHANNELSTAFF NO UNIQUE 1 NORMAL 116755 2 83251565 100 CRM2_PUB PK_PM_ACTION TB_PM_ACTION NO UNIQUE 1 NORMAL 155 1 98209 100 5 rows selected. 其实,在olap中走3分钟是还能接受的,但是看了一下执行计划,觉得还能再进一步优化。很明显,这里的hint没有起作用 /*+parallel(a,10) parallel(b,10) parallel(c,10) parallel(d,10)*/,执行计划并不走并行。其实,走并行使错的。 因为下面3个表非常大,加起来有100G,走再多的并行也难在3分钟内扫描完。 OWNER SEGMENT_NAME SEGMENT_TYPE Size(Mb) -------------------- ------------------------------ -------------------- ---------- CRM_GZ TB_BA_ACTION_HIST TABLE 29305 CRM_GZ TB_BA_SERV_HIST TABLE PARTITION 30768.25 CRM_GZ ORDER_ITEM_HIST TABLE PARTITION 58503.625 |* 8 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | 执行计划中第8歩有疑问,cbo认为只返回12行。直接手工算下,果然有问题。 select count(*) from CRM_GZ.ORDER_ITEM_HIST where "STAT"='S0C' AND "STATUS_DATE">=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss'); --220647 实际上返回220647行。那么问题来了,这里明显要走hash才是最优化的。这里有好几种方法都有效。 --方法1:/*+leading(c)*/ SELECT <span style="color:#ff0000;">/*+leading(c)*/</span>XSY_CODE,--发展销售员编码 SLY_CODE,--受理销售员编码 XSD_CODE,--销售点编码 DZS_CODE,--店中商编码 JYZT_CODE--销售员所属经营主体编码 FROM (select a.subs_id,c.serv_id,b.action_id,d.action_type,a.stat,a.stat_date from crm_gz.tb_ba_subscription_hist a, crm_gz.tb_ba_action_hist b, crm_gz.tb_ba_serv_hist c, crm_gz.tb_pm_action d where a.subs_id=b.subs_id and a.subs_id=c.subs_id and b.action_id=d.action_id and d.city_id='200' and a.stat='S0C') a, (select * from crm_gz.tb_ba_channelstaff where modi_date>=to_date('20141123','yyyymmdd')) b WHERE a.subs_id=b.subs_id(+) and a.stat_date>=to_date('20141123','yyyymmdd') and ((a.action_type='NEW' and a.action_id not in(14030,14266,7021)) or a.action_id in(14099,14260,6448)) AND SERV_ID in ('3751990561', '3751991941', '3751992281', '3751992431', '3751992831', '3751994541', '3751994561', '3753633921', '3753633981', '3753634021', '3753634041', '3753634111', '3753634271', '3753622431', '3753644141', '3753645051', '3753645261', '3753647021', '3745498320', '3751978420', '3751978950'); --执行计划: ----------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | ----------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2 | 232 | 325 (1)| 00:00:05 | | | | 1 | NESTED LOOPS OUTER | | 2 | 232 | 325 (1)| 00:00:05 | | | | 2 | NESTED LOOPS | | 2 | 128 | 322 (1)| 00:00:05 | | | | 3 | NESTED LOOPS | | 12 | 576 | 310 (1)| 00:00:05 | | | |* 4 | HASH JOIN | | 12 | 420 | 274 (1)| 00:00:04 | | | | 5 | PARTITION RANGE ALL | | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | | 6 | INLIST ITERATOR | | | | | | | | | 7 | TABLE ACCESS BY LOCAL INDEX ROWID| TB_BA_SERV_HIST | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | |* 8 | INDEX RANGE SCAN | IX_BA_SERVSERVID_HIST | 98 | | 100 (1)| 00:00:02 | 1 | 39 | | 9 | PARTITION RANGE ALL | | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | | 10 | TABLE ACCESS BY LOCAL INDEX ROWID | ORDER_ITEM_HIST | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | |* 11 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | | 79 (0)| 00:00:02 | 1 | 39 | | 12 | TABLE ACCESS BY INDEX ROWID | TB_BA_ACTION_HIST | 1 | 13 | 3 (0)| 00:00:01 | | | |* 13 | INDEX RANGE SCAN | IX_BA_ACT_SUBSID_HIST | 1 | | 2 (0)| 00:00:01 | | | |* 14 | TABLE ACCESS BY INDEX ROWID | TB_PM_ACTION | 1 | 16 | 1 (0)| 00:00:01 | | | |* 15 | INDEX UNIQUE SCAN | PK_PM_ACTION | 1 | | 0 (0)| 00:00:01 | | | |* 16 | TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF | 1 | 52 | 2 (0)| 00:00:01 | | | |* 17 | INDEX UNIQUE SCAN | PK_CHANNELSTAFF_SUBS_ID | 1 | | 1 (0)| 00:00:01 | | | ----------------------------------------------------------------------------------------------------------------------------------- --方法2:/*+cardinality(a,220647)*/ SELECT XSY_CODE,--发展销售员编码 SLY_CODE,--受理销售员编码 XSD_CODE,--销售点编码 DZS_CODE,--店中商编码 JYZT_CODE--销售员所属经营主体编码 FROM (select <span style="color:#ff0000;">/*+cardinality(a,220647)*/</span>a.subs_id,c.serv_id,b.action_id,d.action_type,a.stat,a.stat_date from crm_gz.tb_ba_subscription_hist a, crm_gz.tb_ba_action_hist b, crm_gz.tb_ba_serv_hist c, crm_gz.tb_pm_action d where a.subs_id=b.subs_id and a.subs_id=c.subs_id and b.action_id=d.action_id and d.city_id='200' and a.stat='S0C') a, (select * from crm_gz.tb_ba_channelstaff where modi_date>=to_date('20141123','yyyymmdd')) b WHERE a.subs_id=b.subs_id(+) and a.stat_date>=to_date('20141123','yyyymmdd') and ((a.action_type='NEW' and a.action_id not in(14030,14266,7021)) or a.action_id in(14099,14260,6448)) AND SERV_ID in ('3751990561', '3751991941', '3751992281', '3751992431', '3751992831', '3751994541', '3751994561', '3753633921', '3753633981', '3753634021', '3753634041', '3753634111', '3753634271', '3753622431', '3753644141', '3753645051', '3753645261', '3753647021', '3745498320', '3751978420', '3751978950'); --执行计划: ----------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | ----------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 14 | 1624 | 679 (1)| 00:00:10 | | | |* 1 | HASH JOIN OUTER | | 14 | 1624 | 679 (1)| 00:00:10 | | | | 2 | NESTED LOOPS | | 14 | 896 | 667 (1)| 00:00:10 | | | | 3 | NESTED LOOPS | | 98 | 4704 | 569 (1)| 00:00:08 | | | |* 4 | HASH JOIN | | 98 | 3430 | 275 (2)| 00:00:04 | | | | 5 | PARTITION RANGE ALL | | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | | 6 | INLIST ITERATOR | | | | | | | | | 7 | TABLE ACCESS BY LOCAL INDEX ROWID| TB_BA_SERV_HIST | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | |* 8 | INDEX RANGE SCAN | IX_BA_SERVSERVID_HIST | 98 | | 100 (1)| 00:00:02 | 1 | 39 | | 9 | PARTITION RANGE ALL | | 220K| 4309K| 88 (0)| 00:00:02 | 1 | 39 | | 10 | TABLE ACCESS BY LOCAL INDEX ROWID | ORDER_ITEM_HIST | 220K| 4309K| 88 (0)| 00:00:02 | 1 | 39 | |* 11 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | | 79 (0)| 00:00:02 | 1 | 39 | | 12 | TABLE ACCESS BY INDEX ROWID | TB_BA_ACTION_HIST | 1 | 13 | 3 (0)| 00:00:01 | | | |* 13 | INDEX RANGE SCAN | IX_BA_ACT_SUBSID_HIST | 1 | | 2 (0)| 00:00:01 | | | |* 14 | TABLE ACCESS BY INDEX ROWID | TB_PM_ACTION | 1 | 16 | 1 (0)| 00:00:01 | | | |* 15 | INDEX UNIQUE SCAN | PK_PM_ACTION | 1 | | 0 (0)| 00:00:01 | | | | 16 | TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF | 19 | 988 | 11 (0)| 00:00:01 | | | |* 17 | INDEX RANGE SCAN | IDX_BA_CHANNELSTAFF_MODI_DATE | 19 | | 3 (0)| 00:00:01 | | | ----------------------------------------------------------------------------------------------------------------------------------------- <span style="color:#ff0000;">于是,将方法告诉开发人员,结果本地执行还是很慢,查看执行计划,因为dblink的关系,用上面的2种方法都没生效。 那怎么办呢,用了各种hint都没法让他走hash,于是想到了查询块。 </span> --原来的执行计划和outline信息: PLAN_TABLE_OUTPUT ----------------------------------------------------------------------------------------------------------------------------------------------------- Plan hash value: 931544562 -------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | Inst | -------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT REMOTE | | 2 | 232 | 296 (0)| 00:00:05 | | | | |* 1 | TABLE ACCESS BY LOCAL INDEX ROWID | TB_BA_SERV_HIST | 1 | 15 | 79 (0)| 00:00:02 | | | GZODSD | | 2 | NESTED LOOPS | | 2 | 232 | 296 (0)| 00:00:05 | | | | | 3 | NESTED LOOPS OUTER | | 2 | 202 | 139 (0)| 00:00:02 | | | | | 4 | NESTED LOOPS | | 2 | 98 | 136 (0)| 00:00:02 | | | | | 5 | NESTED LOOPS | | 12 | 396 | 124 (0)| 00:00:02 | | | | | 6 | PARTITION RANGE ALL | | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | | | 7 | TABLE ACCESS BY LOCAL INDEX ROWID| ORDER_ITEM_HIST | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | GZODSD | |* 8 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | | 79 (0)| 00:00:02 | 1 | 39 | GZODSD | | 9 | TABLE ACCESS BY INDEX ROWID | TB_BA_ACTION_HIST | 1 | 13 | 3 (0)| 00:00:01 | | | GZODSD | |* 10 | INDEX RANGE SCAN | IX_BA_ACT_SUBSID_HIST | 1 | | 2 (0)| 00:00:01 | | | GZODSD | |* 11 | TABLE ACCESS BY INDEX ROWID | TB_PM_ACTION | 1 | 16 | 1 (0)| 00:00:01 | | | GZODSD | |* 12 | INDEX UNIQUE SCAN | PK_PM_ACTION | 1 | | 0 (0)| 00:00:01 | | | GZODSD | |* 13 | TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF | 1 | 52 | 2 (0)| 00:00:01 | | | GZODSD | |* 14 | INDEX UNIQUE SCAN | PK_CHANNELSTAFF_SUBS_ID | 1 | | 1 (0)| 00:00:01 | | | GZODSD | | 15 | PARTITION RANGE ALL | | 1 | | 78 (0)| 00:00:02 | 1 | 39 | | |* 16 | INDEX RANGE SCAN | IX_BA_SERVSUBSID_HIST | 1 | | 78 (0)| 00:00:02 | 1 | 39 | GZODSD | -------------------------------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$F5BB74E1 / A3@SEL$1 7 - SEL$F5BB74E1 / ORDER_ITEM_HIST@SEL$2 8 - SEL$F5BB74E1 / ORDER_ITEM_HIST@SEL$2 9 - SEL$F5BB74E1 / A4@SEL$1 10 - SEL$F5BB74E1 / A4@SEL$1 11 - SEL$F5BB74E1 / A2@SEL$1 12 - SEL$F5BB74E1 / A2@SEL$1 13 - SEL$F5BB74E1 / A1@SEL$1 14 - SEL$F5BB74E1 / A1@SEL$1 16 - SEL$F5BB74E1 / A3@SEL$1 Outline Data ------------- /*+ BEGIN_OUTLINE_DATA USE_NL(@"SEL$F5BB74E1" "A3"@"SEL$1") USE_NL(@"SEL$F5BB74E1" "A1"@"SEL$1") USE_NL(@"SEL$F5BB74E1" "A2"@"SEL$1") USE_NL(@"SEL$F5BB74E1" "A4"@"SEL$1") LEADING(@"SEL$F5BB74E1" "ORDER_ITEM_HIST"@"SEL$2" "A4"@"SEL$1" "A2"@"SEL$1" "A1"@"SEL$1" "A3"@"SEL$1") INDEX(@"SEL$F5BB74E1" "A3"@"SEL$1" ("TB_BA_SERV_HIST"."SUBS_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A1"@"SEL$1" ("TB_BA_CHANNELSTAFF"."SUBS_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A2"@"SEL$1" ("TB_PM_ACTION"."ACTION_ID" "TB_PM_ACTION"."CITY_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A4"@"SEL$1" ("TB_BA_ACTION_HIST"."SUBS_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "ORDER_ITEM_HIST"@"SEL$2" ("ORDER_ITEM_HIST"."STAT" "ORDER_ITEM_HIST"."STATUS_DATE")) OUTLINE(@"SEL$2") OUTLINE(@"SEL$1") MERGE(@"SEL$2") OUTLINE_LEAF(@"SEL$F5BB74E1") ALL_ROWS OPTIMIZER_FEATURES_ENABLE('10.2.0.4') IGNORE_OPTIM_EMBEDDED_HINTS END_OUTLINE_DATA */ Predicate Information (identified by operation id): --------------------------------------------------- 1 - filter("A3"."SERV_ID"=3745498320 OR "A3"."SERV_ID"=3751978420 OR "A3"."SERV_ID"=3751978950 OR "A3"."SERV_ID"=3751990561 OR "A3"."SERV_ID"=3751991941 OR "A3"."SERV_ID"=3751992281 OR "A3"."SERV_ID"=3751992431 OR "A3"."SERV_ID"=3751992831 OR "A3"."SERV_ID"=3751994541 OR "A3"."SERV_ID"=3751994561 OR "A3"."SERV_ID"=3753622431 OR "A3"."SERV_ID"=3753633921 OR "A3"."SERV_ID"=3753633981 OR "A3"."SERV_ID"=3753634021 OR "A3"."SERV_ID"=3753634041 OR "A3"."SERV_ID"=3753634111 OR "A3"."SERV_ID"=3753634271 OR "A3"."SERV_ID"=3753644141 OR "A3"."SERV_ID"=3753645051 OR "A3"."SERV_ID"=3753645261 OR "A3"."SERV_ID"=3753647021) 8 - access("STAT"='S0C' AND "STATUS_DATE">=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 10 - access("ORDER_ITEM_ID"="A4"."SUBS_ID") 11 - filter("A2"."ACTION_TYPE"='NEW' AND "A4"."ACTION_ID"<>14030 AND "A4"."ACTION_ID"<>14266 AND "A4"."ACTION_ID"<>7021 OR "A4"."ACTION_ID"=6448 OR "A4"."ACTION_ID"=14099 OR "A4"."ACTION_ID"=14260) 12 - access("A4"."ACTION_ID"="A2"."ACTION_ID" AND "A2"."CITY_ID"='200') 13 - filter("A1"."MODI_DATE"(+)>=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 14 - access("ORDER_ITEM_ID"="A1"."SUBS_ID"(+)) 16 - access("ORDER_ITEM_ID"="A3"."SUBS_ID") 认真观察了下qb name和outline,因为a表是视图,指向ORDER_ITEM_HIST。很显然a表的qb name就是ORDER_ITEM_HIST@SEL$2 c表是执行计划id=1的地方,对应的qb name是1 - SEL$F5BB74E1 / A3@SEL$1,因此可用下面的方法优化。 --优化后: SELECT <span style="color:#ff0000;">/*+leading(A3@SEL$1,ORDER_ITEM_HIST@SEL$2)*/</span> XSY_CODE,--发展销售员编码 SLY_CODE,--受理销售员编码 XSD_CODE,--销售点编码 DZS_CODE,--店中商编码 JYZT_CODE--销售员所属经营主体编码 FROM (select a.subs_id,c.serv_id,b.action_id,d.action_type,a.stat,a.stat_date from crm_gz.tb_ba_subscription_hist@togzodsd a, crm_gz.tb_ba_action_hist@togzodsd b, crm_gz.tb_ba_serv_hist@togzodsd c, crm_gz.tb_pm_action@togzodsd d where a.subs_id=b.subs_id and a.subs_id=c.subs_id and b.action_id=d.action_id and d.city_id='200' and a.stat='S0C') a, (select * from crm_gz.tb_ba_channelstaff@togzodsd where modi_date>=to_date('20141123','yyyymmdd')) b WHERE a.subs_id=b.subs_id(+) and a.stat_date>=to_date('20141123','yyyymmdd') and ((a.action_type='NEW' and a.action_id not in(14030,14266,7021)) or a.action_id in(14099,14260,6448)) AND SERV_ID in ('3751990561', '3751991941', '3751992281', '3751992431', '3751992831', '3751994541', '3751994561', '3753633921', '3753633981', '3753634021', '3753634041', '3753634111', '3753634271', '3753622431', '3753644141', '3753645051', '3753645261', '3753647021', '3745498320', '3751978420', '3751978950'); --执行计划和outline -------------------------------------------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop | Inst | -------------------------------------------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT REMOTE | | 2 | 232 | 325 (1)| 00:00:05 | | | | | 1 | NESTED LOOPS OUTER | | 2 | 232 | 325 (1)| 00:00:05 | | | | | 2 | NESTED LOOPS | | 2 | 128 | 322 (1)| 00:00:05 | | | | | 3 | NESTED LOOPS | | 12 | 576 | 310 (1)| 00:00:05 | | | | |* 4 | HASH JOIN | | 12 | 420 | 274 (1)| 00:00:04 | | | | | 5 | PARTITION RANGE ALL | | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | | | 6 | INLIST ITERATOR | | | | | | | | | | 7 | TABLE ACCESS BY LOCAL INDEX ROWID| TB_BA_SERV_HIST | 98 | 1470 | 185 (1)| 00:00:03 | 1 | 39 | GZODSD | |* 8 | INDEX RANGE SCAN | IX_BA_SERVSERVID_HIST | 98 | | 100 (1)| 00:00:02 | 1 | 39 | GZODSD | | 9 | PARTITION RANGE ALL | | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | | | 10 | TABLE ACCESS BY LOCAL INDEX ROWID | ORDER_ITEM_HIST | 12 | 240 | 88 (0)| 00:00:02 | 1 | 39 | GZODSD | |* 11 | INDEX RANGE SCAN | IXH_ORDERITEM_STATDATE | 12 | | 79 (0)| 00:00:02 | 1 | 39 | GZODSD | | 12 | TABLE ACCESS BY INDEX ROWID | TB_BA_ACTION_HIST | 1 | 13 | 3 (0)| 00:00:01 | | | GZODSD | |* 13 | INDEX RANGE SCAN | IX_BA_ACT_SUBSID_HIST | 1 | | 2 (0)| 00:00:01 | | | GZODSD | |* 14 | TABLE ACCESS BY INDEX ROWID | TB_PM_ACTION | 1 | 16 | 1 (0)| 00:00:01 | | | GZODSD | |* 15 | INDEX UNIQUE SCAN | PK_PM_ACTION | 1 | | 0 (0)| 00:00:01 | | | GZODSD | |* 16 | TABLE ACCESS BY INDEX ROWID | TB_BA_CHANNELSTAFF | 1 | 52 | 2 (0)| 00:00:01 | | | GZODSD | |* 17 | INDEX UNIQUE SCAN | PK_CHANNELSTAFF_SUBS_ID | 1 | | 1 (0)| 00:00:01 | | | GZODSD | -------------------------------------------------------------------------------------------------------------------------------------------- Query Block Name / Object Alias (identified by operation id): ------------------------------------------------------------- 1 - SEL$F5BB74E1 7 - SEL$F5BB74E1 / A3@SEL$1 8 - SEL$F5BB74E1 / A3@SEL$1 10 - SEL$F5BB74E1 / ORDER_ITEM_HIST@SEL$2 11 - SEL$F5BB74E1 / ORDER_ITEM_HIST@SEL$2 12 - SEL$F5BB74E1 / A4@SEL$1 13 - SEL$F5BB74E1 / A4@SEL$1 14 - SEL$F5BB74E1 / A2@SEL$1 15 - SEL$F5BB74E1 / A2@SEL$1 16 - SEL$F5BB74E1 / A1@SEL$1 17 - SEL$F5BB74E1 / A1@SEL$1 Outline Data ------------- /*+ BEGIN_OUTLINE_DATA USE_NL(@"SEL$F5BB74E1" "A1"@"SEL$1") USE_NL(@"SEL$F5BB74E1" "A2"@"SEL$1") USE_NL(@"SEL$F5BB74E1" "A4"@"SEL$1") USE_HASH(@"SEL$F5BB74E1" "ORDER_ITEM_HIST"@"SEL$2") LEADING(@"SEL$F5BB74E1" "A3"@"SEL$1" "ORDER_ITEM_HIST"@"SEL$2" "A4"@"SEL$1" "A2"@"SEL$1" "A1"@"SEL$1") INDEX_RS_ASC(@"SEL$F5BB74E1" "A1"@"SEL$1" ("TB_BA_CHANNELSTAFF"."SUBS_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A2"@"SEL$1" ("TB_PM_ACTION"."ACTION_ID" "TB_PM_ACTION"."CITY_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A4"@"SEL$1" ("TB_BA_ACTION_HIST"."SUBS_ID")) INDEX_RS_ASC(@"SEL$F5BB74E1" "ORDER_ITEM_HIST"@"SEL$2" ("ORDER_ITEM_HIST"."STAT" "ORDER_ITEM_HIST"."STATUS_DATE")) INDEX_RS_ASC(@"SEL$F5BB74E1" "A3"@"SEL$1" ("TB_BA_SERV_HIST"."SERV_ID")) OUTLINE(@"SEL$2") OUTLINE(@"SEL$1") MERGE(@"SEL$2") OUTLINE_LEAF(@"SEL$F5BB74E1") ALL_ROWS OPTIMIZER_FEATURES_ENABLE('10.2.0.4') IGNORE_OPTIM_EMBEDDED_HINTS END_OUTLINE_DATA */ Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("ORDER_ITEM_ID"="A3"."SUBS_ID") 8 - access("A3"."SERV_ID"=3745498320 OR "A3"."SERV_ID"=3751978420 OR "A3"."SERV_ID"=3751978950 OR "A3"."SERV_ID"=3751990561 OR "A3"."SERV_ID"=3751991941 OR "A3"."SERV_ID"=3751992281 OR "A3"."SERV_ID"=3751992431 OR "A3"."SERV_ID"=3751992831 OR "A3"."SERV_ID"=3751994541 OR "A3"."SERV_ID"=3751994561 OR "A3"."SERV_ID"=3753622431 OR "A3"."SERV_ID"=3753633921 OR "A3"."SERV_ID"=3753633981 OR "A3"."SERV_ID"=3753634021 OR "A3"."SERV_ID"=3753634041 OR "A3"."SERV_ID"=3753634111 OR "A3"."SERV_ID"=3753634271 OR "A3"."SERV_ID"=3753644141 OR "A3"."SERV_ID"=3753645051 OR "A3"."SERV_ID"=3753645261 OR "A3"."SERV_ID"=3753647021) 11 - access("STAT"='S0C' AND "STATUS_DATE">=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 13 - access("ORDER_ITEM_ID"="A4"."SUBS_ID") 14 - filter("A2"."ACTION_TYPE"='NEW' AND "A4"."ACTION_ID"<>14030 AND "A4"."ACTION_ID"<>14266 AND "A4"."ACTION_ID"<>7021 OR "A4"."ACTION_ID"=6448 OR "A4"."ACTION_ID"=14099 OR "A4"."ACTION_ID"=14260) 15 - access("A4"."ACTION_ID"="A2"."ACTION_ID" AND "A2"."CITY_ID"='200') 16 - filter("A1"."MODI_DATE"(+)>=TO_DATE(' 2014-11-23 00:00:00', 'syyyy-mm-dd hh24:mi:ss')) 17 - access("ORDER_ITEM_ID"="A1"."SUBS_ID"(+)) Note ----- - fully remote statement 优化前3分钟多才出结果,优化后27秒出结果了。至此,已经没有必要优化了。
原文地址:http://blog.csdn.net/gdmzlhj1/article/details/41443547