19.no_unnest 子查询不展开的优化案例

1.优化前SQL

select count(1)
  from (SELECT distinct rp.registNo,
                        rp.policyNo,
                        rp.plancode,
                        rp.riskcode,
                        rp.itemno,
                        rp.endorseqno,
                        gcrm.damagestartdate,
                        gcrm.damageaddress,
                        gcrm.damagecode,
                        gcrm.damagename,
                        gcrm.reporttype,
                        gcrm.reportorname,
                        gcrm.reportorphonenumber,
                        gcrm.reportdate,
                        gcrm.operatorCode,
                        rp.insuredName,
                        gcrm.canceldate,
                        ggr.riskclass,
                        ggr.classcname,
                        ggc.companycode,
                        ggc.companyCName,
                        (SELECT round(c.sumEstLoss, 2) 
                           FROM Gcclaimmain c
                          WHERE c.registNo = rp.registNo
                            AND c.policyNo = rp.policyNo
                            AND c.planCode = rp.planCode
                            AND c.riskCode = rp.riskCode
                            AND c.itemNo = rp.itemNo
                            AND ROWNUM = 1) sumEstLoss,
                        (SELECT round(c.sumPaid, 2)
                           FROM GcClaimMain c
                          WHERE c.registNo = rp.registNo
                            AND c.policyNo = rp.policyNo
                            AND c.planCode = rp.planCode
                            AND c.riskCode = rp.riskCode
                            AND c.itemNo = rp.itemNo
                            AND ROWNUM = 1) sumPaid,
                        gcrm.phonenumber,
                        ggcd.codecode,
                        ggcd.codecname
          FROM GcRegistPolicy rp
         INNER JOIN gcregistmain gcrm
            on (gcrm.registno = rp.registno)
         INNER JOIN ggriskclass ggr
            ON (ggr.riskclass = rp.riskclass)
         INNER JOIN GgCompany ggc
            ON (ggc.companycode = rp.companycode)
         INNER JOIN ggcode ggcd
            ON (ggcd.codecode = rp.channeldetailcode and
               ggcd.codetype = 'UnderWriteChannelTip')
         WHERE 1 = 1
           and substr(rp.riskcode, 0, 2) not in ('08', '09', '16')
           and (rp.autorelationpolicyflag is null or
               rp.autorelationpolicyflag <> '1')
           and gcrm.status = '4'
           and not exists
         (select 'x'
                  from gcclaimmain a
                 where rp.registNo = a.registNo
                   AND rp.policyNo = a.policyNo
                   AND rp.planCode = a.planCode
                   AND rp.riskCode = a.riskCode
                   AND rp.itemNo = a.itemNo
                   AND (a.endcasestatus in ('1', '3') or a.CaseType = '4')
		 )
           and not exists (select 'X'
                  from gccancellation a
                 where a.businesstype = 'regist'
                   and a.status <> '5'
                   and a.businessno = rp.registNo
                union
                select 'X'
                  from gccancellation a, gcclaimmain b
                 where a.businessno = b.claimno
                   and b.registNo = rp.registNo
                   and b.policyNo = rp.policyNo
                   and b.riskCode = rp.riskCode
                   and a.businesstype = 'claim'
                   and a.status <> '5')
           and not exists (select 'x'
                  from gcdelegatedetail del
                 where del.registno = rp.registno
                   and del.policyno = rp.policyno
                   and del.riskCode = rp.riskCode
               )
         order by gcrm.damagestartdate desc);

执行计划查看

--优化前 
Execution Plan
----------------------------------------------------------
Plan hash value: 3729601010

-------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation				  | Name		    | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT			  		|			    			|	  1 |	  2 | 13980   (1)| 00:02:48 |	    |	    |
|   1 |  SORT AGGREGATE 			  		|			    			|	  1 |	  2 |		 |	    |	    |	    |
|   2 |   VIEW					  			|			    			|	  1 |	  2 | 13980   (1)| 00:02:48 |	    |	    |
|*  3 |    COUNT STOPKEY			  		|			    			|	    |	    |		 |	    |	    |	    |
|*  4 |     TABLE ACCESS BY GLOBAL INDEX ROWID| GCCLAIMMAIN 			|	  1 |	 62 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|*  5 |      INDEX UNIQUE SCAN			  	| INDEX_CLAIM_UNIQUECLAIM 	|	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|*  6 |    COUNT STOPKEY			  		|			    			|	    |	    |		 |	    |	    |	    |
|*  7 |     TABLE ACCESS BY GLOBAL INDEX ROWID	  | GCCLAIMMAIN 	    |	  1 |	 62 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|*  8 |      INDEX UNIQUE SCAN			  	| INDEX_CLAIM_UNIQUECLAIM 	|	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|   9 |    HASH UNIQUE				  		|			    			|	  1 |	456 | 13980   (1)| 00:02:48 |	    |	    |
|* 10 |     FILTER				  			|			    			|	    |	    |		 |	    |	    |	    |
|  11 |      NESTED LOOPS ANTI			  	|			    			|	  1 |	456 | 13969   (1)| 00:02:48 |	    |	    |
|  12 |       NESTED LOOPS ANTI 		  	|			    			|	  1 |	394 | 13967   (1)| 00:02:48 |	    |	    |
|  13 |        NESTED LOOPS			  		|			    			|	  1 |	388 | 13957   (1)| 00:02:48 |	    |	    |
|  14 | 	NESTED LOOPS			  		|			    			|	  1 |	232 | 13955   (1)| 00:02:48 |	    |	    |
|  15 | 	 NESTED LOOPS			  		|			    			|	  1 |	178 | 13954   (1)| 00:02:48 |	    |	    |
|* 16 | 	  HASH JOIN			  			|			    			|	  1 |	164 | 13953   (1)| 00:02:48 |	    |	    |
|  17 | 	   TABLE ACCESS BY INDEX ROWID	  | GGCODE		    		|	 50 |  2500 |	 27   (0)| 00:00:01 |	    |	    |
|* 18 | 	    INDEX RANGE SCAN		  	| PK_GGCODE		    		|	 50 |	    |	  3   (0)| 00:00:01 |	    |	    |
|  19 | 	   PARTITION HASH ALL		  	|			    			|	117 | 13338 | 13926   (1)| 00:02:48 |	  1 |	  8 |
|* 20 | 	    TABLE ACCESS FULL		  	| GCREGISTPOLICY	   		|	117 | 13338 | 13926   (1)| 00:02:48 |	  1 |	  8 |
|  21 | 	  TABLE ACCESS BY INDEX ROWID	| GGRISKCLASS 	    		|	  1 |	 14 |	  1   (0)| 00:00:01 |	    |	    |
|* 22 | 	   INDEX UNIQUE SCAN		  	| PK_GGRISKCLASS	    	|	  1 |	    |	  0   (0)| 00:00:01 |	    |	    |
|  23 | 	 TABLE ACCESS BY INDEX ROWID	| GGCOMPANY		    		|	  1 |	 54 |	  1   (0)| 00:00:01 |	    |	    |
|* 24 | 	  INDEX UNIQUE SCAN		  		| PK_GGCOMPANY	    		|	  1 |	    |	  0   (0)| 00:00:01 |	    |	    |
|* 25 | 	TABLE ACCESS BY GLOBAL INDEX ROWID| GCREGISTMAIN	    	|	  1 |	156 |	  2   (0)| 00:00:01 | ROWID | ROWID |
|* 26 | 	 INDEX UNIQUE SCAN		  		| PK_GCREGISTMAIN	    	|	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
|  27 |        VIEW				  			| VW_SQ_1		    		|	  1 |	  6 |	 10  (20)| 00:00:01 |	    |	    |
|  28 | 	SORT UNIQUE			  			|			    			|	  2 |	202 |	 10  (20)| 00:00:01 |	    |	    |
|  29 | 	 UNION ALL PUSHED PREDICATE	  	|			    			|	    |	    |		     |	    |	    |	    |
|* 30 | 	  INDEX RANGE SCAN		  		| PK_DELEGATEDETAIL	    	|	  1 |	 49 |	  4   (0)| 00:00:01 |	    |	    |
|* 31 | 	  INDEX RANGE SCAN		  		| PK_DELEGATEDETAIL	    	|	  1 |	 52 |	  4   (0)| 00:00:01 |	    |	    |
|* 32 |       TABLE ACCESS BY GLOBAL INDEX ROWID  | GCCLAIMMAIN 	    |	914K|	 54M|	  2   (0)| 00:00:01 | ROWID | ROWID |
|* 33 |        INDEX UNIQUE SCAN		  	| INDEX_CLAIM_UNIQUECLAIM 	|	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
|  34 |      SORT UNIQUE			  		|			    			|	  2 |	260 |	 10  (20)| 00:00:01 |	    |	    |
|  35 |       UNION-ALL 			  		|			    			|	    |	    |		     |	    |	    |	    |
|* 36 |        TABLE ACCESS BY INDEX ROWID	| GCCANCELLATION	    	|	  1 |	 30 |	  3   (0)| 00:00:01 |	    |	    |
|* 37 | 	INDEX RANGE SCAN		  		| PK_GCCANCELLATI	    	|	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|  38 |        NESTED LOOPS			  		|			    			|	  1 |	100 |	  5   (0)| 00:00:01 |	    |	    |
|* 39 | 	TABLE ACCESS BY GLOBAL INDEX ROWID| GCCLAIMMAIN 	    	|	  1 |	 70 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|* 40 | 	 INDEX UNIQUE SCAN		  		| INDEX_CLAIM_UNIQUECLAIM 	|	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|* 41 | 	TABLE ACCESS BY INDEX ROWID	  	| GCCANCELLATION	    	|	  1 |	 30 |	  2   (0)| 00:00:01 |	    |	    |
|* 42 | 	 INDEX RANGE SCAN		  		| PK_GCCANCELLATI	    	|	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
-------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter(ROWNUM=1)
   4 - filter("C"."POLICYNO"=:B1 AND "C"."ITEMNO"=:B2 AND "C"."PLANCODE"=:B3)
   5 - access("C"."REGISTNO"=:B1 AND "C"."RISKCODE"=:B2)
   6 - filter(ROWNUM=1)
   7 - filter("C"."POLICYNO"=:B1 AND "C"."ITEMNO"=:B2 AND "C"."PLANCODE"=:B3)
   8 - access("C"."REGISTNO"=:B1 AND "C"."RISKCODE"=:B2)
  10 - filter( NOT EXISTS ( (SELECT 'X' FROM "GCCANCELLATION" "A" WHERE "A"."BUSINESSNO"=:B1 AND "A"."BUSINESSTYPE"='regist'
	      AND "A"."STATUS"<>'5')UNION (SELECT 'X' FROM "GCCLAIMMAIN" "B","GCCANCELLATION" "A" WHERE "A"."BUSINESSNO"="B"."CLAIMNO" AND
	      "A"."BUSINESSTYPE"='claim' AND "A"."STATUS"<>'5' AND "B"."RISKCODE"=:B2 AND "B"."REGISTNO"=:B3 AND "B"."POLICYNO"=:B4)))
  16 - access("GGCD"."CODECODE"="RP"."CHANNELDETAILCODE")
  18 - access("GGCD"."CODETYPE"='UnderWriteChannelTip')
  20 - filter(SUBSTR("RP"."RISKCODE",0,2)<>'08' AND SUBSTR("RP"."RISKCODE",0,2)<>'09' AND SUBSTR("RP"."RISKCODE",0,2)<>'16'
	      AND ("RP"."AUTORELATIONPOLICYFLAG" IS NULL OR "RP"."AUTORELATIONPOLICYFLAG"<>'1'))
  22 - access("GGR"."RISKCLASS"="RP"."RISKCLASS")
  24 - access("GGC"."COMPANYCODE"="RP"."COMPANYCODE")
  25 - filter("GCRM"."STATUS"='4')
  26 - access("GCRM"."REGISTNO"="RP"."REGISTNO")
  30 - access("DEL"."REGISTNO"="RP"."REGISTNO" AND "DEL"."POLICYNO"="RP"."POLICYNO" AND "DEL"."RISKCODE"="RP"."RISKCODE")
       filter("DEL"."RISKCODE"="RP"."RISKCODE")
  31 - access("DEL"."REGISTNO"="RP"."REGISTNO" AND "DEL"."POLICYNO"="RP"."POLICYNO" AND "DEL"."RISKCODE"="RP"."RISKCODE" AND
	      "DEL"."TIMES"=1)
       filter("DEL"."RISKCODE"="RP"."RISKCODE" AND "DEL"."TIMES"=1)
  32 - filter(("A"."CASETYPE"='4' OR ("A"."ENDCASESTATUS"='1' OR "A"."ENDCASESTATUS"='3')) AND
	      "RP"."POLICYNO"="A"."POLICYNO" AND "RP"."PLANCODE"="A"."PLANCODE" AND "RP"."ITEMNO"="A"."ITEMNO")
  33 - access("RP"."REGISTNO"="A"."REGISTNO" AND "RP"."RISKCODE"="A"."RISKCODE")
  36 - filter("A"."BUSINESSTYPE"='regist' AND "A"."STATUS"<>'5')
  37 - access("A"."BUSINESSNO"=:B1)
  39 - filter("B"."POLICYNO"=:B1)
  40 - access("B"."REGISTNO"=:B1 AND "B"."RISKCODE"=:B2)
  41 - filter("A"."BUSINESSTYPE"='claim' AND "A"."STATUS"<>'5')
  42 - access("A"."BUSINESSNO"="B"."CLAIMNO")


Statistics
----------------------------------------------------------
	  1  recursive calls
	  0  db block gets
5465026  consistent gets
	  0  physical reads
	  0  redo size
	525  bytes sent via SQL*Net to client
	520  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
 383767  sorts (memory)
	  0  sorts (disk)
	  1  rows processed


--优化前10s~11s,

2.优化后SQL 加HINT;/*+NO_UNNEST*/,不做子查询展开

select count(1)
  from (SELECT distinct rp.registNo,
                        rp.policyNo,
                        rp.plancode,
                        rp.riskcode,
                        rp.itemno,
                        rp.endorseqno,
                        gcrm.damagestartdate,
                        gcrm.damageaddress,
                        gcrm.damagecode,
                        gcrm.damagename,
                        gcrm.reporttype,
                        gcrm.reportorname,
                        gcrm.reportorphonenumber,
                        gcrm.reportdate,
                        gcrm.operatorCode,
                        rp.insuredName,
                        gcrm.canceldate,
                        ggr.riskclass,
                        ggr.classcname,
                        ggc.companycode,
                        ggc.companyCName,
                        (SELECT round(c.sumEstLoss, 2) 
                           FROM Gcclaimmain c
                          WHERE c.registNo = rp.registNo
                            AND c.policyNo = rp.policyNo
                            AND c.planCode = rp.planCode
                            AND c.riskCode = rp.riskCode
                            AND c.itemNo = rp.itemNo
                            AND ROWNUM = 1) sumEstLoss,
                        (SELECT round(c.sumPaid, 2)
                           FROM GcClaimMain c
                          WHERE c.registNo = rp.registNo
                            AND c.policyNo = rp.policyNo
                            AND c.planCode = rp.planCode
                            AND c.riskCode = rp.riskCode
                            AND c.itemNo = rp.itemNo
                            AND ROWNUM = 1) sumPaid,
                        gcrm.phonenumber,
                        ggcd.codecode,
                        ggcd.codecname
          FROM GcRegistPolicy rp
         INNER JOIN gcregistmain gcrm
            on (gcrm.registno = rp.registno)
         INNER JOIN ggriskclass ggr
            ON (ggr.riskclass = rp.riskclass)
         INNER JOIN GgCompany ggc
            ON (ggc.companycode = rp.companycode)
         INNER JOIN ggcode ggcd
            ON (ggcd.codecode = rp.channeldetailcode and
               ggcd.codetype = 'UnderWriteChannelTip')
         WHERE 1 = 1
           and substr(rp.riskcode, 0, 2) not in ('08', '09', '16')
           and (rp.autorelationpolicyflag is null or
               rp.autorelationpolicyflag <> '1')
           and gcrm.status = '4'
           and not exists
         (select 'x'
                  from gcclaimmain a
                 where rp.registNo = a.registNo
                   AND rp.policyNo = a.policyNo
                   AND rp.planCode = a.planCode
                   AND rp.riskCode = a.riskCode
                   AND rp.itemNo = a.itemNo
                   AND (a.endcasestatus in ('1', '3') or a.CaseType = '4')
		 )
           and not exists (select /*+no_unnest*/'X'
                  from gccancellation a
                 where a.businesstype = 'regist'
                   and a.status <> '5'
                   and a.businessno = rp.registNo
                union
                select 'X'
                  from gccancellation a, gcclaimmain b
                 where a.businessno = b.claimno
                   and b.registNo = rp.registNo
                   and b.policyNo = rp.policyNo
                   and b.riskCode = rp.riskCode
                   and a.businesstype = 'claim'
                   and a.status <> '5')
           and not exists (select /*+no_unnest*/'x'
                  from gcdelegatedetail del
                 where del.registno = rp.registno
                   and del.policyno = rp.policyno
                   and del.riskCode = rp.riskCode
               )
         order by gcrm.damagestartdate desc);

