- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
对SQLServer中查询优化的几点思考.doc
对SQLServer中查询优化的几点思考
摘要:通常如何提高查询执行效率是检验关系数据库系统性能好坏的重要标志,需要进行优化设计的地方很多,因此可以说查询速度决定了关系数据库的性能优劣。本文重点讨论查询优化的一些方法,并结合它在实际应用中的例子进行分析。
关键词:SQLServer;查询;优化;索引
中图分类号:TP311 文献标识码:A 文章编号:1007-9599 (2013) 02-0000-02
目前程序开发中几乎都使用到数据库,作为中小规模开发的数据库主流是SQLServer数据库,其查询性能好坏跟整个系统运行效率有着极大的关系,但实际应用中,会出现查询等待时间过长、响应速度慢的现象,究其原因,一方面是硬件方面的原因,另一方面就是对查询没有进行很好的优化。
本文所谓的查询优化是指为了查询选择出最有效的查询计划的过程,查询优化一方面在关系代数级进行优化,力图找出与给定表达式等价,而且执行效率更高的一个表达式另一方面涉及查询语句处理策略的选择。
1 SQLServer查询优化机制
SQLServer中有一个“查询分析优化器”,它能实现自动优化,即查询提供一个最佳的执行策略.对于SQL的查询优化器,输入是一条查询语句,输出是一个执行策略.一条SQL查询语句可以有多种执行策略,优化器将会考察解决查询各个部分(如WHERE条件、连接和函数),估计出每个操作的每项逻辑开销,并考虑索引、硬件的限制和数据的统计信息,执行其中所需时问最少的所谓成本最低的那一种方法.虽然查询优化器可以根据WHERE子句自动的进行查询优化,但有时查询优化器就会不按照您的本意进行快速查询.因此,SQL数据库应用系统中,查询性能与查询设计的好坏有关.对影响SQL查询语句执行效率的主要因素进行分析,是优化SQL查询语句,提高查询效率的重要途径。
2 查询速度慢的原因种类
查询速度慢的原因很多,常见如下几种:没有索引或者没有用到索引;I/O吞吐量小,形成瓶颈效应;没有创建计算列导致查询不优化或者计算列失效了;内存不足;网络速度慢;查询出的数据量过大;锁或者死锁;一个服务器同时存在OLTP和OLAP查询;返回了不必要的列;查询语句不好,没有优化。
3 常见的查询优化方法
把数据、日志、索引放到不同的I/O设备上,增加读取速度,Tempdb应放在RAID0上。数据量(尺寸)越大,提高I/O越重要;纵向、横向分割表,减少表的尺寸;升级硬件;根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段;提高网速;扩大服务器的内存,增加服务器CPU个数;收缩数据和日志DBCCSHRINKDB,DBCCSHRINKFILE。设置自动收缩日志。
4 查询优化在T-SQL中的具体体现
4.1 T-SQL语句写法的影响
T-SQL语句的写法上有很大的讲究,下面列出常见的要点:在最常见查询SELECT语句中,最好是使用WHERE子句限制返回的行数,避免对表进行全部扫描,如果不进行限制,就会返回很多不必要的数据,既浪费了服务器的I/O资源,又加重了网络的负担降低性能,特别是表很大的时候,再对表全扫描,很可能造成在扫描期间将表锁住,导致禁止其他的联接访问表,造成后果严重。
4.2 设置锁的时间对查询优化的影响
SETLOCKTIME设置锁的时间;用SELECTTOP10/10Percent来限制用户返回的行数或者SETROWCOUNT来限制操作的行,尽量不要用如下的字句:ISNULL、、!=、!、!、NOT、NOTEXISTS、NOTIN、NOTLIKE,因为这些关键字不走索引而是表全扫描,但是改成like500%就会走索引。也不要在WHERE字句中的列名加函数,诸如Convert,substring等,如果却是需要用函数的时候,可以通过创建计算列再创建索引来替代,一定要将函数和列名分开,并且索引不能建得太多和太大。
4.3 联接对查询优化的影响
NOTIN会多次扫描表,使用EXISTS、NOTEXISTS,IN,LEFTOUTERJOIN来替代,特别是左连接,而EXISTS比IN更快,最慢的是NOT操作;使用QueryAnalyzer,查看SQL语句的查询计划和评估分析是否是优化的SQL;存储过程就没有这些动作;BETWEEN比IN速度更快,BETWEEN能够很快地根据索引找到范围。
4.4 借助索引/临时表实现查询优化
除以上常见的情况,还包括如下不太常见的情况:在必要是对全局或者局部临时表创建索引;不要建没有作用的事物例如产
文档评论(0)