作者: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