2015-03-13 41 views
2

我應該以最常見的情況開始CASE順序條件嗎?假設在我的數據庫中有3個產品。產品編號1.代表所有病例的70%,產品編號2代表29%的案例和產品編號。 1%的病例。SQL中CASE的性能是否與案例的頻率有關?

這是關於性能的最佳條件順序嗎?

SELECT 
    CASE 
     WHEN Product=1 THEN 'Most popular case' 
     WHEN Product=2 THEN 'Not very popular' 
     WHEN Product=3 THEN 'Very rare case' 
    END AS Frequency 

只是很好理解。這是糟糕的順序嗎?

SELECT 
    CASE 
     WHEN Product=3 THEN 'Very rare case' 
     WHEN Product=2 THEN 'Not very popular' 
     WHEN Product=1 THEN 'Most popular case' 
    END AS Frequency 

我知道的情況下,聲明事項的查詢執行的順序,並儘快退出如發現第一個真正的條件。但我的問題是關於CASE的頻率。

+3

我想你是低估了查詢優化器。在我看來,最好專注於編寫正確和可讀的SQL查詢,而不是微觀優化具有可疑收益的事物。 – 2015-03-13 09:38:23

+0

很容易檢查哪些案例最受歡迎,並將其置於查詢之上。我只想確認它是否重要。 – 2015-03-13 09:41:25

+0

優化'SELECT'通常不是那麼重要,因爲您應該更關心'WHERE'必須首先找到記錄。因此,如果您有十億條記錄,而您的選擇會返回其中的十條,那麼您正在優化這10條記錄。 – 2015-03-13 09:42:40

回答

-1

在這個例子中CASE語句順序的實際影響很小。查詢優化器將自行決定最優執行計劃是什麼,並據此採取行動。

如果你真的對CASE語句本身感到疑惑,那麼就像你說的,如果CASE在它發現它的第一個真值後退出,那麼首先評估一個更常見的事件會更有可能在理論上縮短執行時間。

所以是的,如果有一個具有較高發生概率的CASE,也會增加運行時間較短的機會。但它並不能保證它,這個晦澀的案例可能仍然存在,並且最後被評估,導致執行時間更長。根據您的數據,這可能會有所不同,確保執行兩個版本並平均時間來查看哪一個更適合您。

編輯:(如果您想控制執行流程):您可以在CASE文檔中閱讀:CASE表達式不能用於控制Transact-SQL語句,語句塊,用戶定義語句的執行流程,定義的函數和存儲過程。