2012-12-15 30 views
1

我有一個非常奇怪的MSSQL查詢問題,用於存儲過程,但在這裏簡化以顯示問題的核心。在WHERE中有常量的SELECT語句的奇怪行爲

查詢以下

SELECT vs.fv_numer FROM win.v_sprzedaz vs 

觀是相當複雜的,但它需要大約2秒運行。 現在驚奇:

DECLARE @test=1 
SELECT vs.fv_numer FROM win.v_sprzedaz vs 
WHERE @test =1 

現在查詢執行需要... 15秒!

由於缺乏knowledege我沒有分析執行計劃中的細節(在兩種情況下是不同的,比較複雜)。任何想法爲什麼?

+2

Tyhat是你的確切查詢還是實際上將'@test = 1'謂詞與'AND'或'OR'組合成了另一個謂詞?另外如果你添加'OPTION(RECOMPILE)'? –

回答

0

猜測where子句導致視圖中使用的索引不被查閱。您需要將一些QUERY HINT放入視圖查詢中以強制執行它們。

不知道你的數據庫很難指責它。但對我來說,它的查詢計劃無法進行優化。

我解決這類問題的最佳方式是採取視圖的查詢,並逐步與@Test添加到它,看看有什麼變化,然後通過逐步去除條件,直至@test沒有什麼區別調查。然後你看到衝突。然後您需要研究如何最佳地添加優化,因爲這可能會影響視圖的其他用例。