2011-12-07 61 views
2

SQL查詢存在性能問題。 這是我的查詢帶參數的SQL Server性能問題

declare @siteId int,  
@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
    FROM product AS pro 
    INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
    INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = @siteId 
    AND pro.product_type <> 3 
print @totalCount 

這是需要6秒鐘的執行..

當我刪除參數如下

@totalCount int 

SELECT @totalCount = COUNT(DISTINCT pro.product_id) 
FROM product AS pro 
INNER JOIN product_to_category AS proCat ON pro.product_id = proCat.product_id 
INNER JOIN product_to_vendor proVen ON pro.product_id = proVen.product_id 
WHERE pro.site_id = 28 
AND pro.product_type <> 3 
print @totalCount 

,並再次執行查詢時,只需要2秒鐘。

有沒有一種方法來提高這樣的查詢性能? 爲什麼需要花時間爲參數賦值? 有任何意見....

+1

你有什麼索引在你的表上? – Taryn

+0

@Tharaka,您是否嘗試在運行硬編碼版本後立即重新運行查詢的參數化版本?如果是這樣,需要多長時間? –

+0

是product.site_id int? – gbn

回答

2

這不是一個參數,它是一個變量。

SQL Server不嗅出變量的值,因此它不知道在編譯時它將包含值28

添加OPTION (RECOMPILE)到您的查詢的末尾得到它重新編譯後的聲明變量的值已經被賦值,它應該生成一個更合適的執行計劃。

+0

我試過OPTION(RECOMPILE)。對於子存儲過程不適用於嵌套存儲過程。是否有其他解決方案? – Tharaka

+0

你把它加到查詢的末尾'... WHERE pro.site_id = @siteId AND pro.product_type <> 3 OPTION(RECOMPILE)' –