2013-07-18 68 views
1

以下哪種查詢更高效,爲什麼?根據執行計劃,它們都有相同的總成本,但我不確定這是否是一個很好的總體性能指標。我的哪個查詢更高效?

1>

SELECT MIN(ROWID), MAX(ROWID) 
FROM tab_a 
WHERE status = 0 
AND EXISTS (
    SELECT 'X' 
    FROM tab_b 
    WHERE status = 0 
    AND number = assembly_number 
    AND ROWID >= :min_rowid 
    AND ROWID <= :max_rowid 
) 
; 

2>

SELECT MIN(ROWID), MAX(ROWID) 
FROM tab_a 
WHERE status = 0 
AND assembly_number IN (
    SELECT number 
    FROM tab_b 
    WHERE status = 0 
    AND ROWID >= :min_rowid 
    AND ROWID <= :max_rowid 
) 
; 
+0

這將大大取決於表上的索引。 –

+0

@astander:真的嗎?有人會認爲查詢規劃者將它們視爲等價的(這似乎是這種情況,因爲它顯示了相同的成本)。 – Thilo

+0

你可以顯示兩者的執行計劃嗎? (看起來他們可能是相同的)。 – Thilo

回答

0

如果assembly_number被索引然後下面的查詢會更好。

SELECT MIN(ROWID), MAX(ROWID) 
FROM tab_a 
WHERE status = 0 
AND EXISTS (
    SELECT 'X' 
    FROM tab_b 
    WHERE status = 0 
    AND number = assembly_number 
    AND ROWID >= :min_rowid 
    AND ROWID <= :max_rowid 
); 
+1

你怎麼知道的? Oracle的優化器非常聰明,如果兩個查詢的執行計劃完全相同,我不會感到驚訝。 –

+0

那麼我在'status + number'上添加了索引。與上次計劃相比,成本有所下降。但是,我仍然對1和2查詢獲得相同的成本計劃。根據http://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:953229842074選擇簡單取決於內部或外部哪個查詢有更多的數據。在我的情況下,都有相同的數額。 – AppleGrew