反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例
背景
今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化。
优化前:
耗时:503s
返回:0
SQL代码

SELECT *
FROM MM_PAYABLEMONEY_TD P
WHERE P.DATATYPE IN ('132',
'304',
'313',
'316',
'323',
'321',
'330',
'334',
'338',
'342',
'346',
'350',
'351',
'353',
'355',
'358',
'359',
'362',
'365',
'364',
'516',
'518',
'524',
'528',
'532',
'535',
'538',
'539',
'542',
'Y32',
'C04',
'C70',
'C30',
'C74',
'C53',
'C55',
'C76',
'C58',
'C79',
'C59',
'C80',
'C62',
'C83',
'C65',
'C64',
'F16',
'F18',
'F24',
'F28',
'F32',
'F35',
'F38',
'F39',
'F42',
'C30',
'C28',
'C75',
'367',
'370')
AND P.OPSTATUS IN ('0')
AND P.SUBCOMPANY = '015100'
AND BASEAMOUNT < BASEUSEDAMOUNT
AND BASEAMOUNT < 0.00
AND NOT EXISTS
(SELECT 1
FROM MM_INVPLY_TD I
WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
AND I.OPSTATUS NOT IN ('3', '4', '5'))
AND EXISTS
(SELECT 'X'
FROM MM_PAYABLEMONEY_TD
WHERE POLICYNO = P.POLICYNO
AND UNITCODE = P.UNITCODE
AND BASECURRENCYCODE = P.BASECURRENCYCODE
AND DATATYPE IN ('122',
'302',
'311',
'314',
'319',
'325',
'328',
'332',
'336',
'340',
'344',
'348',
'352',
'354',
'356',
'357',
'360',
'361',
'363',
'366',
'502',
'504',
'506',
'508',
'512',
'514',
'522',
'526',
'534',
'536',
'537',
'540',
'541',
'Y22',
'C02',
'C68',
'C28',
'C72',
'C54',
'C56',
'C77',
'C57',
'C78',
'C60',
'C81',
'C61',
'C82',
'C63',
'C66',
'F02',
'F04',
'F06',
'F08',
'F12',
'F14',
'F22',
'F26',
'F34',
'F36',
'F37',
'F40',
'F41',
'C30',
'C28',
'C75',
'367',
'370')
AND NOT EXISTS
(SELECT 1
FROM MM_INVPLY_TD I
WHERE (I.SEQPOLICY = P.FATHERNO OR
I.VATSEQPOLICY = P.FATHERNO)
AND I.OPSTATUS NOT IN ('3', '4', '5'))
AND OPSTATUS IN ('0')
AND ((CUSTSEQ = P.OFFSETNO AND P.OFFSETNO IS NOT NULL) OR
(OFFSETNO = P.CUSTSEQ AND P.OFFSETNO IS NULL))
AND AMOUNT = -P.AMOUNT
AND TRIM(CUSTOMERCODE) = TRIM(P.CUSTOMERCODE)
AND BASEAMOUNT > 0.00)
AND NOT EXISTS
(SELECT 1
FROM MM_BATCHINFO_TD
WHERE POLICYNO = P.POLICYNO
AND OPSTATUS <> '3'
AND ((SERIALNO = P.CUSTSEQ) OR
(SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
AND NOT EXISTS
(SELECT 1
FROM MM_BATCHINFO_TI
WHERE POLICYNO = P.POLICYNO
AND STATUS <> '4'
AND ((SERIALNO = P.CUSTSEQ) OR
(SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
AND NOT EXISTS (SELECT 1
FROM MM_POLICY_EVENTS_TD2 E2, MM_APPLYFEE_TD A
WHERE E2.FATHERNO = A.SEQFEELIST
AND E2.FATHERNO = P.FATHERNO)
SQL执行计划
Plan hash value: 3405241672
-----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 884 | 1064K (1)| 03:33:00 |
| 1 | FOR UPDATE | | | | | |
|* 2 | FILTER | | | | | |
|* 3 | HASH JOIN ANTI | | 124 | 107K| 1952 (3)| 00:00:24 |
|* 4 | TABLE ACCESS BY INDEX ROWID | MM_PAYABLEMONEY_TD | 146 | 124K| 1601 (2)| 00:00:20 |
|* 5 | INDEX RANGE SCAN | IDX_PAYABLEMONEY_02 | 199 | | 1438 (3)| 00:00:18 |
| 6 | VIEW | VW_SQ_1 | 12620 | 160K| 350 (3)| 00:00:05 |
|* 7 | HASH JOIN | | 12620 | 172K| 350 (3)| 00:00:05 |
| 8 | TABLE ACCESS FULL | MM_POLICY_EVENTS_TD2 | 12620 | 88340 | 166 (1)| 00:00:02 |
| 9 | INDEX FAST FULL SCAN | SYS_C00139261 | 372K| 2544K| 180 (3)| 00:00:03 |
|* 10 | TABLE ACCESS FULL | MM_INVPLY_TD | 3 | 45 | 1147 (2)| 00:00:14 |
|* 11 | FILTER | | | | | |
|* 12 | TABLE ACCESS BY INDEX ROWID | MM_PAYABLEMONEY_TD | 1 | 89 | 7 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | IDX_PAYABLEMONEY_04 | 8 | | 3 (0)| 00:00:01 |
|* 14 | TABLE ACCESS FULL | MM_INVPLY_TD | 3 | 45 | 1147 (2)| 00:00:14 |
| 15 | CONCATENATION | | | | | |
|* 16 | FILTER | | | | | |
|* 17 | TABLE ACCESS BY INDEX ROWID| MM_BATCHINFO_TD | 1 | 48 | 1758 (1)| 00:00:22 |
|* 18 | INDEX SKIP SCAN | IDX_BATCHINFO_TD3 | 2 | | 1756 (1)| 00:00:22 |
|* 19 | TABLE ACCESS BY INDEX ROWID | MM_BATCHINFO_TD | 1 | 48 | 1758 (1)| 00:00:22 |
|* 20 | INDEX SKIP SCAN | IDX_BATCHINFO_TD3 | 2 | | 1756 (1)| 00:00:22 |
|* 21 | TABLE ACCESS FULL | MM_BATCHINFO_TI | 1 | 48 | 11305 (1)| 00:02:16 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B1
OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
AND EXISTS (SELECT /*+ */ 0 FROM "MM_PAYABLEMONEY_TD" "MM_PAYABLEMONEY_TD" WHERE NOT EXISTS
(SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B3 OR "I"."SEQPOLICY"=:B4) AND
"I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4') AND "POLICYNO"=:B5 AND (:B6
IS NULL AND "OFFSETNO"=:B7 OR :B8 IS NOT NULL AND "CUSTSEQ"=:B9) AND "BASECURRENCYCODE"=:B10 AND
"UNITCODE"=:B11 AND "AMOUNT"=(-:B12) AND "OPSTATUS"='0' AND "BASEAMOUNT">0.00 AND
TRIM("CUSTOMERCODE")=TRIM(:B13) AND ("DATATYPE"='122' OR "DATATYPE"='302' OR "DATATYPE"='311' OR
"DATATYPE"='314' OR "DATATYPE"='319' OR "DATATYPE"='325' OR "DATATYPE"='328' OR "DATATYPE"='332'
OR "DATATYPE"='336' OR "DATATYPE"='340' OR "DATATYPE"='344' OR "DATATYPE"='348' OR
"DATATYPE"='352' OR "DATATYPE"='354' OR "DATATYPE"='356' OR "DATATYPE"='357' OR "DATATYPE"='360'
OR "DATATYPE"='361' OR "DATATYPE"='363' OR "DATATYPE"='366' OR "DATATYPE"='367' OR
"DATATYPE"='370' OR "DATATYPE"='502' OR "DATATYPE"='504' OR "DATATYPE"='506' OR "DATATYPE"='508'
OR "DATATYPE"='512' OR "DATATYPE"='514' OR "DATATYPE"='522' OR "DATATYPE"='526' OR
"DATATYPE"='534' OR "DATATYPE"='536' OR "DATATYPE"='537' OR "DATATYPE"='540' OR "DATATYPE"='541'
OR "DATATYPE"='C02' OR "DATATYPE"='C28' OR "DATATYPE"='C30' OR "DATATYPE"='C54' OR
"DATATYPE"='C56' OR "DATATYPE"='C57' OR "DATATYPE"='C60' OR "DATATYPE"='C61' OR "DATATYPE"='C63'
OR "DATATYPE"='C66' OR "DATATYPE"='C68' OR "DATATYPE"='C72' OR "DATATYPE"='C75' OR
"DATATYPE"='C77' OR "DATATYPE"='C78' OR "DATATYPE"='C81' OR "DATATYPE"='C82' OR "DATATYPE"='F02'
OR "DATATYPE"='F04' OR "DATATYPE"='F06' OR "DATATYPE"='F08' OR "DATATYPE"='F12' OR
"DATATYPE"='F14' OR "DATATYPE"='F22' OR "DATATYPE"='F26' OR "DATATYPE"='F34' OR "DATATYPE"='F36'
OR "DATATYPE"='F37' OR "DATATYPE"='F40' OR "DATATYPE"='F41' OR "DATATYPE"='Y22')) AND NOT EXISTS
(SELECT /*+ */ 0 FROM "MM_BATCHINFO_TD" "MM_BATCHINFO_TD"???)
3 - access("FATHERNO"="P"."FATHERNO")
4 - filter("BASEAMOUNT"<"BASEUSEDAMOUNT")
5 - access("P"."SUBCOMPANY"=:B1 AND "P"."OPSTATUS"='0' AND "BASEAMOUNT"<0.00)
filter("BASEAMOUNT"<0.00 AND "P"."OPSTATUS"='0' AND ("P"."DATATYPE"='132' OR
"P"."DATATYPE"='304' OR "P"."DATATYPE"='313' OR "P"."DATATYPE"='316' OR "P"."DATATYPE"='321' OR
"P"."DATATYPE"='323' OR "P"."DATATYPE"='330' OR "P"."DATATYPE"='334' OR "P"."DATATYPE"='338' OR
"P"."DATATYPE"='342' OR "P"."DATATYPE"='346' OR "P"."DATATYPE"='350' OR "P"."DATATYPE"='351' OR
"P"."DATATYPE"='353' OR "P"."DATATYPE"='355' OR "P"."DATATYPE"='358' OR "P"."DATATYPE"='359' OR
"P"."DATATYPE"='362' OR "P"."DATATYPE"='364' OR "P"."DATATYPE"='365' OR "P"."DATATYPE"='367' OR
"P"."DATATYPE"='370' OR "P"."DATATYPE"='516' OR "P"."DATATYPE"='518' OR "P"."DATATYPE"='524' OR
"P"."DATATYPE"='528' OR "P"."DATATYPE"='532' OR "P"."DATATYPE"='535' OR "P"."DATATYPE"='538' OR
"P"."DATATYPE"='539' OR "P"."DATATYPE"='542' OR "P"."DATATYPE"='C04' OR "P"."DATATYPE"='C28' OR
"P"."DATATYPE"='C30' OR "P"."DATATYPE"='C53' OR "P"."DATATYPE"='C55' OR "P"."DATATYPE"='C58' OR
"P"."DATATYPE"='C59' OR "P"."DATATYPE"='C62' OR "P"."DATATYPE"='C64' OR "P"."DATATYPE"='C65' OR
"P"."DATATYPE"='C70' OR "P"."DATATYPE"='C74' OR "P"."DATATYPE"='C75' OR "P"."DATATYPE"='C76' OR
"P"."DATATYPE"='C79' OR "P"."DATATYPE"='C80' OR "P"."DATATYPE"='C83' OR "P"."DATATYPE"='F16' OR
"P"."DATATYPE"='F18' OR "P"."DATATYPE"='F24' OR "P"."DATATYPE"='F28' OR "P"."DATATYPE"='F32' OR
"P"."DATATYPE"='F35' OR "P"."DATATYPE"='F38' OR "P"."DATATYPE"='F39' OR "P"."DATATYPE"='F42' OR
"P"."DATATYPE"='Y32'))
7 - access("E2"."FATHERNO"="A"."SEQFEELIST")
10 - filter(("I"."VATSEQPOLICY"=:B1 OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND
"I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
11 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_INVPLY_TD" "I" WHERE ("I"."VATSEQPOLICY"=:B1
OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4'))
12 - filter((:B1 IS NULL AND "OFFSETNO"=:B2 OR :B3 IS NOT NULL AND "CUSTSEQ"=:B4) AND
"BASECURRENCYCODE"=:B5 AND "UNITCODE"=:B6 AND "AMOUNT"=(-:B7) AND "OPSTATUS"='0' AND
"BASEAMOUNT">0.00 AND TRIM("CUSTOMERCODE")=TRIM(:B8) AND ("DATATYPE"='122' OR "DATATYPE"='302' OR
"DATATYPE"='311' OR "DATATYPE"='314' OR "DATATYPE"='319' OR "DATATYPE"='325' OR "DATATYPE"='328'
OR "DATATYPE"='332' OR "DATATYPE"='336' OR "DATATYPE"='340' OR "DATATYPE"='344' OR
"DATATYPE"='348' OR "DATATYPE"='352' OR "DATATYPE"='354' OR "DATATYPE"='356' OR "DATATYPE"='357'
OR "DATATYPE"='360' OR "DATATYPE"='361' OR "DATATYPE"='363' OR "DATATYPE"='366' OR
"DATATYPE"='367' OR "DATATYPE"='370' OR "DATATYPE"='502' OR "DATATYPE"='504' OR "DATATYPE"='506'
OR "DATATYPE"='508' OR "DATATYPE"='512' OR "DATATYPE"='514' OR "DATATYPE"='522' OR
"DATATYPE"='526' OR "DATATYPE"='534' OR "DATATYPE"='536' OR "DATATYPE"='537' OR "DATATYPE"='540'
OR "DATATYPE"='541' OR "DATATYPE"='C02' OR "DATATYPE"='C28' OR "DATATYPE"='C30' OR
"DATATYPE"='C54' OR "DATATYPE"='C56' OR "DATATYPE"='C57' OR "DATATYPE"='C60' OR "DATATYPE"='C61'
OR "DATATYPE"='C63' OR "DATATYPE"='C66' OR "DATATYPE"='C68' OR "DATATYPE"='C72' OR
"DATATYPE"='C75' OR "DATATYPE"='C77' OR "DATATYPE"='C78' OR "DATATYPE"='C81' OR "DATATYPE"='C82'
OR "DATATYPE"='F02' OR "DATATYPE"='F04' OR "DATATYPE"='F06' OR "DATATYPE"='F08' OR
"DATATYPE"='F12' OR "DATATYPE"='F14' OR "DATATYPE"='F22' OR "DATATYPE"='F26' OR "DATATYPE"='F34'
OR "DATATYPE"='F36' OR "DATATYPE"='F37' OR "DATATYPE"='F40' OR "DATATYPE"='F41' OR
"DATATYPE"='Y22'))
13 - access("POLICYNO"=:B1)
14 - filter(("I"."VATSEQPOLICY"=:B1 OR "I"."SEQPOLICY"=:B2) AND "I"."OPSTATUS"<>'3' AND
"I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
16 - filter(:B1 IS NOT NULL)
17 - filter("POLICYNO"=:B1 AND "OPSTATUS"<>'3')
18 - access("SERIALNO"=:B1)
filter("SERIALNO"=:B1)
19 - filter("POLICYNO"=:B1 AND "OPSTATUS"<>'3' AND (LNNVL(:B2 IS NOT NULL) OR
LNNVL("SERIALNO"=:B3)))
20 - access("SERIALNO"=:B1)
filter("SERIALNO"=:B1)
21 - filter("POLICYNO"=:B1 AND ("SERIALNO"=:B2 OR :B3 IS NOT NULL AND "SERIALNO"=:B4) AND
"STATUS"<>'4')
分析
1) 从执行计划 ID=2 与 ID =11中可以看出,该SQL中有filte关键字,filte的驱动表是固定的,一旦驱动表固定,
那么执行计划也就被固定了,一旦被固定的执行计划本身是错误的(低效的),就会引起性能问题。
2)ID=2 filte的两个子级是ID=3(驱动表MM_PAYABLEMONEY_TD)与ID=10(被驱动表MM_INVPLY_TD),
ID=10 为TABLE ACCESS FULL。所以可以在MM_INVPLY_TD表上建立索引。
create index idx_BATCHINFO_TI_test on MM_BATCHINFO_TI (POLICYNO, SERIALNO, STATUS);
3)ID=18与ID=20 访问表MM_BATCHINFO_TD采用的INDEX SKIP SCAN方式,这种索引扫描方式很低效,
所以可以在MM_BATCHINFO_TD表上建立索引:
create index IDX_BATCHINFO_TEST on MM_BATCHINFO_TD (SERIALNO, POLICYNO, OPSTATUS);
4)索引优化后,SQL运行时间缩短至200s
5)逐一对SQL的子查询进行运行分析,得出性能主要慢在:
AND NOT EXISTS
(SELECT 1
FROM MM_INVPLY_TD I
WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
AND I.OPSTATUS NOT IN ('3', '4', '5'))
对其进行分析改写:
left join (SELECT SEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND SEQPOLICY IS NOT NULL
union all
SELECT VATSEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND VATSEQPOLICY IS NOT NULL) tp
on P.FATHERNO = tp.SEQPOLICY
where tp.SEQPOLICY is null
优化
1)建立索引
create index idx_BATCHINFO_TI_test on MM_BATCHINFO_TI (POLICYNO, SERIALNO, STATUS);
create index IDX_BATCHINFO_TEST on MM_BATCHINFO_TD (SERIALNO, POLICYNO, OPSTATUS);
2)改写SQL语句
SELECT *
FROM MM_PAYABLEMONEY_TD P
LEFT JOIN (SELECT SEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND SEQPOLICY IS NOT NULL
UNION ALL
SELECT VATSEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND VATSEQPOLICY IS NOT NULL) TP
ON P.FATHERNO = TP.SEQPOLICY
WHERE P.DATATYPE IN ('132',
'304',
'313',
'316',
'323',
'321',
'330',
'334',
'338',
'342',
'346',
'350',
'351',
'353',
'355',
'358',
'359',
'362',
'365',
'364',
'516',
'518',
'524',
'528',
'532',
'535',
'538',
'539',
'542',
'Y32',
'C04',
'C70',
'C30',
'C74',
'C53',
'C55',
'C76',
'C58',
'C79',
'C59',
'C80',
'C62',
'C83',
'C65',
'C64',
'F16',
'F18',
'F24',
'F28',
'F32',
'F35',
'F38',
'F39',
'F42',
'C30',
'C28',
'C75',
'367',
'370')
AND P.OPSTATUS IN ('0')
AND P.SUBCOMPANY = '015100'
AND BASEAMOUNT < BASEUSEDAMOUNT
AND BASEAMOUNT < 0.00
AND TP.SEQPOLICY IS NULL
/* AND NOT EXISTS
(SELECT 1
FROM MM_INVPLY_TD I
WHERE (I.SEQPOLICY = P.FATHERNO OR I.VATSEQPOLICY = P.FATHERNO)
AND I.OPSTATUS NOT IN ('3', '4', '5')) */
AND EXISTS
(SELECT 'X'
FROM MM_PAYABLEMONEY_TD
LEFT JOIN (SELECT SEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND SEQPOLICY IS NOT NULL
UNION ALL
SELECT VATSEQPOLICY
FROM MM_INVPLY_TD I
WHERE I.OPSTATUS NOT IN ('3', '4', '5')
AND VATSEQPOLICY IS NOT NULL) TD
ON FATHERNO = TD.SEQPOLICY
WHERE POLICYNO = P.POLICYNO
AND UNITCODE = P.UNITCODE
AND BASECURRENCYCODE = P.BASECURRENCYCODE
AND DATATYPE IN ('122',
'302',
'311',
'314',
'319',
'325',
'328',
'332',
'336',
'340',
'344',
'348',
'352',
'354',
'356',
'357',
'360',
'361',
'363',
'366',
'502',
'504',
'506',
'508',
'512',
'514',
'522',
'526',
'534',
'536',
'537',
'540',
'541',
'Y22',
'C02',
'C68',
'C28',
'C72',
'C54',
'C56',
'C77',
'C57',
'C78',
'C60',
'C81',
'C61',
'C82',
'C63',
'C66',
'F02',
'F04',
'F06',
'F08',
'F12',
'F14',
'F22',
'F26',
'F34',
'F36',
'F37',
'F40',
'F41',
'C30',
'C28',
'C75',
'367',
'370')
/* AND NOT EXISTS
(SELECT 1
FROM MM_INVPLY_TD I
WHERE (I.SEQPOLICY = P.FATHERNO OR
I.VATSEQPOLICY = P.FATHERNO)
AND I.OPSTATUS NOT IN ('3', '4', '5'))*/
AND TD.SEQPOLICY IS NULL
AND OPSTATUS IN ('0')
AND ((CUSTSEQ = P.OFFSETNO AND P.OFFSETNO IS NOT NULL) OR
(OFFSETNO = P.CUSTSEQ AND P.OFFSETNO IS NULL))
AND AMOUNT = -P.AMOUNT
AND TRIM(CUSTOMERCODE) = TRIM(P.CUSTOMERCODE)
AND BASEAMOUNT > 0.00)
AND NOT EXISTS
(SELECT 1
FROM MM_BATCHINFO_TD
WHERE POLICYNO = P.POLICYNO
AND OPSTATUS <> '3'
AND ((SERIALNO = P.CUSTSEQ) OR
(SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
AND NOT EXISTS
(SELECT 1
FROM MM_BATCHINFO_TI
WHERE POLICYNO = P.POLICYNO
AND STATUS <> '4'
AND ((SERIALNO = P.CUSTSEQ) OR
(SERIALNO = P.OFFSETNO AND P.OFFSETNO IS NOT NULL)))
AND NOT EXISTS (SELECT 1
FROM MM_POLICY_EVENTS_TD2 E2, MM_APPLYFEE_TD A
WHERE E2.FATHERNO = A.SEQFEELIST
AND E2.FATHERNO = P.FATHERNO)
优化后的执行计划:
Plan hash value: 783089741
----------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 897 | 442K (2)| 01:28:25 |
|* 1 | FILTER | | | | | |
|* 2 | FILTER | | | | | |
|* 3 | HASH JOIN OUTER | | 170 | 148K| 8528 (2)| 00:01:43 |
|* 4 | HASH JOIN ANTI | | 170 | 146K| 2540 (3)| 00:00:31 |
|* 5 | TABLE ACCESS BY INDEX ROWID | MM_PAYABLEMONEY_TD | 200 | 170K| 2189 (2)| 00:00:27 |
|* 6 | INDEX RANGE SCAN | IDX_PAYABLEMONEY_02 | 273 | | 1966 (3)| 00:00:24 |
| 7 | VIEW | VW_SQ_1 | 12620 | 160K| 350 (3)| 00:00:05 |
|* 8 | HASH JOIN | | 12620 | 172K| 350 (3)| 00:00:05 |
| 9 | TABLE ACCESS FULL | MM_POLICY_EVENTS_TD2 | 12620 | 88340 | 166 (1)| 00:00:02 |
| 10 | INDEX FAST FULL SCAN | SYS_C00139261 | 372K| 2544K| 180 (3)| 00:00:03 |
| 11 | VIEW | | 536K| 6808K| 5983 (2)| 00:01:12 |
| 12 | UNION-ALL | | | | | |
|* 13 | TABLE ACCESS FULL | MM_INVPLY_TD | 437K| 5124K| 2997 (3)| 00:00:36 |
|* 14 | TABLE ACCESS FULL | MM_INVPLY_TD | 99039 | 773K| 2985 (2)| 00:00:36 |
| 15 | CONCATENATION | | | | | |
|* 16 | FILTER | | | | | |
|* 17 | INDEX RANGE SCAN | IDX_BATCHINFO_TEST | 1 | 48 | 3 (0)| 00:00:01 |
|* 18 | INDEX RANGE SCAN | IDX_BATCHINFO_TEST | 1 | 48 | 3 (0)| 00:00:01 |
|* 19 | INDEX RANGE SCAN | IDX_BATCHINFO_TI_TEST | 1 | 48 | 3 (0)| 00:00:01 |
|* 20 | HASH JOIN ANTI | | 1 | 109 | 5995 (2)| 00:01:12 |
|* 21 | TABLE ACCESS BY INDEX ROWID| MM_PAYABLEMONEY_TD | 1 | 96 | 7 (0)| 00:00:01 |
|* 22 | INDEX RANGE SCAN | IDX_PAYABLEMONEY_04 | 8 | | 3 (0)| 00:00:01 |
| 23 | VIEW | | 536K| 6808K| 5983 (2)| 00:01:12 |
| 24 | UNION-ALL | | | | | |
|* 25 | TABLE ACCESS FULL | MM_INVPLY_TD | 437K| 5124K| 2997 (3)| 00:00:36 |
|* 26 | TABLE ACCESS FULL | MM_INVPLY_TD | 99039 | 773K| 2985 (2)| 00:00:36 |
----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter( NOT EXISTS (SELECT /*+ */ 0 FROM "MM_BATCHINFO_TD" "MM_BATCHINFO_TD"???)
2 - filter("TP"."SEQPOLICY" IS NULL)
3 - access("P"."FATHERNO"="TP"."SEQPOLICY"(+))
4 - access("FATHERNO"="P"."FATHERNO")
5 - filter("P"."BASEAMOUNT"<"P"."BASEUSEDAMOUNT")
6 - access("P"."SUBCOMPANY"='015100' AND "P"."OPSTATUS"='0' AND "P"."BASEAMOUNT"<0.00)
filter("P"."BASEAMOUNT"<0.00 AND "P"."OPSTATUS"='0' AND ("P"."DATATYPE"='132' OR
"P"."DATATYPE"='304' OR "P"."DATATYPE"='313' OR "P"."DATATYPE"='316' OR "P"."DATATYPE"='321' OR
"P"."DATATYPE"='323' OR "P"."DATATYPE"='330' OR "P"."DATATYPE"='334' OR "P"."DATATYPE"='338' OR
"P"."DATATYPE"='342' OR "P"."DATATYPE"='346' OR "P"."DATATYPE"='350' OR "P"."DATATYPE"='351' OR
"P"."DATATYPE"='353' OR "P"."DATATYPE"='355' OR "P"."DATATYPE"='358' OR "P"."DATATYPE"='359' OR
"P"."DATATYPE"='362' OR "P"."DATATYPE"='364' OR "P"."DATATYPE"='365' OR "P"."DATATYPE"='367' OR
"P"."DATATYPE"='370' OR "P"."DATATYPE"='516' OR "P"."DATATYPE"='518' OR "P"."DATATYPE"='524' OR
"P"."DATATYPE"='528' OR "P"."DATATYPE"='532' OR "P"."DATATYPE"='535' OR "P"."DATATYPE"='538' OR
"P"."DATATYPE"='539' OR "P"."DATATYPE"='542' OR "P"."DATATYPE"='C04' OR "P"."DATATYPE"='C28' OR
"P"."DATATYPE"='C30' OR "P"."DATATYPE"='C53' OR "P"."DATATYPE"='C55' OR "P"."DATATYPE"='C58' OR
"P"."DATATYPE"='C59' OR "P"."DATATYPE"='C62' OR "P"."DATATYPE"='C64' OR "P"."DATATYPE"='C65' OR
"P"."DATATYPE"='C70' OR "P"."DATATYPE"='C74' OR "P"."DATATYPE"='C75' OR "P"."DATATYPE"='C76' OR
"P"."DATATYPE"='C79' OR "P"."DATATYPE"='C80' OR "P"."DATATYPE"='C83' OR "P"."DATATYPE"='F16' OR
"P"."DATATYPE"='F18' OR "P"."DATATYPE"='F24' OR "P"."DATATYPE"='F28' OR "P"."DATATYPE"='F32' OR
"P"."DATATYPE"='F35' OR "P"."DATATYPE"='F38' OR "P"."DATATYPE"='F39' OR "P"."DATATYPE"='F42' OR
"P"."DATATYPE"='Y32'))
8 - access("E2"."FATHERNO"="A"."SEQFEELIST")
13 - filter("I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
14 - filter("VATSEQPOLICY" IS NOT NULL AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND
"I"."OPSTATUS"<>'4')
16 - filter(:B1 IS NOT NULL)
17 - access("SERIALNO"=:B1 AND "POLICYNO"=:B2)
filter("OPSTATUS"<>'3')
18 - access("SERIALNO"=:B1 AND "POLICYNO"=:B2)
filter("OPSTATUS"<>'3' AND (LNNVL(:B1 IS NOT NULL) OR LNNVL("SERIALNO"=:B2)))
19 - access("POLICYNO"=:B1)
filter("STATUS"<>'4' AND ("SERIALNO"=:B1 OR :B2 IS NOT NULL AND "SERIALNO"=:B3))
20 - access("FATHERNO"="TD"."SEQPOLICY")
21 - filter((:B1 IS NULL AND "MM_PAYABLEMONEY_TD"."OFFSETNO"=:B2 OR :B3 IS NOT NULL AND
"MM_PAYABLEMONEY_TD"."CUSTSEQ"=:B4) AND "MM_PAYABLEMONEY_TD"."BASECURRENCYCODE"=:B5 AND
"MM_PAYABLEMONEY_TD"."UNITCODE"=:B6 AND "MM_PAYABLEMONEY_TD"."AMOUNT"=(-:B7) AND
"MM_PAYABLEMONEY_TD"."OPSTATUS"='0' AND "MM_PAYABLEMONEY_TD"."BASEAMOUNT">0.00 AND
TRIM("MM_PAYABLEMONEY_TD"."CUSTOMERCODE")=TRIM(:B8) AND ("MM_PAYABLEMONEY_TD"."DATATYPE"='122' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='302' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='311' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='314' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='319' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='325' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='328' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='332' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='336' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='340' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='344' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='348' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='352' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='354' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='356' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='357' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='360' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='361' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='363' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='366' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='367' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='370' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='502' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='504' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='506' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='508' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='512' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='514' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='522' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='526' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='534' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='536' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='537' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='540' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='541' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C02' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C28' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C30' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C54' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C56' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C57' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C60' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C61' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C63' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C66' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C68' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C72' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C75' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C77' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C78' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='C81' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='C82' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F02' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F04' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F06' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F08' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F12' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F14' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F22' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F26' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F34' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F36' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F37' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='F40' OR "MM_PAYABLEMONEY_TD"."DATATYPE"='F41' OR
"MM_PAYABLEMONEY_TD"."DATATYPE"='Y22'))
22 - access("MM_PAYABLEMONEY_TD"."POLICYNO"=:B1)
25 - filter("I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND "I"."OPSTATUS"<>'4')
26 - filter("VATSEQPOLICY" IS NOT NULL AND "I"."OPSTATUS"<>'3' AND "I"."OPSTATUS"<>'5' AND
"I"."OPSTATUS"<>'4')
优化后:
执行时间:1s
返回:0
反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例的更多相关文章
- mysql优化---in型子查询,exists子查询,from 型子查询
in型子查询引出的陷阱:(扫更少的行,不要临时表,不要文件排序就快) 题: 在ecshop商城表中,查询6号栏目的商品, (注,6号是一个大栏目) 最直观的: mysql); 误区: 给我们的感觉是, ...
- Mysql常用sql语句(19)- in / exists 子查询
测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 子查询在我们查询方法中是比较常用的,通过子查询可 ...
- in型子查询陷阱,exists子查询
in 型子查询引出的陷阱 select goods_id from goods where cat_id in (1,2,3) 直接用id,不包含子查询,不会中陷阱 题: 在ecshop商城表中,查询 ...
- not子查询中有null值的时候 not in 会失效
not in子查询中有null值的时候 not in 会失效 但是 in 的子查询中有null的 不会失效
- 7-14 EXISTS子查询
EXISTS: 只注重于子查询是否有返回行,如果查有返回行返回结果为值,否则为假 并不使用子查询的结果,仅用于测试子查询是否有返回结果. 语法: IF EXISTS (子查询) BEGIN 语句块 E ...
- mysql---where子查询、form子查询、exists子查询
1.什么是子查询? 当一个查询是另一个查询的条件时,称之为子查询. 2.子查询有什么好处? 子查询可以使用几个简单命令构造功能强大的复合命令. 那么,现在让我们一起来学习子查询. 3.where型的子 ...
- 关于T-SQL中exists或者not exists子查询的“伪优化”的做法
问题起源 在使用t-sql中的exists(或者not exists)子查询的时候,不知道什么时候开始,发现一小部分人存在一种“伪优化”的一些做法,并且向不明真相的群众传递这一种写法“优越性”,实在看 ...
- JOIN与EXISTS(子查询)的效率研究
使用MySQL提供的Sample数据库Sakila 现将profiling打开,用来一会查看sql执行时间 set profiling=1; exists 子查询与 join联接效率的对比,功能:查看 ...
- 标量子查询中有ROWNUM=1怎么改?
碰到标量子查询中有ROWNUM=1怎么改? select to_date(o.postdate,'yyyymmdd'), (select cur.c_code from cur_tbl cur whe ...
随机推荐
- 杭电acm5698-瞬间移动(2016"百度之星" - 初赛(Astar Round2B))
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5698 Problem Description 有一个无限大的矩形,初始时你在左上角(即第一行第一列), ...
- Ubuntu 12.04 设置终端字体为文泉驿(转载)
转自:http://my.oschina.net/uniquejava/blog/98480 0.说明 在gnome-terminal终端中看习惯了文泉驿微米黑字体,没想到从11.10升级到 ...
- linux文件名乱码时删除或改名的方式(转载)
转自:http://www.linuxsa.cn/when-linux-file-name-topsy-turvy-deleted-or-renamed.html linux文件名乱码时删除或改名的方 ...
- bzoj 4849: [Neerc2016]Mole Tunnels【模拟费用流】
参考:https://www.cnblogs.com/CQzhangyu/p/6952371.html 费用流很简单,考虑但是会T. 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点 ...
- bzoj 3675: [Apio2014]序列分割【斜率优化dp】
首先看这个得分方式,容易发现就相当于分k段,每段的值和两两乘起来. 这样就很容易列出dp方程:设f[i][j]为到j分成分成i段,转移是 \[ f[i][j]=max { f[k][j]+s[k]*( ...
- 水题 Codeforces Round #306 (Div. 2) A. Two Substrings
题目传送门 /* 水题:遍历一边先找AB,再BA,再遍历一边先找BA,再AB,两种情况满足一种就YES */ #include <cstdio> #include <iostream ...
- 题解报告:poj 2185 Milking Grid(二维kmp)
Description Every morning when they are milked, the Farmer John's cows form a rectangular grid that ...
- Android开发学习--MVP模式入门
1.模型与视图完全分离,我们可以修改视图而不影响模型2.可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部3.我们可以将一个Presenter用于多个视图,而不需要改变Pr ...
- Laravel环境搭建
在有了初步认知后,当然就要开始在自己的电脑上搭建Laravel的开发环境了. 系统环境需求 PHP 5.3.7或者更高版本,如果没有系统没有安装PHP环境的,请到下面地址下载:http://cn2.p ...
- AJPFX区分this和super
this和super的区别No.区别thissuper1操作属性this.属性:表示调用本类中的属性,如果本类中的属性不存在,则从父类查找super.属性:表示调用父类中的属性2操作方法this.方法 ...