zoukankan      html  css  js  c++  java
  • 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 

  • 相关阅读:
    372. Super Pow
    224. Basic Calculator + 227. Basic Calculator II
    263. Ugly Number + 264. Ugly Number II + 313. Super Ugly Number
    169. Majority Element
    225. Implement Stack using Queues + 232. Implement Queue using Stacks
    551. Student Attendance Record I + Student Attendance Record II
    765. Couples Holding Hands
    547. Friend Circles
    535. Encode and Decode TinyURL
    87. Scramble String
  • 原文地址:https://www.cnblogs.com/railgunman/p/9702947.html
Copyright © 2011-2022 走看看