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;