sql数据库语言的两种使用方式(通过使用正确的search arguments来提高SQL Server数据库的性能)
sql数据库语言的两种使用方式
通过使用正确的search arguments来提高SQL Server数据库的性能原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search-arguments/
今天的文章给大家谈谈在SQL Server上关于indexing的一个特定的性能问题。
问题
看看下面的简单的query语句,可能你已经在你看到过几百次了
-- Results in an Index Scan SELECT * FROM Sales.SalesOrderHeader WHERE YEAR(OrderDate) = 2005 AND MONTH(OrderDate) = 7 GO
上门的代码查询一个销售信息,需要一个特定的月份和年份的,这不是很复杂。但是不幸的的事,这个qeury的效率不行,即使OrderDate这一列已经做了Non-Clustered Index。可以看看下面的qeury执行图,你能看到Query Optimizer已经选择了定义在列OrderDate下的Non-Clustered Index,但是SQL Server却做了Index的一个完整扫描,而不是期待中的Seek operation。
这实际上不是SQL Server的限制,而是relational database都是这样的。只要你对一个做了index的列(Search Argument)加了函数操作,数据库引擎就必须再次扫描这个index,而不是去直接执行seek operation
解决方案
为了解决上门的问题,必须要避免在列上门直接应该函数,比如上面的问题可以用下面的代码来代替
-- Results in an Index Seek SELECT * FROM Sales.SalesOrderHeader WHERE OrderDate >= '20050701' AND OrderDate < '20050801' GO
我们重写的这个query语句,能达到同样的效果,不用函数MONTH了。从此query的执行图来看,SQL Server执行了seek operation,在查询的范围内进行的scan。所以,如果你要在where查询中用到函数,用到表达式的右侧,来避免性能问题。比如下面的例子。
-- Results in an Index Scan SELECT * FROM Sales.SalesOrderHeader WHERE CAST(CreditCardID AS CHAR(4)) = '1347' GO
这个query会使SQL Server扫描了整个Non-Clustered Index。所以当表变得更大的时候,这个扩展性等各方面就很差了。如果把函数放在表达式的右侧,SQL Server就能执行seek operation了
-- Results in an Index Seek SELECT * FROM Sales.SalesOrderHeader WHERE CreditCardID = CAST('1347' AS INT) GO
总结
通过今天的blog,我想你们已经认识到了不要在做过indexed的列上直接应用函数,不然SQL Server会扫描你整个index,而不是做seek operation。当你的表变得越来越大的时,你会崩溃的。
译后记
这也是我在看微软SQL Server认证考试Exam70-461的TrainingKit的时候,它书里面反复强调的。简单来讲就是保证不要直接用函数作用在做过index的列上,要用函数的话,变通到表达式的右侧来。至于为什么会影响性能。因为我对index还不熟悉,我理解的不是很清晰。
我大概猜想如下,先记下,欢迎讨论。
对某一个列做index,是不是类似对这一列的数据做一个hash映射,当在查找这一列的数据的时候,直接可以做O(1)的操作(是不是就是它讲的seek operation)。如果对这一列使用了函数,SQL Server的机制就是不会重新做一个作用了函数后的列的hash,它就简单的一个一个的比较了。是O(N)的操作了。
- sqlserver自增字段(SQL Server中identity自增的用法详解)
- sqlserver拒绝访问怎么办(SQL server服务显示远程过程调用失败的解决方法)
- sqlserver常用函数(SQLServer 日期函数大全小结)
- sqlserver字符串截取填充(SQL Server实现split函数分割字符串功能及用法示例)
- sqlserver限制windows身份登录(解决sql server 数据库,sa用户被锁定的问题)
- sqlserver表空间占用率(SQL Server获取磁盘空间使用情况)
- 阿里云sql server 2012(远程连接阿里云SqlServer 2012 数据库服务器的图文教程)
- sqlserver 多实例怎么算许可(SQL Server使用row_number分页的实现方法)
- sqlserver百分比数据查询时间(SQL Server统计信息更新时采样百分比对数据预估准确性的影响详解)
- sqlserver表分区缺点(SQL Server 公用表表达式CTE实现递归的方法)
- sql server2005如何配置(SQLServer2005创建定时作业任务)
- sql server提供的聚合函数(SQLServer行列互转实现思路聚合函数)
- sqlserver非唯一索引汇总性能(详解SQL Server的聚焦过滤索引)
- sqlserver2012登录出现报错18456(SQL Server 2012 sa用户登录错误18456的解决方法)
- sqlserver查看数据表更新时间(SQL Server实现显示每个类别最新更新数据的方法)
- sqlserver存储过程同步数据(SQL Server存储过程同时返回分页结果集和总数)
- 以家人之名广受好评,剧情生动引起观众共鸣,演员张新成圈粉无数(以家人之名广受好评)
- 三兄妹感情再遇波折,人设接连崩塌 《以家人之名》剧情猜不透(三兄妹感情再遇波折)
- 《小敏家》金波想要复婚 这只是他圈套的第1步,更可恶的在后面(小敏家金波想要复婚)
- 小敏家 剧情离谱一锅乱炖,但他们俩绝对是这部剧的一大 亮点(剧情离谱一锅乱炖)
- 《倚天屠龙记》再遭翻拍,关晓彤主演赵敏,蒋劲夫演张无忌,你怎么看(倚天屠龙记再遭翻拍)
- 吴启华与曾舜晞两代张无忌同框,戏里经典的他却没活出原著的潇洒(吴启华与曾舜晞两代张无忌同框)
热门推荐
- python监控系统界面(Python远程视频监控程序的实例代码)
- dedecms导航条长度(去掉dedecms友情链接中的LI标签的方法)
- dedecms迁移data验证码不显示(dedecms织梦上传图片302Error错误的解决方法)
- reactnative零基础入门到项目实战(用React Native制作一个简单的游戏引擎)
- python 爬虫图形验证码(Python爬虫实现验证码登录代码实例)
- css文本溢出部分成省略号(CSS文本超出2行就隐藏并且显示省略号)
- css3网格布局图(详解CSS3 弹性布局快速入门)
- js判断变量是否为空
- python实用教程(Python简直是万能的,这5大主要用途你一定要知道!推荐)
- sqlserver统计表大小(SqlServer 垂直分表减少程序改动)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9