MSSQL中IN是否用索引.....[轉]


作者:no_mIss

用MSSQL時間快一年了,數據量有時會相對比較多,所以經常要優化,也看過很多資料,但大都有一句:IN、NOT IN不用索引,今天發此貼希望能有人參與討論,到底IN用不用索引,如果用,在什么情況下用索引,在什么情況下不用索引。

前提:
表[Table]
字段[id] INT PRIMARY KEY 聚集索引

以下寫法:
SELECT * FROM [Table] WHERE id = 1
肯定用索引對吧。

再看下面的三個寫法:
SELECT * FROM [Table] WHERE id = 1 or id = 2
SELECT * FROM [Table] WHERE id IN (1,2)
SELECT * FROM [Table] WHERE id = 1 UNION SELECT * FROM [Table] WHERE id = 2
我可以很負責的告訴你:都用索引
第二種寫法MSSQL會自動優化為:id = 1 or id = 2 ,而不會全表掃描

下面這個寫法:
SELECT * FROM [Table] WHERE id NOT IN (1,2)
我也可以很負責的告訴你:用索引

說到這里,不得不說很多SQL優化的資料都太老了,MSSQL2K以后早改進了。
我們在T_sql時到底靠什么來優化程序呢,我告訴你:
就是參考執行計划和對IO讀寫中的邏輯讀一項
即:
SET STATISTICS IO ON/OFF
SET SHOWPLAN_ALL ON/OFF

先寫一點,子查詢用不用索引,先不寫。
請拍磚。。。。。。 

 

后記:

沒有人給我一個定論,於是我暫相信自己如下: 
表[table]
字段[id] PRIMARY KEY
MSSQL2005默認情況下:

以下寫法均用索引:

SELECT * FROM [table] WHERE id IN (1,2)

SELECT * FROM [table] WHERE id =1 OR id =2

SELECT * FROM [table] WHERE id NOT IN (1,2)

SELECT * FROM [table] WHERE id = 1
UNION
SELECT * FROM [table] WHERE id = 2

SELECT * FROM [table] WHERE id IN (SELECT ID FROM [table_other] WHERE ...)


只有下面的這條不用索引:
SELECT * FROM [table] WHERE id NOT IN (SELECT ID FROM [table_other] WHERE ...)

--------------------- 本文來自 no_miss 的CSDN 博客 ,全文地址請點擊:https://blog.csdn.net/no_mIss/article/details/1327771?utm_source=copy 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM