Sql 查询性能重新定义

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

我使用的是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 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”)
也许查询还有其他类型的问题,但我关注的是
语句。这就是问题所在

如何转换此
语句并提高性能?我