2017-04-07 309 views
1

有一個大型Oracle表A和下面的查詢使用比較大的全局臨時表TB全表掃描或索引掃描

UPDATE A 
SET  A.field0 = (SELECT SUM(TB.field0) 
        FROM TB 
        WHERE TB.field1 = A.field1 AND 
          TB.field2 = A.field2 AND 
          TB.field3 = 'value') 
WHERE EXIST (SELECT 1 
       FROM TB 
       WHERE TB.field1 = A.field1 AND 
         TB.field2 = A.field2 AND 
         TB.field3 = 'value'); 

基本上EXIST條件只是用來檢查記錄曾經存在過。現在對於這個查詢,如果A.field0A.field1上有索引,但是根本沒有TB上的索引,它會執行全表掃描還是索引掃描?此外,是否需要WHERE條件以及它的任何性能影響?

+2

確定查詢的執行計劃時會遇到太多因素。我們不知道索引,記錄數量,集羣等。與您的DBA交談或親自評估執行計劃。 – Cameron

回答

1

由於TB上沒有索引,因此SQL中的SELECT子查詢將用於TB上的全表掃描。如果TB表很大,在TB.field1上創建索引,TB.field2,TB.field3應該會顯着提高性能。

+0

正確,沒有TB的索引,需要全表掃描。 – unleashed

+0

@Arun謝謝,將索引放在全局臨時表上的任何潛在問題? – Dreamer

+1

我認爲應該沒問題,但我不是專家,所以我可能會錯。這裏是一個鏈接,討論這個http://stackoverflow.com/questions/941094/is-it-safe-to-put-an-index-on-an-oracle-temporary-table。也許@unleashed可以提供一些輸入 –