2011-02-22 19 views
1

我想知道如何比較IN數據庫中的IN子句。在這種情況下,我對SQL服務器和Oracle感興趣。SQL服務器中的子句如何工作

我想到了兩種比較模型 - 二分搜索和哈希。有人能告訴我SQL服務器遵循什麼方法。

回答

2

它取決於優化程序選擇的查詢計劃。

如果您正在比較的列上有一個唯一索引,並且與IN表中的行數相比,您在IN列表中提供的值相對較少,那麼優化程序可能會選擇探測索引來找出表中需要檢查的少數幾行。另一方面,如果IN子句是一個與表中行數相比返回相對較大數量的行的查詢,則優化器可能會選擇使用其中一個數據庫引擎能夠理解的許多聯接方法。如果IN列表是相對非選擇性的(即像GENDER IN('Male','Female')),優化器可以選擇對每行進行簡單的字符串比較作爲最後的處理步驟。

而且,當然,不同統計數據庫的不同版本可能會選擇不同的查詢計劃,這些計劃會導致不同的算法來評估同一個IN列表。

4

SQL Server的IN子句基本上是簡寫爲子句的簡寫。

...WHERE column IN (1,2,3,4)

...WHERE Column = 1 
OR Column = 2 
OR column = 3 
OR column = 4 

速記AFAIK沒有其他邏輯應用,這將是不同的從標準WHERE子句。

+0

從外觀上看,它看起來像順序比較。對於IN子句的性能應該比順序搜索更好。 : -/ – mutelogan 2011-02-22 19:07:14

+0

@mutelogan - SQL Server中的`IN`子句是非常低效的... – JNK 2011-02-22 20:13:09

+0

@JNK:它與EXISTS相同:-) – gbn 2011-02-22 20:21:44

1

IN與SQL Server中的EXISTS通常相同。他們會給出類似的計劃。 這樣說,IN就是JNK提到的OR..OR的簡寫形式。

更多比你可能曾經需要知道,看到Quassnoi's博客entry

FYI:本或簡寫導致了另一個重要的區別NOT IN是非常不同的,以NOT EXISTS/OUTER JOIN:NOT IN失敗的空值在清單