从sql语句的角度提高数据库的访问性能

从sql语句的角度提高数据库的访问性能

ID:8989309

大小:30.37 KB

页数:7页

时间:2018-04-14

从sql语句的角度提高数据库的访问性能_第1页
从sql语句的角度提高数据库的访问性能_第2页
从sql语句的角度提高数据库的访问性能_第3页
从sql语句的角度提高数据库的访问性能_第4页
从sql语句的角度提高数据库的访问性能_第5页
资源描述:

《从sql语句的角度提高数据库的访问性能》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、从SQL语句的角度提高数据库的访问性能一个非常的DBA,10几年的经验,进行的总结什么是执行计划?执行计划是依赖于什么信息。执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案,这个方案是由查询优化器自动分析产生的,比如一条SQL语句如果用来从一个10万条记录的表中查1条记录,那查询优化器会选择“索引查找”方式,如果该表进行了归档,当前只剩下5000条记录了,那查询优化器就会改变方案,采用“全表扫描”方式。可见,执行计划并不是固定的,它是“个性化的”。产生一个正确的“执行计划”有两点很重要:1.SQL语句是否清晰地告诉查询

2、优化器它想干什么?2.查询优化器得到的数据库统计信息是否是最新的、正确的?统一SQL语句的写法减少解析开销对于以下两句SQL语句,程序员认为是相同的,数据库查询优化器可能认为是不同的。select * from dualSelect * From dual其实就是大小写不同,查询分析器就认为是两句不同的SQL语句,必须进行两次解析。生成2个执行计划。所以作为程序员,应该保证相同的查询语句在任何地方都一致,多一个空格都不行!减少SQL语句的嵌套我经常看到,从数据库中捕捉到的一条SQL语句打印出来有2张A4纸这么长。一般来说这么复杂的语句通

3、常都是有问题的。我拿着这2页长的SQL语句去请教原作者,结果他说时间太长,他一时也看不懂了。可想而知,连原作者都有可能看糊涂的SQL语句,数据库也一样会看糊涂。一般,将一个Select语句的结果作为子集,然后从该子集中再进行查询,这种一层嵌套语句还是比较常见的,但是根据经验,超过3层嵌套,查询优化器就很容易给出错误的执行计划。因为它被绕晕了。像这种类似人工智能的东西,终究比人的分辨力要差些,如果人都看晕了,我可以保证数据库也会晕的。另外,执行计划是可以被重用的,越简单的SQL语句被重用的可能性越高。而复杂的SQL语句只要有一个字符发生变

4、化就必须重新解析,然后再把这一大堆垃圾塞在内存里。可想而知,数据库的效率会何等低下。使用“临时表”暂存中间结果简化SQL语句的重要方法就是采用临时表暂存中间结果,但是,临时表的好处远远不止这些,将临时结果暂存在临时表,后面的查询就在tempdb中了,这可以避免程序中多次扫描主表,也大大减少了程序执行中“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。OLTP系统SQL语句必须采用绑定变量select*fromorderheaderwherechangetime>‘2010-10-2000:00:01’select*fromorder

5、headerwherechangetime>‘2010-09-2200:00:01’以上两句语句,查询优化器认为是不同的SQL语句,需要解析两次。如果采用绑定变量select*fromorderheaderwherechangetime>@chgtime@chgtime变量可以传入任何值,这样大量的类似查询可以重用该执行计划了,这可以大大降低数据库解析SQL语句的负担。一次解析,多次重用,是提高数据库效率的原则。倾斜字段的绑定变量窥测问题事物都存在两面性,绑定变量对大多数OLTP处理是适用的,但是也有例外。比如在where条件中的字段是

6、“倾斜字段”的时候。“倾斜字段”指该列中的绝大多数的值都是相同的,比如一张人口调查表,其中“民族”这列,90%以上都是汉族。那么如果一个SQL语句要查询30岁的汉族人口有多少,那“民族”这列必然要被放在where条件中。这个时候如果采用绑定变量@nation会存在很大问题。试想如果@nation传入的第一个值是“汉族”,那整个执行计划必然会选择表扫描。然后,第二个值传入的是“布依族”,按理说“布依族”占的比例可能只有万分之一,应该采用索引查找。但是,由于重用了第一次解析的“汉族”的那个执行计划,那么第二次也将采用表扫描方式。这个问题就是

7、著名的“绑定变量窥测”,建议对于“倾斜字段”不要采用绑定变量。begintran的事务要尽量地小SQLServer中一句SQL语句默认就是一个事务,在该语句执行完成后也是默认commit的。其实,这就是begintran的一个最小化的形式,好比在每句语句开头隐含了一个begintran,结束时隐含了一个commit。有些情况下,我们需要显式声明begintran,比如做“插、删、改”操作需要同时修改几个表,要求要么几个表都修改成功,要么都不成功。begintran可以起到这样的作用,它可以把若干SQL语句套在一起执行,最后再一起comm

8、it。好处是保证了数据的一致性,但任何事情都不是完美无缺的。Begintran付出的代价是在提交之前,所有SQL语句锁住的资源都不能释放,直到commit掉。可见,如果Begintran套住的SQL语句太多

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。