2009-07-13 74 views
6

在T-SQL中速度更快嗎?IN or OR的快點有多快?

DELETE * FROM ... WHERE A IN (x,y,z) 

或者

DELETE * FROM ... WHERE A = x OR A = y OR A = z 

在我的情況x,y和z是用於存儲過程的輸入參數。我試圖盡我所能地獲得我的DELETE和INSERT語句的性能。

回答

11

「IN」將被轉換爲一系列的「或」 S ...如果你看的執行計劃的查詢與「IN」,你會看到它已經擴展它。

在我看來,使用「IN」更清晰,特別是在較大的查詢中,它使它更具可讀性。

+0

Thnx,在執行計劃中,我看到它將花費完全相同的CPU時間量。 – Zyphrax 2009-07-13 14:42:16

+0

這是不正確的。在沒有被翻譯作爲一個系列。您最好能夠分析您的查詢並實際查看結果。更多情況下EXISTS比IN更快。但OR *應該比兩者快。儘管如此,它依賴於索引。 – 2009-07-13 15:10:37

+0

@Frank,我們正在討論帶有值列表的IN,而不是帶有子查詢的IN。 – 2009-07-13 15:41:12

0

它必須是完全平等的。大部分RDMBS transalte INORs

當然,如果你考慮到翻譯從INsORs要高耗時,與ORs句子更快;-)

更新:我考慮A是一列。

1

如果A是一個計算,它將被執行一次使用IN和N次使用OR

14

不要想;個人資料。

我勸你不要依賴直覺,你的或任何其他人的,考慮到速度的問題時。相反,嘗試這兩種選擇,並進行某種分析/運行時間測量,並且找出,這在您的情況下更快。

4

寫兩個存儲過程,一個使用IN,另一個使用OR,在測試服務器上。運行每個過程10,000(或1,000,000,或其他)的時間,並比較時間。

總的來說,這幾乎是「唯一」的方法,以便對哪種方法更快的問題有一個很好的答案:編寫簡單的時序測試用例,並多次運行它們。

3

SQL Server中,優化器將爲這些查詢生成相同的計劃。

2

他們應該產生從我的經驗完全相同的計劃

在計劃看一看不管A是否是一個計算或列

1

,看起來像SQL Server 2005的IN轉換爲OR子句。

1

絕對最快在SQL Server是使用與INNER JOIN一個DELETE。有了三個值你就不會注意到這個差異,但是有了更多的價值(我們正在做幾千個),它們之間的差別就是現象。你可以將你的值存入一張臨時表,然後加入到這個表中。

E.g.

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

您還可以添加一個可選的where子句。