SQL Server 查询优化技术的研究与实现

2016-11-03 23:51王军弟
科技视界 2016年18期
关键词:方法

王军弟

【摘 要】随着数据量的激增,数据库的查询优化越来越重要,本文研究了适合大容量数据的数据库查询优化方案,提出了SQL语句中有效的查询优化方法,有效提高查询效率以及数据库的整体性能。

【关键词】SQL Server;查询优化;方法

数据库系统是管理信息系统的核心,是最为重要的计算机应用之一。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。举例来说,如果数据信息积累到上百万甚至上千万条记录,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见查询优化技术的重要性。

1 查询优化的必要性

关系系统的查询优化既是RDBMS实现的关键技术又是关系系统的优点所在。它减轻了用户选择存取路径的负担。用户只要提出“干什么”,不必指出“怎么干”。查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较好的效率,而且在于系统可以比用户程序的“优化”做得更好。所以查询优化在查询处理阶段对于选择执行查询的最有效策略起着至关重要的作用。当提交一条SQL语句时,DBMS 进行语法检查后,将语句提交给查询优化器,优化器再将SQL语句按照一定的优化方法分析为各个组成。SQL Server的查询优化器是一个基于成本的优化器。它为一个给定的查询分析出很多的候选的查询计划,并且估算每个候选计划的成本,从而选择一个成本最低的计划进行执行。实际上,因为查询优化器不可能对每一个产生的候选计划进行优化,所以查询优化器会在优化时间和查询计划的质量之间进行一个平衡,尽可能的选择一个“最优”的计划。用户提交的SQL语句是系统优化的基础,一个不合理的查询计划仅通过查询优化器进行优化,不可能高效,因此SQL语句书写的优劣至关重要。

2 查询优化的策略

2.1 统一SQL语句的写法

由于SQL不区分大小写,对于上面两句SQL语句,虽然程序员认为是相同的,但查询分析器就认为是两句不同的SQL语句,必须进行两次解析,生成2个执行计划。对于程序设计人员应该遵循同样的书写格式。

2.2 合理使用索引

索引是数据库中一个常用而重要的数据库对象,而优化查询重要的方法是建立索引,在关系数据库系统的表上建立合适的索引,可以避免表扫描并减少因查询而造成的I/O开销,提高数据库数据查询的速度,改善数据库性能。但是创建索引会增加系统的时间和空间的开销。因此创建索引时必须要与实现应用系统的查询需求密切结合,才能达到优化查询的目的。

在SQL Server中有聚集索引和非聚集索引,其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。在表中选择创建聚集索引时要特别注意,如果聚集索引没有建在表的顺序字段上,该表容易发生页分裂,导致查询操作效率低。

以订单表为例,有订单编号orderid,也有客户编号customerid,聚集索引应该建立在哪个字段上呢?对于该表,订单编号是顺序添加的,如果在orderid上加聚集索引,新增的行都是添加在末尾,这样不容易经常产生页分裂。然而,由于大多数查询都是根据客户编号来查的,因此,将聚集索引加在customerid上才有意义。而customerid对于订单表而言,并非顺序字段。

SQL Server的聚集索引实际上是对表按照聚集索引字段的顺序进行了排序。SQL Server的聚集索引就是表本身的一种组织形式,所以它的效率是非常高的。也正因为此,插入一条记录,它的位置不是随便放的,而是要按照顺序放在该放的数据页,如果那个数据页没有空间了,就引起了页分裂。所以很显然,聚集索引没有建在表的顺序字段上,该表容易发生页分裂,导致执行效率低。

客户“王盼盼”的“customerid”是001,那么“王盼盼”的订单信息必须都放在这张表的第一个数据页上,如果今天“王盼盼”新下了一个订单,那该订单信息不能放在表的最后一页,而是第一页!如果第一页放满了呢?则该表所有数据都要往后移动为这条记录腾地方,会导致更新操作效率大幅下降。对于聚集索引没有建在顺序字段上的表且大量进行数据更新操作的表,建议给与较低的页填充因子。

2.3 模糊查询慎用%

SQL Server中提供了两个模糊查询关键字%和_,其中%表示包含零个或任意多字符串,_表示任何单个字符。

关键词%josn%,由于josn前面用到了“%”,因此该查询必然扫描全表,执行效率低。除非必要,否则不要在关键词前加%。

2.4 连接查询优化

SQL Server提供三种连接方式Merge Join、Nested Loop Join、Hash Join。在表连接时要注意以下几方面:连接字段尽量选择聚集索引所在的字段,由于聚集索引所在字段表的顺序已经排好,只要两个表的数据连接即可,连接开销相当于是A表的数据加上B表的数据,执行效率高。仔细考虑where条件,先做选择运算,在连接前先尽量减小A、B表的结果集,在此基础上再进行连接。

其中,costumer表的主键是costumerid,order表的主键是costumerid。在该查询中通过选择操作首先在costumer表中将所在城市是北京的客户先筛选出来,在做连接操作,可以有效的提高查询效率。

2.5 使用存储过程

存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。

3 结束语

在数据库的开发和维护中,查询的优化设计可以提高系统性能,特别对于经常要用于查询且数据量大的数据库系统更显得重要。SQL查询优化的实质就是在结果正确的前提下,用优化器可以识别的语句,充分利用索引,减少表扫描的I/O次数。在执行用户的查询请求时,根据上述优化策略可以有效的减少查询时间,提高查询效率。因此,综合运用SQL Server2008的查询优化技术,对于大容量数据库和海量数据库的查询操作,具有实际的意义。

【参考文献】

[1]王珊,萨师煊.数据库系统概论[M].北京:高等教育出版社,2014.

[2]李菲.SQL Server数据库查询优化方法探究[J].福建电脑,2008(7).

[3]刘维学.SQL Server查询优化器原理与优化实例分析[J].计算机技术与发展,2013(11).

[4]张知青.基于关系数据库的查询方法及优化技术分析[J].煤炭技术,2012(5).

[责任编辑:王伟平]

猜你喜欢
方法
可能是方法不对
用对方法才能瘦
四大方法 教你不再“坐以待病”!
捕鱼