Sql 查询性能重新定义
我使用的是Oracle数据库:Oracle数据库11g企业版11.2.0.4.0-64位产品。 我有一个查询不是很好的性能:Sql 查询性能重新定义,sql,oracle,performance,Sql,Oracle,Performance,我使用的是Oracle数据库:Oracle数据库11g企业版11.2.0.4.0-64位产品。 我有一个查询不是很好的性能: SELECT COUNT (1) FROM SGSS.MTLIDO L2 WHERE L2.LIDODOID IN (SELECT DISTINCT L1.LIDODOID FROM SGSS.MTREXT R1 INNER JO
SELECT COUNT (1)
FROM SGSS.MTLIDO L2
WHERE L2.LIDODOID IN
(SELECT DISTINCT L1.LIDODOID
FROM SGSS.MTREXT R1
INNER JOIN SGSS.MTDEXT D1
ON ( D1.DEXTCDDE = R1.REXTCDDE
AND D1.DEXTNEXT = R1.REXTNEXT)
INNER JOIN SGSS.MTLIDO L1
ON ( D1.DEXTCDDE = L1.LIDOCDDE
AND D1.DEXTNUSI = L1.LIDONUSI
AND D1.DEXTNUAU = L1.LIDONUAU
AND D1.DEXTNUGR = L1.LIDONUGR
AND D1.DEXTTIEN = L1.LIDOTIEN)
WHERE R1.REXTCDDE = 1
AND R1.REXTSIMC = '1'
AND R1.REXTNREC = '1')
AND (NOT EXISTS
(SELECT 1
FROM SGSS.MTDEXT D2
INNER JOIN SGSS.MTEXAS ON (EXASNEXT = DEXTNEXT)
INNER JOIN SGSS.MTREXT R2
ON ( D2.DEXTCDDE = R2.REXTCDDE
AND D2.DEXTNEXT = R2.REXTNEXT)
WHERE D2.DEXTCDDE = L2.LIDOCDDE
AND D2.DEXTNUSI = L2.LIDONUSI
AND D2.DEXTNUAU = L2.LIDONUAU
AND D2.DEXTNUGR = L2.LIDONUGR
AND D2.DEXTTIEN = L2.LIDOTIEN
AND r2.REXTESTA NOT IN ('03')))
OR EXISTS
( (SELECT 1
FROM SGSS.MTDEXT D2
INNER JOIN SGSS.MTREXT R2
ON ( D2.DEXTCDDE = R2.REXTCDDE
AND D2.DEXTNEXT = R2.REXTNEXT)
WHERE D2.DEXTCDDE = L2.LIDOCDDE
AND D2.DEXTNUSI = L2.LIDONUSI
AND D2.DEXTNUAU = L2.LIDONUAU
AND D2.DEXTNUGR = L2.LIDONUGR
AND D2.DEXTTIEN = L2.LIDOTIEN
AND r2.REXTESTA NOT IN ('08',
'04',
'03',
'09')));
解释计划:
-------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 32 | 345M (1)| 03:09:55 |
| 1 | SORT AGGREGATE | | 1 | 32 | | |
|* 2 | FILTER | | | | | |
| 3 | TABLE ACCESS FULL | MTLIDO | 49M| 1499M| 408K (4)| 00:00:14 |
| 4 | NESTED LOOPS | | 1 | 45 | 7 (0)| 00:00:01 |
| 5 | NESTED LOOPS | | 1 | 45 | 7 (0)| 00:00:01 |
|* 6 | TABLE ACCESS BY INDEX ROWID | MTDEXT | 1 | 32 | 5 (0)| 00:00:01 |
|* 7 | INDEX RANGE SCAN | MTDEXT_TESTE | 1 | | 4 (0)| 00:00:01 |
|* 8 | INDEX UNIQUE SCAN | PK_MTREXT | 1 | | 1 (0)| 00:00:01 |
|* 9 | TABLE ACCESS BY INDEX ROWID | MTREXT | 1 | 13 | 2 (0)| 00:00:01 |
| 10 | NESTED LOOPS | | 1 | 91 | 10 (0)| 00:00:01 |
| 11 | NESTED LOOPS | | 1 | 91 | 10 (0)| 00:00:01 |
| 12 | NESTED LOOPS | | 1 | 59 | 6 (0)| 00:00:01 |
|* 13 | INDEX RANGE SCAN | MTREXT08 | 1 | 27 | 3 (0)| 00:00:01 |
|* 14 | TABLE ACCESS BY INDEX ROWID| MTDEXT | 1 | 32 | 4 (0)| 00:00:01 |
|* 15 | INDEX RANGE SCAN | MTDEXT04 | 13 | | 3 (0)| 00:00:01 |
|* 16 | INDEX RANGE SCAN | MTLIDO03 | 1 | | 3 (0)| 00:00:01 |
|* 17 | TABLE ACCESS BY INDEX ROWID | MTLIDO | 1 | 32 | 4 (0)| 00:00:01 |
| 18 | NESTED LOOPS | | 1 | 51 | 9 (0)| 00:00:01 |
| 19 | NESTED LOOPS | | 1 | 51 | 9 (0)| 00:00:01 |
| 20 | NESTED LOOPS | | 1 | 38 | 7 (0)| 00:00:01 |
|* 21 | TABLE ACCESS BY INDEX ROWID| MTDEXT | 1 | 32 | 5 (0)| 00:00:01 |
|* 22 | INDEX RANGE SCAN | MTDEXT_TESTE | 1 | | 4 (0)| 00:00:01 |
|* 23 | INDEX RANGE SCAN | MTEXAS_01 | 1 | 6 | 2 (0)| 00:00:01 |
|* 24 | INDEX UNIQUE SCAN | PK_MTREXT | 1 | | 1 (0)| 00:00:01 |
|* 25 | TABLE ACCESS BY INDEX ROWID | MTREXT | 1 | 13 | 2 (0)| 00:00:01 |
-------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter( EXISTS (SELECT 0 FROM "SGSS"."MTREXT" "R2","SGSS"."MTDEXT" "D2" WHERE
"D2"."DEXTNUAU"=:B1 AND "D2"."DEXTNUSI"=:B2 AND "D2"."DEXTCDDE"=:B3 AND
"D2"."DEXTNUGR"=:B4 AND "D2"."DEXTTIEN"=:B5 AND "D2"."DEXTNEXT"="R2"."REXTNEXT" AND
"R2"."REXTCDDE"=:B6 AND "R2"."REXTESTA"<>'04' AND "R2"."REXTESTA"<>'09' AND
"R2"."REXTESTA"<>'03' AND "R2"."REXTESTA"<>'08' AND "D2"."DEXTCDDE"="R2"."REXTCDDE") OR
EXISTS (SELECT 0 FROM "SGSS"."MTLIDO" "L1","SGSS"."MTDEXT" "D1","SGSS"."MTREXT" "R1"
WHERE "R1"."REXTNREC"=1 AND "R1"."REXTSIMC"='1' AND "R1"."REXTCDDE"=1 AND
"D1"."DEXTNEXT"="R1"."REXTNEXT" AND "D1"."DEXTCDDE"=1 AND
"D1"."DEXTTIEN"="L1"."LIDOTIEN" AND "D1"."DEXTNUGR"="L1"."LIDONUGR" AND
"D1"."DEXTNUAU"="L1"."LIDONUAU" AND "D1"."DEXTNUSI"="L1"."LIDONUSI" AND
"L1"."LIDOCDDE"=1 AND "L1"."LIDODOID"=:B7) AND NOT EXISTS (SELECT 0 FROM
"SGSS"."MTREXT" "R2","SGSS"."MTEXAS" "MTEXAS","SGSS"."MTDEXT" "D2" WHERE
"D2"."DEXTNUAU"=:B8 AND "D2"."DEXTNUSI"=:B9 AND "D2"."DEXTCDDE"=:B10 AND
"D2"."DEXTNUGR"=:B11 AND "D2"."DEXTTIEN"=:B12 AND "EXASNEXT"="DEXTNEXT" AND
"D2"."DEXTNEXT"="R2"."REXTNEXT" AND "R2"."REXTCDDE"=:B13 AND "R2"."REXTESTA"<>'03' AND
"D2"."DEXTCDDE"="R2"."REXTCDDE"))
6 - filter("D2"."DEXTNUGR"=:B1 AND "D2"."DEXTTIEN"=:B2)
7 - access("D2"."DEXTCDDE"=:B1 AND "D2"."DEXTNUSI"=:B2 AND "D2"."DEXTNUAU"=:B3)
8 - access("D2"."DEXTNEXT"="R2"."REXTNEXT")
9 - filter("R2"."REXTCDDE"=:B1 AND "R2"."REXTESTA"<>'04' AND "R2"."REXTESTA"<>'09'
AND "R2"."REXTESTA"<>'03' AND "R2"."REXTESTA"<>'08' AND "D2"."DEXTCDDE"="R2"."REXTCDDE")
13 - access("R1"."REXTCDDE"=1 AND "R1"."REXTSIMC"='1' AND "R1"."REXTNREC"=1)
14 - filter("D1"."DEXTCDDE"=1)
15 - access("D1"."DEXTNEXT"="R1"."REXTNEXT")
16 - access("L1"."LIDOCDDE"=1 AND "D1"."DEXTNUSI"="L1"."LIDONUSI" AND
"D1"."DEXTNUAU"="L1"."LIDONUAU" AND "D1"."DEXTNUGR"="L1"."LIDONUGR" AND
"D1"."DEXTTIEN"="L1"."LIDOTIEN")
17 - filter("L1"."LIDODOID"=:B1)
21 - filter("D2"."DEXTNUGR"=:B1 AND "D2"."DEXTTIEN"=:B2)
22 - access("D2"."DEXTCDDE"=:B1 AND "D2"."DEXTNUSI"=:B2 AND "D2"."DEXTNUAU"=:B3)
23 - access("EXASNEXT"="DEXTNEXT")
24 - access("D2"."DEXTNEXT"="R2"."REXTNEXT")
25 - filter("R2"."REXTCDDE"=:B1 AND "R2"."REXTESTA"<>'03' AND
"D2"."DEXTCDDE"="R2"."REXTCDDE")
-------------------------------------------------------------------------------------------------
|Id |操作|名称|行|字节|成本(%CPU)|时间|
-------------------------------------------------------------------------------------------------
|0 | SELECT语句| 1 | 32 | 345M(1)| 03:09:55|
|1 |分类汇总| | 1 | 32 | ||
|*2 |过滤器| | | | ||
|3 |表访问完整| MTLIDO | 49M | 149m | 408K(4)| 00:00:14|
|4 |嵌套循环| | 1 | 45 | 7(0)| 00:00:01|
|5 |嵌套循环| | 1 | 45 | 7(0)| 00:00:01|
|*6 |按索引ROWID访问表| MTDEXT | 1 | 32 | 5(0)| 00:00:01|
|*7 |索引范围扫描| MTDEXT | U测试| 1 | | 4(0)| 00:00:01|
|*8 |索引唯一扫描| PK|U MTREXT | 1 | 1(0)| 00:00:01|
|*9 |按索引ROWID的表访问| MTREXT | 1 | 13 | 2(0)| 00:00:01|
|10 |嵌套循环| | 1 | 91 | 10(0)| 00:00:01|
|11 |嵌套循环| | 1 | 91 | 10(0)| 00:00:01|
|12 |嵌套循环| | 1 | 59 | 6(0)| 00:00:01|
|*13 |索引范围扫描| MTREXT08 | 1 | 27 | 3(0)| 00:00:01|
|*14 |按索引ROWID访问表| MTDEXT | 1 | 32 | 4(0)| 00:00:01|
|*15 |索引范围扫描| MTDEXT04 | 13 | | 3(0)| 00:00:01|
|*16 |索引范围扫描| MTLIDO03 | 1 | | 3(0)| 00:00:01|
|*17 |按索引ROWID访问表| MTLIDO | 1 | 32 | 4(0)| 00:00:01|
|18 |嵌套循环| | 1 | 51 | 9(0)| 00:00:01|
|19 |嵌套循环| | 1 | 51 | 9(0)| 00:00:01|
|20 |嵌套循环| | 1 | 38 | 7(0)| 00:00:01|
|*21 |按索引ROWID访问表| MTDEXT | 1 | 32 | 5(0)| 00:00:01|
|*22 |索引范围扫描| MTDEXT | U测试| 1 | | 4(0)| 00:00:01|
|*23 |索引范围扫描| MTEXAS|U 01 | 1 | 6 | 2(0)| 00:00:01|
|*24 |索引唯一扫描| PK | U MTREXT | 1 | | 1(0)| 00:00:01|
|*25 |按索引ROWID的表访问| MTREXT | 1 | 13 | 2(0)| 00:00:01|
-------------------------------------------------------------------------------------------------
谓词信息(由操作id标识):
---------------------------------------------------
2-筛选器(存在)(从“SGSS”“MTREXT”“R2”“SGSS”“MTDEXT”“D2”中选择0,其中
“D2”。“DEXTNUAU”=:B1和“D2”。“DEXTNUSI”=:B2和“D2”。“DEXTCDDE”=:B3和”
“D2”。“DEXTNUGR”=:B4和“D2”。“Dextien”=:B5和“D2”。“DEXTNEXT”=“R2”。“REXTNEXT”和
“R2”。“REXTCDDE”=:B6和“R2”。“REXTESTA”04和“R2”。“REXTESTA”09和
“R2”“REXTESTA”“03”和“R2”“REXTESTA”“08”和“D2”“DEXTCDDE”“R2”“REXTCDDE”)或
存在(从“SGSS”“MTLIDO”“L1”“SGSS”“MTDEXT”“D1”“SGSS”“MTREXT”“R1”中选择0)
其中“R1”。“RextRec”=1和“R1”。“REXTSIMC”=1和“R1”。“REXTCDDE”=1和
“D1”。“DEXTNEXT”=“R1”。“REXTNEXT”和“D1”。“DEXTCDDE”=1和”
“D1”。“Dextien”=“L1”。“LIDOTIEN”和“D1”。“DEXTNUGR”=“L1”。“LIDONUGR”和
“D1”。“DEXTNUAU”=“L1”。“Lidonauu”和“D1”。“DEXTNUSI”=“L1”。“LIDONUSI”和
“L1”。“LIDOCDDE”=1和“L1”。“LIDODOID”=:B7)并且不存在(从中选择0
“SGSS”“MTREXT”“R2”“SGSS”“MTEXAS”“MTEXAS”“SGSS”“MTDEXT”“D2”其中
“D2”。“DEXTNUAU”=:B8和“D2”。“DEXTNUSI”=:B9和“D2”。“DEXTCDDE”=:B10和”
“D2”。“DEXTNUGR”=:B11和“D2”。“dextien”=:B12和“EXASNEXT”=“DEXTNEXT”和
“D2”“DEXTNEXT”“R2”“REXTNEXT”“R2”“REXTCDDE”“B13和“R2”“REXTESTA”“03”和”
“D2”“DEXTCDDE”“R2”“REXTCDDE”))
6-过滤器(“D2”。“DEXTNUGR”=:B1和“D2”。“Dextien”=:B2)
7-访问(“D2”。“DEXTCDDE”=:B1和“D2”。“DEXTNUSI”=:B2和“D2”。“DEXTNUAU”=:B3)
8-访问(“D2”“DEXTNEXT”“R2”“REXTNEXT”)
9-过滤器(“R2”。“REXTCDDE”=:B1和“R2”。“REXTESTA”'04'和“R2”。“REXTESTA”'09'
以及“R2”。“REXTESTA”“03”和“R2”。“REXTESTA”“08”和“D2”。“DEXTCDDE”“R2”。“REXTCDDE”)
13-访问(“R1”。“REXTCDDE”=1和“R1”。“REXTSIMC”=1和“R1”。“RextRec”=1)
14-过滤器(“D1”。“DEXTCDDE”=1)
15-访问(“D1”“DEXTNEXT”“R1”“REXTNEXT”)
16-访问(“L1”。“LIDOCDDE”=1和“D1”。“DEXTNUSI”=L1.“LIDONUSI”和
“D1”。“DEXTNUAU”=“L1”。“Lidonauu”和“D1”。“DEXTNUGR”=“L1”。“LIDONUGR”和
“D1”“Dextien”“L1”“LIDOTIEN”)
17-过滤器(“L1”。“LIDODOID”=:B1)
21-过滤器(“D2”。“DEXTNUGR”=:B1和“D2”。“dextien”=:B2)
22-访问(“D2”。“DEXTCDDE”=:B1和“D2”。“DEXTNUSI”=:B2和“D2”。“DEXTNUAU”=:B3)
23-访问(“EXASNEXT”=“DEXTNEXT”)
24-访问(“D2”“DEXTNEXT”“R2”“REXTNEXT”)
25-过滤器(“R2”。“REXTCDDE”=:B1和“R2”。“REXTESTA”'03'和
“D2”“DEXTCDDE”“R2”“REXTCDDE”)
也许查询还有其他类型的问题,但我关注的是或语句。这就是问题所在
如何转换此或语句并提高性能?我