- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
TSQL 的七个性能杀手
我们不仅要求代码的可读性,同时也必须要求代码的性能非常良好.
下面介绍三个写代码时的常见规范.这些规范是累加的.如果全部采用了这三个规
范,那么将会带来非常好的性能.忽略或者不参照其中任意一个可能会导致性能下
降.
1.根据数据结构编写代码.如果需要存放 Datetime 类型的数据,请使用
datetime,而不是 varchar 或者其他数据类型.另外写代码的时候请在适当的地方
也使用到外键约束和其他的方法.
2.根据索引来编写代码.如果在表上存在索引(应该存在),请编写代码的时候可以
保证能够使用到索引.同时也请保证聚簇索引可以使得查询以更有效率的方式执
行
3.根据查询优化器来编写代码.查询优化器是一个令人惊讶的软件.但是如果编写
的代码不能很好地利用查询优化器,比如在视图中嵌套很多视图,将会导致查询优
化器失效.花费一定的精力去理解查询优化器的工作原理,并且按照这个方式去编
写代码,将会得到很好的性能.
接下来,大概讲一下在开发人员编写代码时的一些比较常见或者罕见的错误.请不
要犯这些错误,那么代码将会很好的运行.
使用错误的数据类型
在概念中看起来非常简单,但是在实际的工作中很难实施.OK,继续.采用数据库中
存在的数据类型.在你的参数或者变量中使用这些数据类型.我们知道
SQLServer 支持隐式的数据类型转换.但是当遇到隐式的数据类型转换或者显式
的指定了数据转换,那么实际上在栏位是执行了一个函数.如果在筛选条件(要么
是Where 条件要么是 JOIN 运算)中的栏位上使用了函数,那么实际上是在执行表
扫描.即使在表上存在一个非常好的索引,但是为了使得可以比较数
据,SQLServer 将会对栏位进行了 CAST 转换,那么这个索引是不会被用到的.
不信?看下面的查询吧.
1. SELECT e.BusinessEntityID,
2. e.NationalIDNumber
3. FROM HumanResources.Employee AS e
4. WHERE e.NationalIDNumber = 112457891;
复制代码
看起来不错,又简单又很好,应该会使用到这个表上的索引,但是实际上呢,看下面
的执行计划吧
这个查询足够的块,并且表也很小,所以运行下来只有 4 个读取操作.注意到上面
的执行计划中出现了一个惊叹号,在属性窗口中会告诉我们为什么
没错,有一个 PlanAffectingConvert 的报警(SQLServer2012 中新出现).简单点说,
是由于我使用了错误的数据类型.
1. SELECT e.BusinessEntityID,
2. e.NationalIDNumber
3. FROM HumanResources.Employee AS e
4. WHERE e.NationalIDNumber = 112457891;
复制代码
执行计划如下:
这里只产生了 2 个读取操作,而不是 4 个.我意识到我只是在一个小表的性能问题
上取得成功.但是如果表有上百万行的数据呢,哇,我突然意识到我成了一个英雄.
所以结论就是:
使用正确的数据类型.
在 ON 或者 WHERE 字句中使用了函数去作比较.
这里的函数是指大部分情况下对 ON 或者 WHERE 字句中的栏位去使用函数,这
将导致查询不能使用到索引.因为函数的存在,sqlserver 将对数据进行表扫描,这
将使得性能低下.例如
1. SELECT a.AddressLine1,
2. a.AddressLine2,
3. a.City,
4. a.StateProvinceID
5. FROM Person.Address AS a
6. WHERE 4444 = LEFT(a.AddressLine1, 4) ;
复制代码
LEFT 函数使得该语句的执行计划如下:
产生了 316 个读取操作(执行时间超过 9 秒钟),是因为必须遍历每一行使得数据
符合这个函数的条件.当然,这也并不是简单的扫描数据.我们可以将该查询修改
成如下格式:
1. SELECT a.AddressLine1,
2. a.AddressLine2,
您可能关注的文档
最近下载
- 92ZG001 抗震构造柱及圈梁设计图集.pdf VIP
- 呼吸机相关肺炎的预防及护理措施.pptx VIP
- 2024年一级建造师一建考试水利水电实务选择题历年真题分章节整理练习题.pdf VIP
- 冲刺2025年高考大题突破得高分系列 化学01 化工流程综合题(逐空突破)(解析版).docx VIP
- 萨蒂吉诺佩蒂1钢琴谱Satie Gymnopedie萨蒂 裸者之舞 第一首 祭祀舞曲 Gymnopedie.pdf VIP
- 数字孪生工厂解决方案.pptx VIP
- 2025小学一年级开学第一课PPT.pptx VIP
- 涵管拆除工程施工方案(3篇).docx VIP
- 短视频创意策划与执行方案指南.docx VIP
- 民间皮影_唐山皮影大师:刘佳文.ppt VIP
文档评论(0)