簡體   English   中英

在Oracle中選擇語句性能

[英]Select statement performance in Oracle

我有這個查詢:

  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(使用全表掃描),但是沒有任何明顯的改進。

有任何想法嗎? 非常感謝! 菲利普

編輯:添加表別名

首先,檢查表統計信息並重新收集它們是否陳舊。 錯誤的統計信息通常會導致執行計划不理想。

嘗試將子查詢中的dtclie移到普通聯接中。 在您的實現中,它將針對主查詢返回的每一行運行,並且將影響性能。

嘗試使用/ * +有序* /提示並重新排列表的連接順序。

如果統計數據很好並且DTPOCE表多於幾行,請嘗試使用/ * + use_hash(DTPOCE)* /提示來消除嵌套循環。

並請使用ansi連接語法和表別名...它不應影響性能,但可以提高可讀性:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM