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
MSSQL中IN是否用索引.....[转]的更多相关文章
- 浅谈MSSQL2012中的列存储索引(columnstore indexes)
列存储索引为MSSQL2012版本中引进的一个新特性.所有版本MSSQL中标准查询处理模式采用一次一行模型,操作符每次处理一行数据.列存储索引中增加了一种新的基于向量的查询执行功能,通过这种功能,操作 ...
- Mssql中一些常用数据类型的说明和区别
Mssql中一些常用数据类型的说明和区别 1.bigint 占用8个字节的存储空间,取值范围在-2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,37 ...
- 说说你所熟知的MSSQL中的substring函数
说说你所熟知的MSSQL中的substring函数 *:first-child { margin-top: 0 !important; } body>*:last-child { margin- ...
- mysql数据表如何导入MSSQL中
本案例演示所用系统是windows server 2012.其它版本windows操作系统类似. 1,首先需要下载mysql odbc安装包. http://dev.mysql.com/downloa ...
- [置顶] LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句
LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 declare @sql varchar(4000), @dirpath varch ...
- mongodb中的排序和索引快速学习
在mongodb中,排序和索引其实都是十分容易的,先来小结下排序: 1 先插入些数据 db.SortTest.insert( { name : "Denis", age : ...
- fortran中提取字符串中可见字符的索引
fortran中常常需要提取字符串中可见字符的索引,下面是个小例子: !============================================================= su ...
- Microsoft.ACE.OLEDB.12.0 及其在 MSSQL中的使用
1.Microsoft.ACE.OLEDB.12.0 简介 就是一个数据访问接口,用于在office文件和非office应用程序间传输数据.例如 Microsoft Office Access 201 ...
- 获取GridView中RowCommand的当前索引行(转)
获取GridView中RowCommand的当前索引行 前台添加一模版列,里面添加一个LinkButton 前台 (如果在后台代码中用e.CommandArgument取值的话前台代码就必须在按钮中设 ...
随机推荐
- FFM算法解析及Python实现
1. 什么是FFM? 通过引入field的概念,FFM把相同性质的特征归于同一个field,相当于把FM中已经细分的feature再次进行拆分从而进行特征组合的二分类模型. 2. 为什么需要FFM? ...
- JAVAWEB servlet验证登录时进行完全的非空判断防止空值登录
如果不进行完全的非空判断,那么对 "" 这种类型的空值就会导致直接登录 所以需要用下面的字符串处理方法对其进行判断 这样就可以防止空值登录了 容易出现的混淆错误: 这里的空值登录容 ...
- eclipse项目转移至IDEA与IDEA tomcat报错(idea自带tomcat版本太高)与war包部署到win服务器与idea提交git的总结
eclipse导出项目到idea时,不要导出target: idea打开eclipse项目后,出现junit找不到的问题,原因是jar包缺失,而maven配置的低版本的junit也显示找不到,解决办法 ...
- JAVAWEB和数据库 Mysql连接不上的原因及解决方案
有可能是安装了phpstudy或者wampserver这类自带mysql的web集成环境, 在关闭集成环境时误关了相对应的mysql服务,所以我们需要手动启动服务. 启动mysql的命令: net s ...
- pycharm如何显示工具栏
1.没有工具栏的效果图如下: 2.在view中找到Toolbar打上勾即可显示: 3.工具栏设置成功显示效果图如下: 3.如何显示一个类或方法所在的文件,以及该文件下的所有方法,可以快速定位到该行
- 关于IntelliJ IDEA 创建Maven项目速度慢
在maven的VM Options加上-DarchetypeCatalog=internal参数,如下:
- 我们一起来聊聊并发吧,one。
引言 最近工作当中写了一个有关并发的程序,引起了LZ对并发的强烈兴趣.这一下一发不可收拾,LZ用了一个多星期,看完了这本共280+页的并发编程书.之所以能看这么快,其实这主要归功于,自己之前对并发就有 ...
- gith命令行使用之上传和删除
git这个工具的功能很强大,而使用git bash的命令行来进行git工具的操作尤为重要.而且我个人认为,用命令行进行git工具的操作比起图形界面的git工具,要更容易理解.图形界面的那个叫Torto ...
- TPO-19 C1 Discussing A Point Raised In A Lecture
TPO-19 C1 Discussing A Point Raised In A Lecture 第 1 段 1.Listen to a conversation between a student ...
- 关于spring boot 使用 mybatis plus INSERT的时候id报错
mybatis plus 在INSERT的时候会默认自动设置插入id 我当时数据库采用的id自增. 在使用插入语句的时候并没有set ID 但是它默认给了一大串 更改mybatis plus全局配置 ...