日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

为or、in平反——or、in到底能不能利用索引?

發布時間:2023/12/4 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为or、in平反——or、in到底能不能利用索引? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

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


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

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

?

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

1、?or會引起全表掃面。
2、?in會引起全表掃描。
3、?in會引起全表掃描,并且和or等效。
4、?or語句使用不當會引起全表掃描。

?

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

名詞解釋:
全表掃描在數據庫中,對無索引的表進行查詢一般稱為全表掃描。全表掃描是數據庫服務器用來搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。
引自:http://baike.baidu.com/view/2010124.htm?fr=ala0_1_1

?

前提條件


  數據庫:SQL Server2000 + sp4 (注意:一定要安裝sp4補丁包,如果未安裝任何補丁包可能執行計劃會和安裝sp4的不一致)

其他數據庫沒有研究,所以在這里就不討論了。

?

?

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

?

  第四個說法是我用google搜索出來的,說的很明確。or“使用不當”才會引起全表掃描,那么使用得當的話,顯然是可以避免全表掃描的。文章的例子也說的很明確。http://www.zbitedu.com/?action-viewthread-tid-39219

?

  在這里不得不贊揚一下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?or?EmployeeID?=??4?or?EmployeeID?=??5

?

?

?

  這兩個SQL語句的執行結果是一致的,執行計劃也是一致的。我們來看看EmployeeID字段在有無索引,有什么類型的索引的情況下,執行計劃都是什么樣子的

?

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


?

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


2、?是主鍵(聚集索引)

?

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

?

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

?

?

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

?

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

?

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


?

總結

以上是生活随笔為你收集整理的为or、in平反——or、in到底能不能利用索引?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。