SQL Server数据库的查询优化探析
2013-02-08李红丽
李红丽
SQL Server数据库的查询优化探析
李红丽
SQL Server是一个关系数据库系统,是一个全面的数据库管理平台,查询语句是数据库中最基本、最常用、最复杂的语句,数据库中的查询在返回结果时有时需要很长的时间,速度非常缓慢导致用户无法忍受。为提高查询效率,数据库的查询优化便成了一个备受关注的话题。从SQL Server数据库出发,结合数据库中的查询语句,可以讨论影响SQL Server数据库查询效率的因素,并提出SQLServer数据库优化查询的方法。
SQLServer;数据库;查询效率;查询优化
李红丽/阳泉师范高等专科学校助教(山西阳泉045200)。
1 引言
随着计算机科学技术日新月异的发展,数据库技术成了其中发展较快的领域之一,SQL Server已成为最普及、最全能的数据库管理系统,因此各类信息管理系统与数据库有了更紧密的结合。随着数据量的不断增加,数据查询的速度受到了严重影响,数据库的合理使用便显得尤为重要。因此,本文对数据库系统的查询优化展开讨论。
2 影响SQL Server数据库查询效率的因素
在SQL Server数据库中,对于一个查询而言,经常会遇到查询方法不同但查询结果相同的情况,但条件表达式不同会使数据库的响应速度出现很大差别。以下面两条常用SQL语句为例:
Select*from table where TID>1000 and name=’LiYang’;
和 Select*from tablewhere name=’LiYang’and TID>1000;
从这两条语句的书写顺序来看它们不太一样,如果TID是一个聚合索引,那么第一条语句查询时,直接从表的1000条之后的记录中查找满足name='LiYang'的记录;而第二条语句查询时,需先从全表中查找出满足name='LiYang'的所有记录,然后再根据TID>1000这个限制条件提取出查询结果。可见,第一条语句的查询速度要快。
在设计数据库查询时,查询效率显得至关重要。在设计中应注意到:(1)是否用到索引。数据库索引如同书籍中的目录,在访问数据库时,用户可以减少遍历数据的次数,从而可以快速找到所需数据。(2)I/O吞吐量。在硬件环境特定时,部署方案的优化可适当提高I/O吞吐量,避免发生瓶颈问题。(3)应当创建计算列。如果没有相应的计算列,在进行数据查询时对已有数据再次进行计算,从而浪费一部分性能。(4)要有足够的内存。在查询或访问数据库中的数据时,难免会占用大量的内存空间,当内存不足时,数据的访问速度就会受到明显的影响。除此以外,网速慢、查询出的数据量过大、锁或者死锁、返回了不必要的行和列、查询语句不够优化等,也是影响SQL Server数据库查询效率的重要因素。
3 SQLServer数据库优化查询的方法
3.1 合理使用索引
索引查询是数据库中重要的记录查询方法,它的根本目的就是为了加快查询速度。以下是实际应用中应该注意的几点。
3.1.1 连接操作需要经常进行,但是没有指定为外键的列上建立索引,而连接操作不经常进行的字段优化器会自动生成索引;特别注意不要在选择的栏位上使用索引,这样是无意义的,最好在条件选择的语句上合理的使用索引。如where,order by。
举例:Select id,title,content,cat_id from article where cat_id=11;
这个语句在id,title,content上使用索引是毫无意义的,对这个语句没有任何优化作用。但如果在外键cat_id上使用索引,可以起到优化作用。
3.1.2 在SQL语句中GROUP BY、ORDER BY的字段上经常建立索引。
3.1.3 在条件表达式中用到的不同值较多的列上最好建立检索,在不同值较少的列上不需要建立索引,如性别字段上就不必建立索引。
3.1.4 经常存取的列应避免建立索引。
3.1.5 如果某些列需要建立连接应该建立索引。
3.1.6 如果有多个待排序的列,可在这些列上建立复合索引(compound index),但注意建立复合索引的顺序要按照使用的频度来确定。
3.1.7 在缺省情况下要建立非簇集索引,但有时也要考虑簇集索引,如:含有有限数目(不是很少)唯一的列,进行大范围的查询。
索引的充分利用可减少I/0的扫描次数,有效避免对整个表的搜索。当然索引的合理性要建立在对各种查询的分析和预测中,也取决于DBA所设计的数据库结构。
3.2 避免或简化排序
在数据库查询时应避免或简化对大型表的重复排序。在可以利用索引自动以适当的次序进行输出时,优化器可自动避免排序的步骤。为避免多余的排序,要适当的增减索引,适当地合并数据库表。如果实在避免不了排序,要考虑适当简化。
3.3 避免对大型表进行全表顺序扫描
在使用嵌套查询时,对表的顺序扫描会使查询效率明显下降。为避免这种情况,可以对连接的列进行索引。如有三个表:学生表Studen(t学号Sno、姓名Sname、性别Sex、年龄Sage、系别Sdept),课程表Course(课程号Cno,课程名Cname,先行课Cpno,学分Ccredit)和选课表SC(学号Sno、课程号Cno、成绩Score)。如果其中两个表要做连接,就要在“学号”这个连接字段上建立索引。
此外,也可使用并集来避免顺序存取。虽然在所有的列上都有索引,但某些形式的where子句迫使优化器使用顺序存取。以下例子是强迫对orders表执行顺序操作:
在Student.sno和SC.sno上虽建立了索引,但在这个语句中优化器还会使用顺序存取路径扫描整张表。因为这个语句检索的是分离的行的集合,所以应改为如下语句:
此时就可以利用索引路径处理查询,提高查询效率。
3.4 避免相关子查询
如果一个列的标签在主查询和where子句中的查询中同时出现,那么当主查询中的列值改变后,很可能子查询必须重新查询一次。查询嵌套的层次越多,效率就会越低,因此要尽量避免子查询。若子查询不可避免,就要在子查询中将多余的行全部过滤掉。
3.5 避免使用通配符匹配
在数据库查询中使用通配符匹配时特别耗费时间。如以Student表为例看like关键字:
在执行查询时就会利用索引来查询,显然会大大提高速度。
3.6 避免在where子句使用数据转换和串操作等函数操作
除以上优化方法之外,还应注意:(1)要避免在经常被更新的列上建立索引。因为每次更新操作,所有的索引都要做相应的调整。另外,所有的分页操作都被记录在日志中,这样也会增加I/O操作。(2)要避免在经常更新的列上建立聚集索引,以免引起整行的移动。(3)要尽量在where子句中少用OR和IN。可以考虑将其使用Union分成几个子查询。(4)应避免在where子句中使用NOT、<>、或!=运算符,减少全表扫描。
4 结束语
SQLServer是微软公司出品的关系型数据库管理(RDBMS)软件,虽应用很广,效率很高,但在实际应用过程中,随着数据库规模越来越大,数据量呈指数级上升,应进一步完善提升,从而继续改善数据库(尤其是大型数据库)的性能。
[1]石树刚.关系数据库[M].北京:清华大学出版社,1998
[2王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2006
[3]付立平,青巴图,郎彦.数据库原理与应用[M].北京:高等教育出版社,2004
[4]陈佳.基于SQL server数据库优化查询的分析 [J].企业导报,2010,8:179-181
[5]谷震离.SQL Server数据库应用程序性能优化方法[J].计算机工程与设计,2006,27(15)
G202
A
1671-6531(2013)07-0054-01
郭一鹤