问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-11-25 19:16

我来回答

1个回答

热心网友 时间:2023-10-09 16:56

原文地址: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)的操作了。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
WIN7不会自动安装AHCI驱动是怎么回事?每次重装系统后都得我自己安装_百... 钉钉录播课能否查看观看时长 为什么城市轨道要有身高条件 城轨交通运营管理专业现身高吗 城市轨道交通运营管理这个专业是否有身高要求 读城轨专业需要什么条件 学习城轨专业需要什么条件? 城市轨道专业最低的身高要求多少?身高158毕业出来好找工作吗? 城轨专业要求身材吗 城轨专业有身高限制吗 个税夫妻重复申报了房贷怎么办? 裴勇俊主演的电视剧人气不减 被称为戴眼镜最帅的男人 宝马5系2022款2.0T多少钱能落地? 宝马5系新能源2021款三厢落地价多少? 宝马5系自动挡成交价格最低是多少钱? 宝马5系2022款5座落地价是多少钱?宝马5系优惠价 高温费最高标准是多少 付美元怎么付 国内如何消费美元 我电脑的芯片组风扇很吵,我想换了他,但老板说没有这种风扇了,可不可以降低转速来减轻噪声 ASUS A8N-E的芯片组风扇坏了怎么办? 主板型号 昂达 G41C+ 芯片组 英特尔 4 Series 芯片组 - ICH7该使用多大的风扇 核酸检测结果有疑问? 上海福州路的高腾大厦里的310室是什么公司啊? 吴江展达310部门怎么样 玉米虫身上有黑点点 国考非应届公务员乌鲁木齐好考吗 土地银行的介绍 2013届是公认的选秀小年,为什么就这样字母哥还是挤不进乐透秀 电脑文件无法删除怎么办 我追求的青春初二作文 三千多的康卡斯跟正品区别大吗? 浪琴康卡斯石英表网上能查到就是真的吗 网络贷款只需要身份证就可以了吗? 老师您好作文300字 东莞长江股份有限公司好不好 会计234465464 如何电脑装win7和winxp双系统 课趣网是不是骗局 苹果手机微信提示音默认的怎么换? 玉米叶怎么数 玉米3至5叶是指什么的时候 我有他的微信账号和密码,。怎么做到看他的微信内容,又不被他发现? 请高手介绍我国有哪几种小型鳜 鸡蛋怎么判断坏了没? 深圳市名之洋包装制品有限公司怎么样? 中文名公司翻译成英文,“东晔利包装材料有限公司”,望高手翻译成英文,例如:百事可乐的英文名是pep 大家帮忙想个英文名为lamiplus 与之对应的中文公司名吧,有重谢哦! 海尔电热水器FCD-JTHC80-III(AM) 怎么知道水箱是否加满水? 海尔es50h—q1热水器怎么样知道上没上满水