反连接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 ...
随机推荐
- bzoj 1601: [Usaco2008 Oct]灌水【最小生成树】
挺有意思的思路 如果不能自己打井,那么就是MST裸题了,考虑转换一下,自己打井就相当于连接一口虚拟的井(地下水?),所有井i到这口井的距离是w[i],这样把所有边排个序跑MST即可 #include& ...
- MongoDB集群跨网络、跨集群同步方案
MongoDB集群跨网络.跨集群数据同步有以下几个方案,此处只是简单介绍,不过详细描述. 1.MongoDB自带的复制方案 优点:实施简单,不需要额外的技术栈 缺点:网络双向可连通. 2.CDC同步方 ...
- 【转】Spring,Spring MVC及Spring Boot区别
对于一个Java开发者来说,Spring可谓如雷贯耳,无论是Spring框架,还是Spring引领的IOC,AOP风格,都对后续Java开发产生的深远的影响,同时,Spring社区总能及时响应开发者的 ...
- setsockopt()函数功能介绍
功能描述: 获取或者设置与某个套接字关联的选 项.选项可能存在于多层协议中,它们总会出现在最上面的套接字层.当操作套接字选项时, 选项位于的层和选项的名称必须给出.为了操作套接字层的选项,应该 将层的 ...
- Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
以后每做完一场CF,解题报告都写在一起吧 暴力||二分 A - Bear and Elections 题意:有n个候选人,第一个候选人可以贿赂其他人拿到他们的票,问最少要贿赂多少张票第一个人才能赢 ...
- Java中的流(1)流简介
简介 1.在java中stream代表一种数据流(源),java.io的底层数据元.(比作成水管)2.InputStream 比作进水管,水从里面流向你,你要接收,read3.OutputStream ...
- python vs java的rsa加密
首先:java的加密解密模块需要更加精细的算法细节指定 java的加密方式 javax.crypto.Cipher,定义的获取方式 tatic Cipher getInstance(String tr ...
- echart动态加载数据
<!DOCTYPE html> <head> <meta charset="utf-8"> <title>EChar ...
- 程序猿工具——svn
一个项目的产生,都需要团队中的开发人员互相协作.它的简单,方便深深吸引了我. svn的使用,有2部分组成--svn服务器.svn客户端.svn服务器一般团队之间只要有一个安装就可以了. 在学习安装sv ...
- NBA15-16赛季半程有感
2015-2016 新赛季NBA已经开打半程又多了,这半个赛季我们见证了 勇士的三节打卡:骑士的磨合反复:马刺的老骥伏枥: 当然还有窝火的XJBD. 豪哥200W刀签约黄蜂,打出来800W刀的身价,无 ...