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

MSSQL中IN是否用索引.....[转]的更多相关文章

  1. 浅谈MSSQL2012中的列存储索引(columnstore indexes)

    列存储索引为MSSQL2012版本中引进的一个新特性.所有版本MSSQL中标准查询处理模式采用一次一行模型,操作符每次处理一行数据.列存储索引中增加了一种新的基于向量的查询执行功能,通过这种功能,操作 ...

  2. Mssql中一些常用数据类型的说明和区别

    Mssql中一些常用数据类型的说明和区别 1.bigint 占用8个字节的存储空间,取值范围在-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,37 ...

  3. 说说你所熟知的MSSQL中的substring函数

    说说你所熟知的MSSQL中的substring函数 *:first-child { margin-top: 0 !important; } body>*:last-child { margin- ...

  4. mysql数据表如何导入MSSQL中

    本案例演示所用系统是windows server 2012.其它版本windows操作系统类似. 1,首先需要下载mysql odbc安装包. http://dev.mysql.com/downloa ...

  5. [置顶] LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 declare @sql varchar(4000), @dirpath varch ...

  6. mongodb中的排序和索引快速学习

    在mongodb中,排序和索引其实都是十分容易的,先来小结下排序: 1 先插入些数据    db.SortTest.insert( { name : "Denis", age : ...

  7. fortran中提取字符串中可见字符的索引

    fortran中常常需要提取字符串中可见字符的索引,下面是个小例子: !============================================================= su ...

  8. Microsoft.ACE.OLEDB.12.0 及其在 MSSQL中的使用

    1.Microsoft.ACE.OLEDB.12.0 简介 就是一个数据访问接口,用于在office文件和非office应用程序间传输数据.例如 Microsoft Office Access 201 ...

  9. 获取GridView中RowCommand的当前索引行(转)

    获取GridView中RowCommand的当前索引行 前台添加一模版列,里面添加一个LinkButton 前台 (如果在后台代码中用e.CommandArgument取值的话前台代码就必须在按钮中设 ...

随机推荐

  1. python+soket实现UDP协议的客户/服务端中文聊天程序

    没什么特别的东西,网上烂大街的C/S框架.(基于windows 7 + python 3.4) 为了实现中文聊天,我加入了一点修改: msg.encode('utf-8') # msg 为输入(且将要 ...

  2. 洛谷 P1198 [JSOI2008]最大数

    洛谷 P1198 [JSOI2008]最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. ...

  3. [APIO2018] Duathlon 铁人两项 圆方树,DP

    [APIO2018] Duathlon 铁人两项 LG传送门 圆方树+简单DP. 不会圆方树的话可以看看我的另一篇文章. 考虑暴力怎么写,枚举两个点,答案加上两个点之间的点的个数. 看到题面中的一句话 ...

  4. JAVAWEB eclipse开启服务器时,filter出现找不到的问题时

    这个时候重启eclipse再开启服务器即可.

  5. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]

    题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...

  6. python之GIL(Global Interpreter Lock)

    一 介绍 ''' 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple nati ...

  7. XAF-如何实现自定义权限系统用户对象

    本示例使用XPO. 新建一个XAF项目.填加两个类进来:   [DefaultClassOptions] public class Employee : Person { public Employe ...

  8. ASP.NET Core Token认证

    翻译:Token Authentication in ASP.NET Core 令牌认证(Token Authentication)已经成为单页应用(SPA)和移动应用事实上的标准.即使是传统的B/S ...

  9. 【原创】MVC项目中使用JQuery的upladify图片上传插件相关问题的解决方案

    一. 关于Uploadify Uploadify是一个jQuery插件,你可以很容易的为你的网站添加多个文件上传功能.有两个不同的版本(HTML5和Flash)允许你灵活选择为您的网站和回退方法正确实 ...

  10. tomcat7时遇到启动报错问题 SEVERE: ContainerBase.addChild: start:

    个人说明:错误日志确实是我的,方法都是从其他地儿借鉴过来的,但肯定是能解决错误的方法,亲身体验,安全保障!!! 还有遇到这种问题,多启动几遍可能就行了. 错误日志: SEVERE: Container ...