赵新华
摘 要:SQL查询已经广泛应用于数据库系统中,如何通过优化查询进而提高数据库的性能,本文从查询语句的使用,视图、存储过程以及索引的应用几方面进行了分析,并提出了优化方案。
关键词:查询优化;SQL;关系数据库
随着数据库技术的广泛应用,我们发现数据库应用中大量的工作是要进行数据查询和检索处理。基于关系数据库的标准查询语言SQL在数据库系统中被广泛使用,而我们在使用SQL查询数据时往往太注重结果而忽略了不同的查询方法导致效率的降低。数据查询效率和检索处理速度已经成为衡量数据库性能的一个重要指标。为了优化数据库的性能,除了改进数据库的硬件条件、软件环境和规范化设计外,还应该进行数据查询的优化。我认为可以从以下几方面进行查询优化。
一、索引优化
索引的概念:索引是对数据库表中一个或多个字段的值进行排序的一种数据结构,使用索引可以快速访问数据库表中的特定数据。数据库索引就好比一本书的目录,能加快数据库的查询速度,索引又分为聚集索引和非聚集索引,聚集索引是按照数据存放的物理位置为顺序,而非聚集索引则不是。聚集索引能提高多行检索的速度,非聚集索引对单行检索很快。
索引的使用原则:(1)索引要建立在使用率高的字段上,这样可以提高索引的使用率。(2)建立复合索引时要注意复合索引的顺序要按照使用的频度来确定。(3)在经常需要排序和分组的字段上建立索引,以加快排序和分组的时间。(4)一般不在数据值较少的字段上建立索引。因为如果数据值少的话有没有索引对查询效率影响并不明显。(5)对于经常存取修改的字段尽量不建立索引,因为这样会带来较大的维护工作。
合理建立索引能提高检索速度,但并不是索引越多越好,过多的索引会降低数据库系统的整体性能,因为索引是需要系统维护它,并且会产生索引碎片,所以我们建立索引时要综合考虑既要达到快速检索的目的,又不能降低系统整体性能。
二、SQL语句优化
(一)操作符的优化。(1)避免使用<>、NOT这样的操作符,这种操作符使系统无法使用索引而只能直接搜索表中的数据。例如:select pid from tb_product where pprice<>4000,优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。而我们改为:select pid from tb_product where pprice>4000 or pprice<4000,就可以使用索引查询,检索速度得到了提高。(2)尽量减少LIKE操作符的使用,LIKE操作符应用通配符查询可以实现几乎是任意的查询。但在字符串的比较中,有时大量字符的逐个比较,也会大大降低查找效率。
(二)select子句的优化。尽量减少select*的使用,用具体的列名代替*,过滤掉多余的列。使用top,distinct关键字减少多余重复的行,distinct在查询一个字段或者很少字段的情况下使用,会避免重复数据的出现,给查询带来优化效果,但是查询字段很多的情况下使用,则会大大降低查询效率,所以当查询字段多的时候要慎用。
(三)where子句的优化。合理设置WHERE条件的先后顺序。把能过滤更多数据的条件放在前面,过滤少的放后面,便可提高检索速度。
例如:select pname from tb_product where pquality=A and ptype =电脑产品
当产品质量大多为A时,我们就可以把语句改为:select pname from tb_product where ptype=电脑产品and pquality=A
这样通过ptype=电脑产品这个条件过滤掉的数据行要比pquality=A过滤掉的数据行多,从而提高了查询速度。
三、避免相关子查询
子查询的效率一般没有连接查询高,应该尽量用连接查询来代替子查询。除非必要,一般不要写有子查询的语句,如果必须用子查询的时候,在子查询里写尽量多条件,使得子查询返回的行数尽量少。
四、建立视图
视图可简化用户操作数据的方式,使用户能着重于所感兴趣的特定数据。如果该视图数据规模小于基本表,则基于视图的查询比原查询的速度会快得多。
五、使用存储过程
把常用的查询语句编写成存储过程,以此来取代应用程序中的查询语句,可以很大程度的增加SQL语句执行效率。存储过程是一个可重用的代码模块,存储过程创建后,可以在程序中任意调用,减少了重新编译的时间。
编写性能优化的SQL语句是提高数据库系统的重要因素,随着数据库管理系统中数据量的增大,如何提高查询速度与效率也是计算机软件开发的一个时代要求。实现优化查询的方法很多,在使用中,要根据具体情况权衡利弊,使数据库查询性能最优。
参考文献:
[1]黄崇本,韦存存.SQL SERVER数据库技术与应用 大连理工大学出版社,2014
[2]祁鵬年,数据库查询优化浅析,计算机光盘软件与应用,2014
[3]张燕琴,基于SQL Server数据库的查询优化,软件导刊,2012
[4]商惠华,关系数据库SQL查询语句的优化,2014.