SQL SERVER查询优化实证研究
2014-05-22未培
未 培
(安徽工商职业学院;电子信息系,合肥 230041)
1 、引言
查询是数据库的核心操作,查询效率的高低直接影响到整个数据库系统的性能[1-3]。对于数据量比较小的系统,查询语句的执行效率的影响并不是那么明显,但当数据量增加到一定程度,查询执行效率对整个系统的影响就会凸显出来。目前随着信息技术和网络技术的发展,我们已经处于大数据时代,海量数据存储随处可见[4],本文以SQL SERVER数据库为版本,基于某中型数据库,通过具体的实例,研究查询语句的优化方案。
2 、优化查询策略
2.1 利用数据库引擎优化顾问及SQL SERVER PROFILER工具
SQL SERVER提供的性能工具数据库引擎优化顾问可以优化数据库,检查指定数据库中处理查询的方式,然后建议如何通过修改物理设计结构(例如索引、索引视图和分区)来改善查询处理性能[5-6]。SQL SERVER PROFILER是SQL SERVER跟踪的图形用户界面,用于创建和管理跟踪并分析和重播跟踪结果[7-8]。我们可以根据数据库引擎优化顾问给出的建议对查询进行优化,通过SQL SERVER PROFILER监视查询语句的执行速度,对查询进行进一步优化。
(1)创建合适的索引
索引是以表列为基础的数据对象,它保存了表中排序的索引列,并且记录了索引列在数据表中的物理存储位置,实现了表中数据的逻辑排序,创建索引的主要目的是提高Sql Server系统的性能,加快数据的查询速度以及减少系统的响应时间[5-6,9,10]。
一般来说,系统访问数据库中数据使用表扫描或索引查找。在SQL SERVER中,当访问表中的数据时,由数据库管理系统(DBMS)确定该表中是否有合适的索引存在,如果对正在执行的查询有恰当的索引存在,就通过索引的顺序查找数据,效率会比较高;如果没有索引,那么只有使用表扫描的方法访问表中的数据,当需要扫描的表中数据很多时,查询数据就需要很长的时间[11]。
通过索引不仅可以加快数据检索速度,还可以通过创建唯一索引,保证行记录的唯一性。不过,建立索引也是有代价的,首先,创建有索引的表在数据库中会占据更多的存储空间;而且系统也会为维护索引花费一定时间,特别是当数据增删频繁时,维护时间更多。因此在创建索引时应该仔细考虑在哪些列上适合创建索引,在哪些列上不适合创建索引。
通常按以下原则创建索引[5-6,9]:
①在经常需要搜索的列上创建索引;
②在经常用在连接的列上创建索引;
③对于那些在查询中很少使用或者很少唯一数据值的列尽量不创建索引;
④当列的修改性能远远大于检索性能时不考虑创建索引。
建立索引的T-SQL语句:
(2)通过优化顾问进行实例优化
现以某高校技能考核管理系统数据库为例,进行查询优化验证,此数据库为中型数据库,以下例子中所用到的两个表表结构如下:
其中scourse表有208128条记录,下面执行select查询语句,通过SQL SERVER PROFILER进行跟踪,对比查询优化前后的耗时情况。
在sql server management stdio窗口中执行下面查询语句,并打开SQL SERVER PROFILER对语句自行情况进行跟踪。
通过跟踪得到,上面查询语句执行耗时为987毫秒,下面将刚才执行的查询语句保存为sql文件,并打开数据库引擎优化顾问,对该负荷文件进行优化,执行后得到如下图1的优化建议。
通过图1可以看出,系统建议在执行此查询语句前建立索引:
索引创建后,再次执行上面查询语句,通过SQL SERVER PROFILER跟踪发现耗时仅12毫秒,优化效率提高了98.8%。通过此实例可以看出,在对中大型数据库进行数据访问时,建立恰当的索引,有效地提高了查询效率。
2.2 其它优化建议
通过SQL SERVER提供的数据库引擎优化顾问对查询语句进行优化,给出的优化建议有时候并不是最合适的,偶尔查询优化器作出的选择反而降低了查询的效率,或者在某些情况下,程序有特殊的需求,这时我们需要研究其它优化策略。
(1)优化 where 条件
在写查询语句时,一个条件往往有多种写法,where条件的表示对查询的效率有很大的影响。如果语句中使用了!=、like、in等表示条件,均会引起表扫描,索引将不起作用,查询的效率将比较低。所以在写where子句时应该注意以下几个方面:
①尽量避免使用负逻辑运算符:如<>、not in、not exists等;
②尽量避免使用通配符,如like’%市’;
③尽量避免在条件中使用公式和函数。
比如以下查询语句均会引起表扫描,应尽量避免使用:
(2)优化多表查询
在遇到多表查询时,尽量避免超过5个以上的表进行连接查询,因为参与连接的表越多,编译的时间越长,性能越不稳定。需要很多表连接的查询,可以借助临时表分步骤去完成,另外为了提高查询速度,建议在连接字段上建立索引。
(3)尽量避免使用子查询
当一个查询为另一个查询的条件时,称为子查询。当一个字段既出现在主查询中,又出现在子查询中时,如果主查询中列值发生改变,子查询必须重新执行一次,查询嵌套的层数越多,查询的效率就会越低,所以要尽量避免使用子查询。如下面子查询语句:
可以写成如下语句,通过SQL SERVER PROFILER跟踪发现执行效率更高。
3 、小结
本文利用SQL SERVER性能工具对查询优化技术进行了研究,但查询语句执行的效率与电脑硬件配置、服务器配置、当前软件环境等多方面有关,所以以上研究数据内容仅供参考,目前我们处于大数据时代,研究如何提高数据查询速度具有实际意义。
[1]彭勇.SQLServer查询性能分析与查询效率提高[J].西南民族大学学报(自然科学版).2012,38(3):483-486
[2]石剑平,蔡光程.SQL Server2005查询优化技术的研究与实现[J].信息系统工程.2010(04):78-79
[3]卫国标,林勇.SQL Server查询优化技术分析与实现[J].电脑知识与技术.2013,9(16):3671-3673
[4]刘维学.SQL Server查询优化器原理与优化实例分析[J].计算机技术与发展.2013
[5]Mackin J C,Hotek M.SQL Server 2005数据库服务器架构设计[M].北京:清华大学出版社,2007
[6]北京阿博泰克北大青鸟信息技术有公司数据库应用与性能优化「M].北京:科学技术出版社,2009
[7]丁向朝.SQL Server数据库查询语句优化的研究[J].华章.2012(15):269
[8]李红丽.SQL Server数据库的查询优化探析[J].长春教育学院学报.2013,29(7):54,60
[9]魏琦,于林林,宋旭东.关系数据库查询优化策略研究[J].电脑知识与技术.2010,6(31):8845-8847
[10]荆立夏.关系数据库的查询优化[J].郑州航空工业管理学院学报.2003,21(1):104-106
[11]张燕琴.基于SQL Server数据库的查询优化[J].软件导刊.2012,11(8):133-134