2012-08-07 70 views
3

假設我有一個T-SQL語句:T-SQL不等於運營商VS Case語句

select * from MyTable 
where Code != 'RandomCode' 

我一直在負責製作這種WHERE語句更快速地執行。聯機叢書表示,正面查詢(=)比負面(= =,<>)更快。

因此,一種選擇是將其變爲CASE語句,例如,

select * from MyTable 
where 
    case when Code = 'RandomCode' then 0 
     else 1 end = 1 

有誰知道這是否可以預期會比原來的T-SQL更快或更慢?

在此先感謝。

+0

我沒有看到!=會比=慢,除了解析器中有額外的額外開銷字符。最後,在cpu級別,這是一個單一的'cmp'類型的指令,之後有'jmp/je/jne'跳轉。如果這1個字節對你的代碼產生了巨大的影響,那麼無論你在做什麼都遠遠高於本網站的水平。 – 2012-08-07 04:19:20

+1

使用查詢計劃分析器來檢查或分析器。 – 2012-08-07 04:20:24

+0

我非常贊同上述兩種觀點。也就是說,'CASE'選項看起來過於複雜。有條件的地方應該避免使用條款,因爲它們可能會使查詢計劃分裂(不是在這種情況下 - 不是雙關語意圖)。 – 2012-08-07 04:24:29

回答

6

您必須更具體地瞭解您對錶格感興趣的信息以及Code列的可能值。然後,您可以創建適當的索引以加快查詢速度。

SELECT * FROM MyTable WHERE Code = 'OtherCode' OR Code = 'YetAnotherCode' 

當然,你需要對Code指數:

例如,如果在Code列的值只能是'RandomCode'之一,'OtherCode''YetAnotherCode',您可以重新編寫查詢柱。

如果你要做一個不平等的查詢,您可以更改SELECT *像更窄的查詢:

SELECT Id, Name, Whatever FROM MyTable WHERE Code != 'RandomCode' 

然後創建一個索引:

CREATE INDEX idx_Code ON MyTable(Code) INCLUDE (Id,Name,Whatever) 

這樣可以減少I/O通過用索引掃描替換表掃描。

+0

謝謝,這非常有幫助。 – Mikaere 2012-08-07 22:46:41