在Oracle中选择语句性能

时间:2015-08-28 07:56:27

标签: sql oracle performance

我有这个问题:

  SELECT a.rextnext,
         a.rextdata,
         a.rextnome,
         a.rextdomi,
         a.rextcdpo,
         a.rextcdps,
         a.rextdscp,
         a.rextnpol,
         a.rextvliq,
         a.rextcdce,
         b.tpobdspo,
         a.rextcoen,
         a.rextanan,
         a.rextibnr,
         a.rextinde,
         a.rextdaan,
         a.rextindp,
         a.rextviva,
         a.rextvirs,
         a.rexttirs,
         a.rexttien,
         a.rextpenh,
         DECODE (a.rextpenh,
                 'S', (SELECT clienif
                         FROM dtclie
                        WHERE cliecdcl = a.rextcoen),
                 NULL)
            rextnif,
         a.rextiban
    FROM MTREXT as a, MTTPOB as b, dtpoce as c
   WHERE     a.rextesta = '01'
         AND b.tpobcdpo = a.rextcdpo
         AND a.rextcdde = 100
         AND a.rextosin = 'R'
         AND a.rextdaic <= TO_CHAR (SYSDATE, 'YYYYMMDD')
         AND NVL (a.rextnif, 'A') = NVL (a.rextnif, 'A')
         AND a.rextcdde = c.pocecdde(+)
         AND a.rextnpol = c.pocenpol(+)
         AND a.rextcdce = c.pocecdce(+)
ORDER BY a.rextcdde, a.rextnpol, TO_NUMBER (c.poceccus)

...有了这个解释计划:

----------------------------------------------------                            
| Id  | Operation                      | Name      |                            
----------------------------------------------------                            
|   0 | SELECT STATEMENT               |           |                            
|   1 |  TABLE ACCESS BY INDEX ROWID   | DTCLIE    |                            
|   2 |   INDEX UNIQUE SCAN            | PK_DTCLIE |                            
|   3 |  SORT ORDER BY                 |           |                            
|   4 |   NESTED LOOPS OUTER           |           |                            
|   5 |    HASH JOIN                   |           |                            
|   6 |     TABLE ACCESS BY INDEX ROWID| MTREXT    |                            
|   7 |      INDEX RANGE SCAN          | MTREXT99  |                            
|   8 |     TABLE ACCESS FULL          | MTTPOB    |                            
|   9 |    TABLE ACCESS BY INDEX ROWID | DTPOCE    |                            
|  10 |     INDEX UNIQUE SCAN          | PK_DTPOCE |                            
----------------------------------------------------

我试图提高性能。我在条件AND NVL (rextnif, 'A') = NVL (rextnif, 'A')中添加了这个以强制使用MTREXT99索引(rextcdde,rextosin,rextnif)。如果没有这个,我们就不会使用索引。 但仍然有较低的表现。表MTREXT有500万条记录。此查询在2分半钟内运行,仅返回8行。

为了测试,我已从此查询中删除了MTTPOB(使用全表扫描),但我没有得到任何重大改进。

有什么想法吗? 非常感谢! 菲利普

编辑:添加了表别名

1 个答案:

答案 0 :(得分:0)

首先,检查您的表统计信息,如果它们过时则重新收集它们。错误的统计数据通常会导致执行计划不理想。

尝试将子查询移动到DECODE中的dtclie到普通连接。通过实现,它将针对主查询返回的每一行运行,并将影响性能。

尝试使用/ * + ordered * / hint并重新排列表连接顺序。

如果统计数据很好并且DTPOCE表格超过几行,请尝试使用/ * + use_hash(DTPOCE)* /提示来消除嵌套循环。

请使用ansi join语法和表别名......它不应该影响性能,但会提高可读性:)