2014-07-10 89 views
0

我有一個表「標籤」的數據如:SQL SELECT條件的性能

id | value 
--------------- 
1 | Germany 
2 | Argentina 
3 | Brasil 
4 | Holland 

什麼方式的選擇是通過perfomane更好?

1. SELECT * FROM Tab WHERE value IN ('Argentina', 'Holland') 

2. SELECT * FROM Tab WHERE id IN (2, 4) 

我想,第二選擇會更快,因爲INT比較比字符串快。這對於MS SQL來說是否正確?

+1

您應該使用查詢分析器。 'Id'字段是主鍵嗎? – christiandev

+0

ID不是主 –

+2

沒有足夠的信息來回答。桌子上有索引嗎?首要的關鍵?這張桌子有多大?你看過執行計劃嗎?這裏給出的例子是如此微不足道,它不會有所作爲。 – alroc

回答

2

這太長了評論。

這是一個不成熟的優化。整數和字符串之間的比較通常會對查詢性能產生最小的影響。查詢性能的驅動因素更多地沿着表大小,查詢計劃,可用內存以及資源競爭等方面發展。

一般來說,對用於比較的列使用索引是一個好主意。第一列看起來像一個主鍵,所以它會自動獲得一個索引。字符串列應該有一個建立在其上的索引。一般來說,與構建在可變長度字符串列上的整數相比,構建在整數列上的索引性能稍好。然而,這種性能差異只有在交易量非常高的環境中才會有所作爲(每秒想到數千次數據修改操作)。

您應該使用最適合應用程序的邏輯並擔心代碼的其他方面。

+0

這是一個惡意的downvote還是有原因? –

+0

這是我本週見過的低調的第二個好答案,在這兩種情況下,他們看起來都是非常好的答案。 – alroc

0

要回答簡單問題是的選項2SELECT * FROM Tab WHERE id IN (2, 4)會像你說的那樣更快,因爲int比較更快。

加快速度的一種方法是向列中添加索引以加速評估,過濾和最終檢索結果。

如果此表增長得更多,您應該也不要SELECT *,但是SELECT id, value否則您可能會拉動比您需要的更多數據。

您還可以加快查詢的購買添加WITH(NOLOCK),因爲您的查詢速度可能會受到其他會話同時訪問表的影響。例如SELECT * FROM Tab WITH(NOLOCK) WHERE id IN (2, 4)。如下所述,雖然添加nolock不是渦輪,只能在適當的情況下使用。

+1

'NOLOCK'不是一個神奇的渦輪按鈕,不應該使用**除非**你確切知道你爲什麼使用它**和**數據完整性的分支。即使你對骯髒的閱讀很好,但這是一個糟糕的想法和不好的做法。 – alroc

+0

同意,我剛剛添加了一些這些信息給我的答案。在我的情況下,如果我的查詢沒有NOLOCK,速度會相當慢。 –

+0

如果您需要在所有查詢中使用** NOLOCK以獲得可接受的性能(以髒讀和其他風險爲代價),則您的數據庫未配置或設計良好。修復根本原因。 – alroc