执行时间5s;

执行i计划查看 

Elapsed: 00:00:04.87
--优化后:5s;
Execution Plan
----------------------------------------------------------
Plan hash value: 2928421648

-------------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation				  | Name		                        | Rows  | Bytes | Cost (%CPU)| Time     | Pstart| Pstop |
-------------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT			  			|			    		|	  1 |	  2 | 13980   (1)| 00:02:48 |	    |	    |
|   1 |  SORT AGGREGATE 			  			|			    		|	  1 |	  2 |		 	 |	    |	    |	    |
|   2 |   VIEW					  				|			    		|	  1 |	  2 | 13980   (1)| 00:02:48 |	    |	    |
|*  3 |    COUNT STOPKEY			  			|			    		|	    |	    |		     |	    |	    |	    |
|*  4 |     TABLE ACCESS BY GLOBAL INDEX ROWID	  | GCCLAIMMAIN 	    |	  1 |	 62 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|*  5 |      INDEX UNIQUE SCAN			  		| INDEX_CLAIM_UNIQUECLAIM |	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|*  6 |    COUNT STOPKEY			  			|			    		|	    |	    |		     |	    |	    |	    |
|*  7 |     TABLE ACCESS BY GLOBAL INDEX ROWID	  | GCCLAIMMAIN 	    |	  1 |	 62 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|*  8 |      INDEX UNIQUE SCAN			  		| INDEX_CLAIM_UNIQUECLAIM |	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|   9 |    HASH UNIQUE				  			|			    		|	  1 |	450 | 13980   (1)| 00:02:48 |	    |	    |
|* 10 |     FILTER				  				|			    		|	    |	    |		     |	    |	    |	    |
|  11 |      NESTED LOOPS ANTI			  		|			    		|	  1 |	450 | 13959   (1)| 00:02:48 |	    |	    |
|  12 |       NESTED LOOPS			  			|			    		|	  1 |	388 | 13957   (1)| 00:02:48 |	    |	    |
|  13 |        NESTED LOOPS			 			|			    		|	  1 |	232 | 13955   (1)| 00:02:48 |	    |	    |
|  14 | 	NESTED LOOPS			  			|			    		|	  1 |	178 | 13954   (1)| 00:02:48 |	    |	    |
|* 15 | 	 HASH JOIN	--这里之前时NESTLOOP    |			    		|	  1 |	164 | 13953   (1)| 00:02:48 |	    |	    |
|  16 | 	  TABLE ACCESS BY INDEX ROWID	  	| GGCODE		    	|	 50 |  2500 |	 27   (0)| 00:00:01 |	    |	    |
|* 17 | 	   INDEX RANGE SCAN		  			| PK_GGCODE		    	|	 50 |	    |	  3   (0)| 00:00:01 |	    |	    |
|  18 | 	  PARTITION HASH ALL		  		|			    		|	117 | 13338 | 13926   (1)| 00:02:48 |	  1 |	  8 |
|* 19 | 	   TABLE ACCESS FULL		  		| GCREGISTPOLICY	    |	117 | 13338 | 13926   (1)| 00:02:48 |	  1 |	  8 |
|  20 | 	 TABLE ACCESS BY INDEX ROWID	  	| GGRISKCLASS 	    	|	  1 |	 14 |	  1   (0)| 00:00:01 |	    |	    |
|* 21 | 	  INDEX UNIQUE SCAN		  			| PK_GGRISKCLASS	    |	  1 |	    |	  0   (0)| 00:00:01 |	    |	    |
|  22 | 	TABLE ACCESS BY INDEX ROWID	  		| GGCOMPANY		    	|	  1 |	 54 |	  1   (0)| 00:00:01 |	    |	    |
|* 23 | 	 INDEX UNIQUE SCAN		  			| PK_GGCOMPANY	    	|	  1 |	    |	  0   (0)| 00:00:01 |	    |	    |
|* 24 |        TABLE ACCESS BY GLOBAL INDEX ROWID | GCREGISTMAIN	    |	  1 |	156 |	  2   (0)| 00:00:01 | ROWID | ROWID |
|* 25 | 	INDEX UNIQUE SCAN		  			| PK_GCREGISTMAIN	    |	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
|* 26 |       TABLE ACCESS BY GLOBAL INDEX ROWID  | GCCLAIMMAIN 	    |	914K|	 54M|	  2   (0)| 00:00:01 | ROWID | ROWID |
|* 27 |        INDEX UNIQUE SCAN		  		| INDEX_CLAIM_UNIQUECLAIM |	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
|  28 |      SORT UNIQUE			  			|			    		|	  2 |	260 |	 10  (20)| 00:00:01 |	    |	    |
|  29 |       UNION-ALL 			  			|			    		|	    |	    |		 |	    |	    |	    |
|* 30 |        TABLE ACCESS BY INDEX ROWID	  	| GCCANCELLATION	    |	  1 |	 30 |	  3   (0)| 00:00:01 |	    |	    |
|* 31 | 	INDEX RANGE SCAN		  			| PK_GCCANCELLATI	    |	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|  32 |        NESTED LOOPS			  			|			    		|	  1 |	100 |	  5   (0)| 00:00:01 |	    |	    |
|* 33 | 	TABLE ACCESS BY GLOBAL INDEX ROWID	| GCCLAIMMAIN 	    	|	  1 |	 70 |	  3   (0)| 00:00:01 | ROWID | ROWID |
|* 34 | 	 INDEX UNIQUE SCAN		  			| INDEX_CLAIM_UNIQUECLAIM |	  1 |	    |	  2   (0)| 00:00:01 |	    |	    |
|* 35 | 	TABLE ACCESS BY INDEX ROWID	  		| GCCANCELLATION	    |	  1 |	 30 |	  2   (0)| 00:00:01 |	    |	    |
|* 36 | 	 INDEX RANGE SCAN		  			| PK_GCCANCELLATI	    |	  1 |	    |	  1   (0)| 00:00:01 |	    |	    |
|  37 |      SORT UNIQUE			  			|			    		|	  2 |	202 |	 10  (20)| 00:00:01 |	    |	    |
|  38 |       UNION-ALL 			  			|			    		|	    |	    |		 |	    |	    |	    |
|* 39 |        INDEX RANGE SCAN 		  		| PK_DELEGATEDETAIL	    |	  1 |	 49 |	  4   (0)| 00:00:01 |	    |	    |
|* 40 |        INDEX RANGE SCAN 		  		| PK_DELEGATEDETAIL	    |	  1 |	 52 |	  4   (0)| 00:00:01 |	    |	    |
-------------------------------------------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter(ROWNUM=1)
   4 - filter("C"."POLICYNO"=:B1 AND "C"."ITEMNO"=:B2 AND "C"."PLANCODE"=:B3)
   5 - access("C"."REGISTNO"=:B1 AND "C"."RISKCODE"=:B2)
   6 - filter(ROWNUM=1)
   7 - filter("C"."POLICYNO"=:B1 AND "C"."ITEMNO"=:B2 AND "C"."PLANCODE"=:B3)
   8 - access("C"."REGISTNO"=:B1 AND "C"."RISKCODE"=:B2)
  10 - filter( NOT EXISTS ( (SELECT /*+ NO_UNNEST */ 'X' FROM "GCCANCELLATION" "A" WHERE "A"."BUSINESSNO"=:B1 AND
	      "A"."BUSINESSTYPE"='regist' AND "A"."STATUS"<>'5')UNION (SELECT 'X' FROM "GCCLAIMMAIN" "B","GCCANCELLATION" "A" WHERE
	      "A"."BUSINESSNO"="B"."CLAIMNO" AND "A"."BUSINESSTYPE"='claim' AND "A"."STATUS"<>'5' AND "B"."RISKCODE"=:B2 AND
	      "B"."REGISTNO"=:B3 AND "B"."POLICYNO"=:B4)) AND  NOT EXISTS ( (SELECT /*+ NO_UNNEST */ 'x' FROM "GCDELEGATEDETAIL" "DEL"
	      WHERE "DEL"."POLICYNO"=:B5 AND "DEL"."REGISTNO"=:B6 AND "DEL"."RISKCODE"=:B7)UNION (SELECT 'x' FROM "GCDELEGATEDETAIL" "DEL"
	      WHERE "DEL"."POLICYNO"=:B8 AND "DEL"."REGISTNO"=:B9 AND "DEL"."RISKCODE"=:B10 AND "DEL"."TIMES"=1)))
  15 - access("GGCD"."CODECODE"="RP"."CHANNELDETAILCODE")
  17 - access("GGCD"."CODETYPE"='UnderWriteChannelTip')
  19 - filter(SUBSTR("RP"."RISKCODE",0,2)<>'08' AND SUBSTR("RP"."RISKCODE",0,2)<>'09' AND SUBSTR("RP"."RISKCODE",0,2)<>'16'
	      AND ("RP"."AUTORELATIONPOLICYFLAG" IS NULL OR "RP"."AUTORELATIONPOLICYFLAG"<>'1'))
  21 - access("GGR"."RISKCLASS"="RP"."RISKCLASS")
  23 - access("GGC"."COMPANYCODE"="RP"."COMPANYCODE")
  24 - filter("GCRM"."STATUS"='4')
  25 - access("GCRM"."REGISTNO"="RP"."REGISTNO")
  26 - filter(("A"."CASETYPE"='4' OR ("A"."ENDCASESTATUS"='1' OR "A"."ENDCASESTATUS"='3')) AND
	      "RP"."POLICYNO"="A"."POLICYNO" AND "RP"."PLANCODE"="A"."PLANCODE" AND "RP"."ITEMNO"="A"."ITEMNO")
  27 - access("RP"."REGISTNO"="A"."REGISTNO" AND "RP"."RISKCODE"="A"."RISKCODE")
  30 - filter("A"."BUSINESSTYPE"='regist' AND "A"."STATUS"<>'5')
  31 - access("A"."BUSINESSNO"=:B1)
  33 - filter("B"."POLICYNO"=:B1)
  34 - access("B"."REGISTNO"=:B1 AND "B"."RISKCODE"=:B2)
  35 - filter("A"."BUSINESSTYPE"='claim' AND "A"."STATUS"<>'5')
  36 - access("A"."BUSINESSNO"="B"."CLAIMNO")
  39 - access("DEL"."REGISTNO"=:B1 AND "DEL"."POLICYNO"=:B2 AND "DEL"."RISKCODE"=:B3)
       filter("DEL"."RISKCODE"=:B1)
  40 - access("DEL"."REGISTNO"=:B1 AND "DEL"."POLICYNO"=:B2 AND "DEL"."RISKCODE"=:B3 AND "DEL"."TIMES"=1)
       filter("DEL"."RISKCODE"=:B1 AND "DEL"."TIMES"=1)

Statistics
----------------------------------------------------------
	  0  recursive calls
	  0  db block gets
3662137  consistent gets (--这里有变化)
	  0  physical reads
	  0  redo size
	525  bytes sent via SQL*Net to client
	520  bytes received via SQL*Net from client
	  2  SQL*Net roundtrips to/from client
  21346  sorts (memory)(--这里有变化)
	  0  sorts (disk)
	  1  rows processed

优化前:11s,优化后5s;

3.总结

GGRISKCLASS 表优化前和前面的结果连接方式时NEST LOOP,优化后Hash Join.

排序内存和逻辑读都有减少,时间缩短为原理的1/2;由此可见,对于子查询展开和不展开执行效率不同,Oracle有时候也会选错执行计划。但是我们可以通过HINT调整SQL的执行计划,让它走指定的执行计划,从而优化SQL;

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值