為or in平反 or in到底能不能利用索引?

2021-09-05 23:21:28 字數 2388 閱讀 9724

先說乙個笑話,作為開場白。俺也換換風格試一試,呵呵。

在以前,有三個書生趕考,在路上遇到了乙個算命先生,於是就問算命先生:我們三個人趕考,結果如何呀?算命先生伸出來了乙個手指頭(食指)。三個書生趕考的結果是,有乙個人考中了。三人一想呀,這個掛算的對呀,有乙個人考中了嘛。

其實「乙個手指頭」是很模糊的,很忽悠人的。有各種各樣的解釋,比如:乙個人考中;乙個人沒考中;一起考中了;一起沒考中。這種模稜兩可的說法完全沒有指導意義!

好了書歸正傳,說說資料庫方面的事情。在網上看到了幾種說法,我們一起來分析一下說的到底對不對,是不是準確的,有沒有歧義,會不會誤導大家。

1、 or會引起全表掃面。

2、 in會引起全表掃瞄。

3、 in會引起全表掃瞄,並且和or等效。

4、 or語句使用不當會引起全表掃瞄。

為了避免一些誤會,同時也是縮小討論範圍,所以先解釋乙個名詞和說一下前提條件。

名詞解釋:

全表掃瞄在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄。全表掃瞄是資料庫伺服器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。

引自:

前提條件

資料庫:sql server2000 + sp4 (注意:一定要安裝sp4補丁包,如果未安裝任何補丁包可能執行計畫會和安裝sp4的不一致)

其他資料庫沒有研究,所以在這裡就不討論了。

好了,名詞解釋和前提條件都說好了,我們開始討論吧。

第四個說法是我用google搜尋出來的,說的很明確。or「使用不當」才會引起全表掃瞄,那麼使用得當的話,顯然是可以避免全表掃瞄的。文章的例子也說的很明確。

在這裡不得不讚揚一下google的強大,google搜尋出來的結構都是明確的,而且可以把明確的排在第一位。而baidu就不管三七二十一,管你對不對、是否明確,全都收錄進來,然後你自己去分析、思考吧。bs baidu 一下。

而前三總說法就很不明確,和算命先生的那句話有的一拼。即沒有明確的說「一定」會引起全表掃瞄,也沒有說有沒有例外,含含糊糊,極易誤導人。試問:您有沒有下意識的加上了乙個定語「一定」(or一定會引起全表掃瞄)呢?如果您沒有加上「一定」這個定語的話,那麼您有沒有想過是否有反例?

如果沒有反例的話,那麼就加上「一定」就是正確的,那麼原話為什麼不加上?

如果有反例的話,那麼原話就完全沒有交代清楚。

所以有沒有反例,這就是乙個很不明確,很誤導人的地方。

當然了——in和or是等效的——這句話我是認同的。in和or確實是等效的,資料庫會把in轉換成or的形式。

開始分析

以乙個northwind資料庫的employees表 為例(這是sql server2000裡自帶的資料庫),分析幾種sql語句的執行計畫。

select

*from

employees

where

(employeeid in(

2, 4, 

5))select

*from

employees

where

employeeid =2

oremployeeid =4

oremployeeid =5

這兩個sql語句的執行結果是一致的,執行計畫也是一致的。我們來看看employeeid欄位在有無索引,有什麼型別的索引的情況下,執行計畫都是什麼樣子的

1、 employeeid不是主鍵(沒有聚集索引和非聚集索引)

從執行計畫裡可以明確的看出來,在沒有索引的情況下,確實引起了全表掃瞄。(請不要著急下結論,還有兩種情況沒有看呢。)

2、 是主鍵(聚集索引)

當是主鍵,並且是聚集索引的情況下,執行計畫發生了變化,避免了全表掃瞄。

3、 不是主鍵,但是設定了非聚集索引

這回執行計畫又發生了變化,不過依然沒有引起全表掃瞄,只是增加了乙個步驟(使用標籤)

本來想看看只有主鍵,但是主鍵欄位不設定索引(聚集和非聚集)的情況下,執行計畫是什麼樣子的,但是發現乙個小問題,我不知道怎麼讓設定成主鍵的字段沒有任何索引?企業管理器裡是把主鍵和聚集索引強行繫結到一起了,把乙個字段設定成主鍵,同時也把聚集索引設定給了這個字段。目前我是沒發現怎麼把這個主鍵的索引給去掉。也許應該用sql語句的方式給表設定主鍵吧。這個就先不研究了。

總結:in和or會不會引起全表掃瞄?根據情況而定。即根據是否能夠利用索引而定。

分類到底能不能新增屬性?

通過執行時,分類是可以在不新增成員變數的情況下新增屬性的!遇到乙個問題,寫了乙個分類,但原先類的屬性不夠用。新增乙個屬性,呼叫的時候崩潰了,說是找不到getter setter方法。查了下文件發現,oc的分類允許給分類新增屬性,但不會自動生成getter setter方法。有沒有解決方案呢?有,通過...

自動閱讀 到底 能不能賺錢

如今很流行的自動閱讀到底是乙個怎麼回事呢?到底什麼是自動閱讀呢?自動閱讀到底有沒有發展的前景呢?自動閱讀到底能不能賺錢呢?那麼自動閱讀到底有沒有發展前景呢?這個需要從幾個方面進行討論。要想進行手機批量自動閱讀進行賺錢,當然不能只是在一台兩台手機上進行,這樣子的效率是非常低的,即使你的手機二十四小時都...

區塊鏈100問 區塊鏈到底能不能篡改?

很難,但是能。區塊鏈技術剛出來的時候,目的就是為了防篡改的。而區塊鏈技術及應用發展至今,包括其被用於銀行安全結算等,都是因為其對外號稱是不可篡改的,即安全的。以位元幣為例,它採用的是sha256演算法,本質上是一種加密演算法,這個演算法基於的數學原理導致其是隨機分布的,即每乙個節點 散落 在不同的網...