[翻译]通过使用正确的search arguments来提高SQL Server数据库的性能

原文地址:http://www.sqlpassion.at/archive/2014/04/08/improving-query-performance-by-using-correct-search-arguments/

Improving Query Performance by using correct Search Arguments

April 8, 2014 · Klaus Aschenbrenner ·



通过使用正确的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-09-30 00:39:58

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

JeeSite如何正确连接SQL SERVER 数据库

JeeSite如何正确连接SQL SERVER 数据库 jeesite介绍 感谢jeesite项目的作者thinkgem. 没有你我也不会更改这数据源非了恁大的劲,,,,嘻嘻嘻说多了. JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的开源Java EE快速开发平台. JeeSite是您快速完成项目的最佳基础平台解决方案,JeeSite是您想学习Java平台的最佳学习案例,JeeSite还是接私活的最佳助手. JeeSite是在Spring Framework基础

SQL Server 列存储性能调优(翻译)

原文地址:http://social.technet.microsoft.com/wiki/contents/articles/4995.sql-server-columnstore-performance-tuning.aspx SQL Server 的列存储索引是SQL Server 2012 release版本新增的内容,用于提高数据仓库的查询性能,本篇文章阐述列存储的性能调优. 列存储索引性能的基本原则 在相同的硬盘和数据量时,列存储能够明显提高部分查询的速度.致使列存储查询效率高的因素

翻译(十一) ——Reading Query Plans: Stairway to SQL Server Indexes Level 9

Reading Query Plans: Stairway to SQL Server Indexes Level 9 By David Durant, 2011/10/05 原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/72441/ The Series 本文是阶梯系列的一部分:SQL Server索引的阶梯. 索引是数据库设计的基础,并告诉开发人员使用数据库大量关于设计者的意图.不幸的是,当性能问题出现时,索引常常

#翻译#通往SQL Server安全级别2的阶梯:身份验证; 唐?吉利; 原文链接:Stairway to SQL Server Security Level 2: Authentication http://www.sqlservercentral.com/articles/Stairway+Series/109975/

这篇文章是楼梯系列的一部分:通往SQL Server安全的阶梯 SQL Server拥有您需要的所有东西来保护您的服务器和数据以抵御今天的复杂攻击.但是在您能够有效地使用这些安全特性之前,您需要了解您所面临的威胁和一些基本的安全概念.第一个阶梯级提供了一个基础,这样您就可以充分利用SQL服务器的安全特性,而不必浪费时间来防止对数据的特定威胁. 身份验证是验证一个君主国--一个需要访问SQL Server数据库的用户或进程--是谁或它声称是什么的过程.一个主体需要唯一的标识,以便SQL Serve

14周翻译:SQL Server安全级别2的阶梯:身份验证 作者:Don Kiely,2014/06/18 该系列 本文是“Stairway系列:SQL Server安全性的阶梯”的一部分 链接:http://www.sqlservercentral.com/articles/Stairway+Series/109975/

正文: SQL Server提供了保护服务器和数据免受当今复杂攻击所需的一切.但是,在您有效使用这些安全功能之前,您需要了解您面临的威胁以及一些基本的安全概念.这第一阶梯级别提供了一个基础,以便您可以充分利用SQL Server中的安全功能,而不会浪费时间在功能上无所事事,以防止对数据的特定威胁. 验证是验证主体(需要访问SQL Server数据库的用户或进程)是谁或声称是什么的过程.主体需要唯一标识,以便SQL Server可以确定主体拥有哪些权限(如果有).正确的身份验证是提供对数据库对象安

翻译:SQL Server事务日志管理的阶段,1级:事务日志概述

原文链接:http://www.sqlservercentral.com/articles/Stairway+Series/73775/ 原文作者: Tony Davis, 2013/10/30 (第一次出版: 2011/06/17) 该系列 本文是SQL Server中"Stairway系列:事务日志管理的阶梯"的一部分 当事情进展顺利的时候,没有必要特别意识到事务日志的作用或工作原理. 你只需要确信每个数据库都有正确的备份机制. 当事情出错时,对事务日志的理解对于采取纠正措施是非常

[翻译]——SQL Server使用链接服务器的5个性能杀手

原文:[翻译]--SQL Server使用链接服务器的5个性能杀手 前言: 本文是对博客http://www.dbnewsfeed.com/2012/09/08/5-performance-killers-when-working-with-linked-servers/的翻译, 如有翻译不对或不好的地方,敬请指出,大家一起学习进步.尊重原创和翻译劳动成果,转载时请注明出处.谢谢! 当使用链接服务器(Linked Servers)时,最昂贵的代价就是网络带宽间大量数据的传输.在正确的服务器书写正

[翻译]初识SQL Server 2005 Reporting Services Part 2

原文:[翻译]初识SQL Server 2005 Reporting Services Part 2 在Part 1文章中我们对SQL Server Reporting Services 2005(SSRS)有了一个初步的了解.我们分别通过报表向导和报表设计器构建了两个报表.在Part 2我们将以一个SSRS开发者的身份深入查看更多特征信息. 以下是我们要研究的: l 表达式的用法.这些表达式可以让你动态的控制从控件属性到数据绑定的报表的各个方面. l 报表中用到的计算和操作的通用函数. l 报

[翻译]——SQL Server索引的介绍:SQL Server索引级的阶梯

SQL Server索引的介绍:SQL Server索引级的阶梯 By David Durant, 2014/11/05 (first published: 2011/02/17) 该系列 本文是楼梯系列的一部分:SQL Server索引的阶梯 索引是数据库设计的基础,并告诉开发人员使用数据库非常了解设计器的意图.不幸的是,当性能问题出现时,索引常常被添加到事后.这里最后是一个简单的系列文章,它应该能让任何数据库专业人员快速"跟上"他们的步伐 第一个层次引入了SQL Server索引: