发文章
发文工具
撰写
网文摘手
文档
视频
思维导图
随笔
相册
原创同步助手
其他工具
图片转文字
文件清理
AI助手
留言交流
上接SQL Server 查询性能优化——索引与SARG(三)
说明:下文中所说的创建索引都是SQL Server 查询性能优化——索引与SARG(一)中开头部分所说明的索引列表中的索引。
例:下面表格中说的索引1(聚集索引)和索引5(非聚集索引)
4: 小心使用OR操作符
如上文SQL Server 查询性能优化——索引与SARG(三)中的例子中WBK_PDE_LIST_ORG_HISTROY表创建了索引2,即在[QTY_1] 字段建立索引,通过该索引.就可以从大量记录中.快速找出符合记录的记录(如上文中的“2 请不要进行负向查询”中表格中的序号2,逻辑读取43次,执行成本0.121935),再在少量的数据过滤COP_G_NO='60207106'的记录,因此可以发挥索引的功能。但若使用的是OR 操作,则需要所有字段都有索引可用,查询语句改成如下:
SELECT * FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1=312 or COP_G_NO='60207106'
而当COP_G_NO字段没有适用索引时,直接扫描整个数据表。
序号
逻辑读
执行成本
查询语句
SELECT [WBOOK_NO] ,[COP_G_NO],[G_NO],[CODE_T],[QTY_1],[UNIT_1]
,[TRADE_TOTAL],[GROSS_WT] FROM [WBK_PDE_LIST_ORG_HISTROY]
where qty_1=312 or COP_G_NO='60207106'
索引2
1
表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数1,逻辑读取1306 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
1306
1.03687
索引2,3
2
表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数2,逻辑读取101 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
101
0.245731
索引4,5
3
表'WBK_PDE_LIST_ORG_HISTROY'。扫描计数2,逻辑读取6 次,物理读取0 次,预读0 次,lob 逻辑读取0 次,lob 物理读取0 次,lob 预读0 次。
6
0.0125617
小结:
所创建的索引
查询记录数量
90
92
从小结中所列的表格中,可以看出由于索引4,索引5使用了include关键字,在创建索引时把查询语句中需要中的字段添加到了非聚集索引的叶级,从而在进行查询时只需要访问到索引的叶级就可以,不需要通过RID操作去访问数据页中的数据,所以提高了查询速度。
就是说查询优化器可以在索引中找到所有列值;不访问表或聚集索引数据,从而减少磁盘 I/O 操作。但这样做的坏处是索引需要额外的磁盘存储空间。是优是劣,按实际情况进行调整。
例外情况:
使用OR操作符时,如果多个条件中有一个条件没有合适的索引,则其他条件都有索引也是没有用处的,只有整个数据表进行扫描或进行聚集索引扫描,以确定全部的数据是否有符合的记录。
即使多个条件都有索引,所需要的查询结果数量过多,SQL SERVER查询优化程序将自动采用全表扫描或聚集索引扫描,以确定全部的数据是否有符合的记录。
如下例:
创建非聚集索引4,5,没有索引1。
执行以下代码
SELECT [WBOOK_NO] ,[COP_G_NO],[G_NO],[CODE_T],[QTY_1],[UNIT_1],[TRADE_TOTAL],[GROSS_WT] FROM [WBK_PDE_LIST_ORG_HISTROY] where qty_1=2 or COP_G_NO='60207106'
总结:
不要认为只要有负向查询出现在查询条件WHERE子句中就一定认为索引就没有效用,在WHERE子句中使用非SARG并不一定导致全表扫描或是聚集索引扫描。SQL SERVER可以在某些非SARG状况中使用索引,以及查询中虽然包含了部分非SARG但仍可以对此查询中的SARG部分使用索引。
也不要认为在查询语句中的查询条件WHERE子句中使用SARG就一定会使用到相应的索引,而不会进行全表扫描或聚集索引扫描。SQL SERVER查询优化程序会根据SARG使用情况所获取的查询结果的记录数量是否过多,而决定是使用相应的索引,还是使用全表扫描或是聚集索引扫描。当然,无论情况如何,在进行性能调校时,最先也是最直接的改变就是把非SARG改成SARG。因为把非SARG改成SARG最坏的情况就是全表扫描或是聚集索引扫描,查询结果的记录数量比较少,会高效利用相应索引,快速查出结果。
来自: 昵称10504424 > 《SqlServer》
0条评论
发表
请遵守用户 评论公约
SQLSERVER 里SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好?
1 SELECT COUNT(1) FROM [dbo].SELECT COUNT(3) FROM [dbo].[nct1]跟SELECT COUNT(*) FROM [dbo].[nct1]也是一样。SELECT COUNT(*) F...
Sql Server性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON
Sql Server性能优化辅助指标SET STATISTICS TIME ON和SET STATISTICS IO ON.对于优化SQL语句或存储过程,以前主要是用如下语句来判断具体执行时间,但是SQL环境是复杂多变的,下面语句并不能精准判断性...
优化原则
SELECT语句的处理顺序。13、setshow_plan_allon:要求不执行SQL语句,而是返回有关语句的执行方式和预计所需资源的详细信息,即:执行计划内容。23、总是使用索引的第一个列,当仅使用索引的第二个列时...
SQL SERVER海量数据库的查询优化及分页算法方案
海量数据库的查询优化及分页算法方案。经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页。下表列出了笔者用有着1000万数据的办公自动化系统中的表,在以GID(GI...
Sql Server性能优化——Partition(管理分区)
Sql Server性能优化——Partition(管理分区)Sql Server性能优化——Partition(管理分区)作者: 拖鞋不脱 来源: 博客园 发布时间: 2010-09-01 14:59 阅读: 4 次 原文链接 全屏阅读 [收藏] 编辑...
SQL Server技巧:如何监测和优化OLAP数据库
SQL Server技巧:如何监测和优化OLAP数据库。微软SQLServer分析服务(SSAS)提供了一个用来创建和管理数据挖掘应用和在线分析处理系统的强...
SQL 语句优化--OR 语句优化案例
扫描计数 1,逻辑读取 23 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。扫描计数 4,逻辑读取...
SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON
SQL Server读懂语句运行的统计信息 SET STATISTICS TIME IO PROFILE ON.1 DBCC DROPCLEANBUFFERS 2 --清除buffer pool里的所有缓存数据 ...
论IP地址在数据库中应该用何种形式存储 - 吴秦(Saylor) - 博客园
在看公司项目代码时,有涉及到ip地址存储,从可读性来看,依次是varchar(15)> bigint> tinyint> varbinary(4)>int。其次是i...
微信扫码,在手机上查看选中内容