首页 > 范文大全 > 正文

优化结构化查询语句提高数据库查询效率

开篇:润墨网以专业的文秘视角,为您筛选了一篇优化结构化查询语句提高数据库查询效率范文,如需获取更多写作素材,在线客服老师一对一协助。欢迎您的阅读与分享!

随着信息技术的不断发展,计算机技术在各个领域的应用也不断普及,作为管理大量数据的数据库其重要性也日显突出。在数据库的管理应用中,速度是一个永恒的话题,有许多因素影响到数据库的性能。如:操作系统、系统硬件、数据库的设计、访问数据库的应用软件等。本文主要针对数据库访问中的查询进行探讨。在具体的数据库管理中,查询操作所占的比重最大,而在查询操作中SELECT语句又是耗时最多的语句,如何采用合理优化的查询策略,提高查询效率,对于数据库的管理和应用是尤为重要的。

一、基于索引的优化设计原则

索引作为数据库中的重要对象,它的根本目的就是为了提高查询效率。而优化查询的重要方法就是建立索引。建立适合关系数据库系统的索引,可以避免在整个表中扫描,并减少因查询而造成的I/O占用,从而有效地提高数据查询速度。然而在创建索引的同时也不可避免地增加了系统时间和空间方面的占用。因此,为了实现真正意义上的优化查询,创建索引时应遵循如下原则:

1.建立比较窄的索引具有比较高的查询效率。对于比较窄的索引来说,每页上能存放较多的索引行,而且索引的级别也较少。所以,缓存中能放置更多的索引页,这样也减少了I/O操作。SQLServer优化器能分析大量的索引及其合并的可能性,所以与较少的宽索引相比,较多的窄索引能向优化器提供更多的选择,但对于不必要的索引不要保留,因为它们将增加存储和维护的开支。

2.对于复合索引、组合索引或多列索引,SQL Server优化器只保留最重要的列分布统计信息,因此,索引的第一列应该有很大的选择性,表上创建的索引过多会影响UPDATE、INSERT和DELETE操作的性能,因为所有的索引在做数据操作时都必须做相应的调整。另外,所有的分页操作都被记录在日志中,这也会增加I/O操作;由于存储开支和I/O操作方面的原因,较小的自组索引比较大的索引性能更好一些,但它的缺点是要维护自组的列。

3.尽量分析出每一个重要查询的使用字段频率,这样可以找出使用最多的索引,然后可以先对这些索引进行适当的优化,查询中的Where子句中的任何列都很可能是个索引列,因为优化器重点处理这样的子句;Order by或Group by命令一起使用的列一般适合创建为聚集索引,如果Order by命令中用到的列上有聚集索引,那么就不会再生成临时表了,因为记录已经排序;Group by命令则一定产生一个临时表;聚集索引不应该创建在经常修改的字段列上,因为这会引起整条记录的移动。在实现大型交易处理系统时,尤其要注意这一点,因为这些系统中数据往往是频繁变化的。

综上所述,在创建索引时应与实际需求相结合,针对查询频率较高的部分字段创建索引,使其能够真正提高数据检索速度。另外,对小于一定范围的小型表进行创建索引是不经济的,因为对于小表来说进行全表扫描往往更快而且费用低。

二、S Q L语句的书写优化

通常,在应用系统开发初期,由于数据库中数据比较少,对于SQL语句、复杂视图的编写等表现不出SQL语句各种写法的性能优劣。但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为系统需要解决的最主要问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于大量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统来讲,不是简单地能实现其功能就可以了,而是要写出高质量的SQL语句,以此来提高系统的高效性。

首先,在进行查询时,返回的值应该是查询所需要的。在查询中应该尽量减少对数据库中表的访问记录个数,使查询的结果范围最小,这就意味着在查询时,不能过多的使用通配符,如“select* fromtable1”语句,而应该做到最小化查询范围,要查询几行几列就选择几行几列,如“select col1 from table1”;多数情况下,用户并不需要查询到的所有数据,而只是需要部分或靠前的数据时,我们也可以通过SQL语句来进行限制查询的结果,如“selecttop50 percent col1 from table1” 。

其次,用exists 替代in、用not exists 替代not in。在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行连接,在这种情况下,使用Exists(或not exists) 通常会提高查询的效率。无论在哪种情况下,(not) in都是最低效率的,因为它对于查询中的表执行了一个全表遍历。为了避免使用(not) in ,我们可以把它改写成外连接“ left right full Outer Jo in”或“not exists”。

例: (高效) Select * from emp (基础表)

Where emp no>0 and exitts (select

* from deot where dept.deptno =

Emp.dept no and loc = ‘ melb')

(低效) Select * from emp (基础表)

Where empno > 0 and dept no in ( se-

lect dept no form dept where loc=’melb' )

最后,用Where子句替换Having子句,避免使用Having子句,Having只会在检索出所有记录之后才对结果集进行过滤。这个处理需要排序、总计等操作。如果能通过Where子句限制记录的数目,就能减少这方面的开销。

三、SQ L语句性能优化建议

避免嵌套连接,例如: a= b AND b= c OR c= d。Where条件中尽量减少使用常量比较,改用主机变量。系统可能选择基于规则的优化器,所以将结果集返回数据量小的表作为驱动表。大量的排序操作影响系统性能,所以尽量减少Order by和Group by排序操作。如必须使用排序操作,请遵循如下规则; 排序尽量建立在有索引的列上; 如结果集不需唯一,使用Union all代替Union。

索引使用时尽量避免对索引列进行计算,如索引列计算较多,建立函数索引;尽量注意保持比较值与索引列数据类型的一致性;对于复合索引,SQL 语句必须使用主索引列;索引中,尽量避免使用Null; 对于索引的比较,尽量避免使用< > (或= ) ;查询列和排序列与索引列次序应保持一致。

尽量避免相同语句由于书写格式的不同,而导致多次语法分析,尽量使用共享的SQL 语句。查询的Where过滤原则,应使过滤记录数最多的条件放在最前面,任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等,查询时要尽可能将操作移至等号右边。

总之,对于数据库的查询优化,只有抓住关键问题,才能提高查询效率,使数据库服务得到根本的改善和提高。