2011-07-11 42 views
14

比方說,你有一個觀點:爲什麼把一個WHERE外界看來子句中有可怕的性能

CREATE VIEW dbo.v_SomeJoinedTables AS 
SELECT 
    a.date, 
    a.Col1, 
    b.Col2, 
    DENSE_RANK() 
     OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something 
FROM a JOIN b on a.date = b.date 

我發現的性能:

SELECT * 
FROM v_SomeJoinedTables 
WHERE date > '2011-01-01' 

差多少
SELECT *, 
    DENSE_RANK() 
    OVER(PARTITION BY a.date, a.Col2 ORDER BY a.Col3) as Something 
FROM a JOIN b ON a.date = b.date 
WHERE a.date > '2011-01-01' 

我很驚訝這兩個語句的查詢計劃是不一樣的。

我也嘗試過使用內聯表值功能,但查詢仍然需要比複製和粘貼視圖邏輯的代碼長100-1000倍。

任何想法?

+2

那麼查詢計劃是什麼樣的?你是否缺少索引?該視圖是否返回太多行?如果where子句被應用在錯誤的地方? –

+1

你的觀點恰好是在調用一個視圖嗎? – HLGEM

+0

如果您的視圖不包含窗口功能,會發生什麼情況?什麼是一個VIEW的預期語義結果計算整個集合的排名,但是對該視圖的查詢會添加一個新的條件 - 如果RANK insde應用在外部條件之前或之後, – ErikE

回答

15

它被稱爲「Predicate pushing」aka延期過濾。

SQL Server並不總是認識到WHERE可以在視圖內有效地應用「更早」。

它在SQL Server 2008中已被緩解,以按預期方式工作更多

+0

很好的參考。這真是太可怕了。它證實了我的疑慮,即SQL Server從未對SQL中的TOP關鍵字概念感到滿意。一個人真的不需要知道這些東西來編寫優化的查詢。 – dkretz

+0

我完全驚訝地發現SQL Server 2005處理RANK函數有多糟糕。真的應該是一個修補程序,不需要升級到SQL 2008. – bpeikes

+0

@bpeikes:是的,請參閱http://stackoverflow.com/q/4230838/27535並在這裏評論:http://stackoverflow.com/q/2798094/27535 – gbn

2

我不是一個SQL專家,所以我可能會被否決了我的愚蠢,但我的猜測是,在第一種情況下SQL的WHERE子句中應用謂詞之前獲取的整個視圖的結果。因此,當您查詢視圖時,它將選擇所有記錄,將它們放入內存中,然後在完成後應用Date過濾器。

這似乎與在WHERE中應用篩選器之前獲取聯接中指定的整個數據集的方式類似(這裏的教訓是,如果可能,應在您的ON子句中應用謂詞)。

除非視圖以某種方式被區別對待。

+0

+1我認爲你是對的。也許統計數據已關閉,您必須通過比較每個查詢的估計/實際計劃進行驗證,但很可能在應用過濾器之前,來自視圖的查詢實現了整個連接,而外部查詢可以使用過濾器如果它可以消除先前連接的一側的行,請選擇更高效的連接類型。 –

+0

視圖只是完整表達式的簡寫。如果它們不是同等優化的話,它們就沒有多大用處。 – dkretz

+0

+1你是正確的,我的答案顯示*爲什麼* – gbn

-1

作爲解決方法,我建議使用函數而不是視圖,以便您可以傳入數據參數。

1

從技術上講,您不是在相同的SQL語句之間進行比較。您的視圖表明它返回a.date, a.Col1, b.Col2,加上您的DENSE_RANK()函數。在沒有視圖的查詢中,您將返回所有列。

起初,您可能認爲返回所有列會更糟。但如果不知道包括索引在內的表結構是什麼樣子,很難確定哪個更好。

您是否比較了每條語句的查詢計劃?

+0

幾乎有效......視圖較慢,這是問題的要點。即使內聯查詢是由SELECT * – gbn

2

OVER()語法在SS2005中是全新的,顯然沒有很好地集成到優化器中。我建議你嘗試一個更傳統的表達方式?可能不是一個表達,如果你關心優化。

http://www.sqlteam.com/article/sql-sever-2005-using-over-with-aggregate-functions

或者,更好,變得有點更熟悉的探查 - 的觀點應該是可以解決的。

+0

FYI「有障礙」,我的鏈接表明這個問題已得到解決。也看到這個(評論太)http://stackoverflow.com/q/2798094/27535 – gbn

+0

也許,但也許不與他的網站/版本。當實施如此惡劣以至於您需要了解您或我知道的所有可靠工作時,這並不是很好。 – dkretz

+0

確實。而像你這樣的民謠者我傾向於不使用意見,所以不會每天都看到它...... – gbn

相關問題