SQL索引问题
2018-06-17 19:55:01来源:未知 阅读 ()
很多文章都提到使用IN,OR会破坏索引,造成全表扫描,但实际测试却不是这样。
SELECT c FROM t WHERE c = 1 SELECT c FROM t WHERE c in (1)
或者
SELECT c FROM t WHERE c = 1 OR c = 2 SELECT c FROM t WHERE c in (1,2)
以上SQL文,第一组(=,IN),第二组(=,OR,IN),每一组的两个SQL文都使用相同的执行计划,执行计划中也可以看到使用了相同的索引,磁盘活动信息中的逻辑读次数也相同。
测试中需要的设定:
SET STATISTICS IO ON 使SQLSERVER显示Transact-SQL语句生成的磁盘活动量信息。
SET STATISTICS TIME ON 显示分析,编译,执行语句所需要的毫秒数
每次执行查询前的处理:
CHECKPOINT 强制将当前数据库的全部脏页写入磁盘,然后清除缓冲区
DBCC DROPCLEANBUFFERS 从缓冲池中删除所有CleanBuffers
测试:
SQLServer 2008 R2
SQLServer 2014
1.新建数据库表:
CREATE TABLE [dbo].[TestTable]( [ID] [bigint] IDENTITY(1,1) NOT NULL, [Birthday] [varchar](10) NOT NULL, CONSTRAINT [PK_TestTable] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
2.向Birthday中插入大量数据
3.建立Birthday列的非聚集索引
4.查询测试
CHECKPOINT DBCC DROPCLEANBUFFERS SELECT birthday FROM [dbo].[TestTable] WHERE Birthday IN ('19901111')
表 'TestTable'。扫描计数 1,逻辑读取 8 次,物理读取 2 次,预读 5 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
CHECKPOINT
DBCC DROPCLEANBUFFERS
SELECT Birthday FROM [dbo].[TestTable] WHERE Birthday IN ('19901111')
表 'TestTable'。扫描计数 1,逻辑读取 8 次,物理读取 2 次,预读 5 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
下面的语句执行后,查询计划以及读取次数也都是一样的。
CHECKPOINT DBCC DROPCLEANBUFFERS SELECT Birthday FROM [dbo].[TestTable] WHERE Birthday = '19901111' OR Birthday = '19901212'
表 'TestTable'。扫描计数 2,逻辑读取 16 次,物理读取 2 次,预读 10 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
CHECKPOINT DBCC DROPCLEANBUFFERS SELECT birthday FROM [dbo].[TestTable] WHERE Birthday IN ('19901111','19901212')
表 'TestTable'。扫描计数 2,逻辑读取 16 次,物理读取 2 次,预读 10 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
执行计划截图这里就不上传了,有兴趣的话,大家可以自行验证。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:C#.net 之货币转换
下一篇:C# 索引器
- MySQL replace函数怎么替换字符串语句 2020-03-09
- PHP访问MySQL查询超时怎么办 2020-03-09
- mysql登录时闪退 2020-02-27
- MySQL出现1067错误号 2020-02-27
- mysql7.x如何单独安装mysql 2020-02-27
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash