- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从 SQL 语句的角度提高数据库的访问性能
一个非常的 DBA,10 几年的经验,进行的总结
什么是执行计划?执行计划是依赖于什么信息。
执行计划是数据库根据 SQL 语句和相关表的统计信息作出的一个查询方案,这个方案是由
查询优化器自动分析产生的,比如一条 SQL 语句如果用来从一个 10 万条记录的表中查 1
条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下 5000 条
记录了,那查询优化器就会改变方案,采用“全表扫描”方式。
可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:
1. SQL 语句是否清晰地告诉查询优化器它想干什么?
2. 查询优化器得到的数据库统计信息是否是最新的、正确的?
统一 SQL 语句的写法减少解析开销
对于以下两句 SQL 语句,程序员认为是相同的,数据库查询优化器可能认为是不同的。
select * from dual
Select * From dual
其实就是大小写不同,查询分析器就认为是两句不同的 SQL 语句,必须进行两次解析。生
成 2 个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空
格都不行!
减少 SQL 语句的嵌套
我经常看到,从数据库中捕捉到的一条 SQL 语句打印出来有 2 张 A4 纸这么长。一般来说
这么复杂的语句通常都是有问题的。我拿着这 2 页长的 SQL 语句去请教原作者,结果他说
时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的 SQL 语句,数据库
也一样会看糊涂。
一般,将一个 Select 语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句
还是比较常见的,但是根据经验,超过 3 层嵌套,查询优化器就很容易给出错误的执行计划。
因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,
我可以保证数据库也会晕的。
另外,执行计划是可以被重用的,越简单的 SQL 语句被重用的可能性越高。而复杂的 SQL
语句只要有一个字符发生变化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而
知,数据库的效率会何等低下。
使用“临时表”暂存中间结果
简化 SQL 语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这
些,将临时结果暂存在临时表,后面的查询就在 tempdb 中了,这可以避免程序中多次扫
描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。
OLTP 系统 SQL 语句必须采用绑定变量
select * from orderheader where changetime ‘2010-10-20 00:00:01’
select * from orderheader where changetime ‘2010-09-22 00:00:01’
以上两句语句,查询优化器认为是不同的SQL 语句,需要解析两次。如果采用绑定变量
select * from orderheader where changetime @chgtime
@chgtime 变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大
大降低数据库解析 SQL 语句的负担。一次解析,多次重用,是提高数据库效率的原则。
倾斜字段的绑定变量窥测问题
事物都存在两面性,绑定变量对大多数 OLTP 处理是适用的,但是也有例外。比如在 where
条件中的字段是“倾斜字段”的时候。
“倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“ 民族”这列,
90%以上都是汉族。那么如果一个SQL 语句要查询 30 岁的汉族人口有多少,那“ 民族”这
列必然要被放在 where 条件中。这个时候如果采用绑定变量@nation 会存在很大问题。
试想如果@nation 传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。然后,
第二个值传入的是“布依族”,按理说“布依族” 占的比例可能只有万分之一,应该采用索引查
找。但是,由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方
式。这个问题就是著名的“绑定变量窥测”,建议对于“倾斜字段”不要采用绑定变量。
begin tran 的事务要尽量地小
SQL Server 中一句 SQL 语句默认就是一个事务,在该语句执行完成后也是默认 commit
的。其实,这就是 begin tran 的一个最小化的形式,好比在每句语句开头隐含了一个 begin
tran,结束时隐含了
您可能关注的文档
最近下载
- ZXR10 M6000电信级路由器硬件手册.docx VIP
- 《输液导管相关静脉血栓形成防治中国专家共识》解读PPT课件.pptx VIP
- 高中英语_Being funny without saying a word教学课件设计.ppt
- 2024版育婴师培训全套课件完整版.docx VIP
- 子网掩码相关教学 子网掩码快速算法.doc VIP
- 什么什么踏地四字成语.docx VIP
- 力士乐卷扬减速机制动器安装拆解图文.pdf VIP
- 新能源汽车充电系统检修:车载充电机的认知与检修PPT教学课件.pptx
- 2025年度食品安全风险日管控、周排查、月调度记录表.pdf VIP
- (新版)消防设施操作员(初级)消防设施操作-考试题库(含答案).docx VIP
文档评论(0)