通过使用正确的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)的操作了。

时间: 2024-10-20 08:31:05

通过使用正确的search arguments来提高SQL Server数据库的性能的相关文章

通过使用正确的search arguments来提高SQL Server数据库的性能_MsSql

原文地址: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.SalesOrderHe

从外到内提高SQL Server数据库性能

如何提高SQL Server数据库的性能,该从哪里入手呢?笔者认为,该遵循从外到内的顺序,来改善数据库的运行性能.如下图: 第一层:网络环境. 到企业碰到数据库反映速度比较慢时,首先想到的是是否是网络环境所造成的.而不是一开始就想着如何去提高数据库的性能.这是很多数据库管理员的一个误区.因为当网络环境比较恶劣时,你就算再怎么去改善数据库性能,也是枉然. 如以前有个客户,向笔者反映数据库响应时间比较长,让笔者给他们一个提高数据库性能的解决方案.那时,笔者感到很奇怪.因为据笔者所知,这家客户数据库的

教你如何提高SQL Server 2000的性能?

以往的服务器,由于内存价格过高,一般配的内存不是很多,超过4G的当然就不多了现在的服务器,配置超过4G就很多,在配作SQL 数据库服务器后,很多的人只选默认的设置,虽然可以正常使用,可是却把大量的内存浪费了(SQL服务使用的内存不会超过1.8G),系统的性能也不能因为的大内存而提升,这是很可惜的. 下面介绍一种方法教你如何提高SQL Server 2000 的性能. 配置的过程如下.(如果服务器的内存少于4G,不用配置) 1.打开系统中的大内存支持(windows) 要启用 Windows 20

合理利用索引提高SQL Server数据库运行效率

索引的作用就类似于书的目录,书的目录会按照章节的顺序排列,会指想某一张的位置.这样如果在一本数百页的书 里面 查找某个章节位置的时候,我们就可以只扫描书的目录,扫描的范围缩小了n倍,查询的效率自然就提高了.另外在sql server内存够用的情况下索引会被放到内存中,在内存中查找自然又会http://www.aliyun.com/zixun/aggregation/7208.html">提高效率; 所以我们必须得合理利用索引. 1)对什么列建索引 数据库默认情况下会对主键建聚集索引,除了这

利用索引提高SQL Server数据处理的效率

在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引.因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了.所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程.但是,索引并不总是提高系统的性能,在增.删.改操作中索引的存在会增加

利用索引提高SQL Server数据处理效率

在良好的数据库设计基础上,能有效地使用索引是SQL Server取得高性能的基础,SQL Server采用基于代价的优化模型,它对每一个提交的有关表的查询,决定是否使用索引或用哪一个索引.因为查询执行的大部分开销是磁盘I/O,使用索引提高性能的一个主要目标是避免全表扫描,因为全表扫描需要从磁盘上读表的每一个数据页,如果有索引指向数据值,则查询只需读几次磁盘就可以了.所以如果建立了合理的索引,优化器就能利用索引加速数据的查询过程.但是,索引并不总是提高系统的性能,在增.删.改操作中索引的存在会增加

如何提高SQL SERVER的性能

server|性能  如何提高SQL SERVER的性能   第一篇:通过维护表的索引来提高数据的访问速度   大多数SQL Server表需要索引来提高数据的访问速度,如果没有索引,SQL Server要进行表格扫描读取表中的每一个记录才能找到索要的数据.索引可以分为簇索引和非簇索引,簇索引通过重排表中的数据来提高数据的访问速度,而非簇索引则通过维护表中的数据指针来提高数据的索引.      索引的体系结构:   为什么要不断的维护表的索引?首先,简单介绍一下索引的体系结构.SQL Serve

如何提高SQL Server数据仓库性能

数据仓库通常是企业内部最大的数据库了.构建和管理系统是项大的任务,这些项目会由于众多用户提供的不兼容的输入而很快变得难以控制.提高系统的查询性能是可以实现的,但是必须要经过周密计划,随后还有具有远见的设计和开发阶段.在这篇文章中,我们将会列出获得并且为性能需求计划的一些技术,然后我们会在SQL Server上提高你的数据仓库性能. 需求 对于需要支持数百个GB到几个TB的数据系统而言,性能永远不会是你需要考虑的最后一件事情.当你收集数据仓库需求的时候,你就会被训练掌握用户性能需求的规则了.基于这

四项技术提高SQL Server的性能

本文讲解如何使用LEFT JOIN.CROSS JOIN以及IDENTITY值的检索,这些技术来提高基于SQL Server的应用程序的性能或改善其可伸缩性. 有时,为了让应用程序运行得更快,所做的全部工作就是在这里或那里做一些很小调整.但关键在于确定如何进行调整!迟早您会遇到这种情况:应用程序中的SQL 查询不能按照您想要的方式进行响应.它要么不返回数据,要么耗费的时间长得出奇.如果它降低了企业应用程序的速度,用户必须等待很长时间.用户希望应用程序响应迅速,他们的报告能够在瞬间之内返回分析数据