2012-09-27 46 views
0

汽車是一個有CarType列的表。 CarType非空,可以包含2個值。 CarDonated和CarSold。哪個查詢具有更好的性能 - 帶有case語句的where子句?

我們從報告中傳入參數以包含所有CarTypes或特定CarType(如CarDonated)。

方案1中的參數傳入'Car'(對於所有CarTypes),'CarD'對於CarDonated,對於CarSold'CarS'。

select * 
from Cars c 
where c.CarType like @CarTypeParam + '%' 

OR

參數表示腳本2道次在 '0'(對於所有CarTypes), 'CarDonated', 'CarSold'

select * 
from Cars c 
where c.CarType = case when @CarTypeParam = '0' 
        then c.CarType 
        else @CarTypeParam 
        end 

哪個場景/編碼方法更好?我不太熟悉where子句中的case語句。在這兩種情況下,優化器是否仍然能夠在CarType上使用索引?哪個編碼更好?

的SQL Server 2008 R2(與沿SSRS)

回答

1

第一個是作爲潛在CarType like @CarTypeParam + '%'稍好至少可以做的範圍上CarType索引查找而CASE表達是完全unsargable。

只有50%的選擇性,索引不太可能被使用,儘管除非您碰巧有一個索引包含查詢中所有列的前導列CarType

+1

目前CASE也不會工作,因爲它測試c.CarType +'%'的相等性,而不是使用LIKE –

+0

@AlexK。 ,哎呀,這是一個錯字。應該只是「c.CarType」。固定。 – Gabe

+0

@MartinSmith,如果CarType上沒有索引,那麼兩者之間的性能會有很大差異嗎? – Gabe

1

Gabe - 確定這個最好的方法是自己測試一下。查看爲兩者生成的查詢計劃,並確保至少兩個查詢都在進行搜索而不是掃描。然後,我會在使用Profiler監視服務器時運行這些查詢,以檢查每個正在執行的讀取次數,以及哪些可能會使用更多的整體資源。對於您正在編寫的任何查詢來說,這都是很好的建議