您好, 访客   登录/注册

数据库管理系统中的查询优化

来源:用户上传      作者:

  摘 要:查询在数据库操作中有着广泛的应用,查询语句的优劣直接影响数据库应用系统的性能。随着数据库技术越来越广泛的应用,理解关系数据查询优化的方法,书写合理高效的查询语句,可以使数据库应用系统的性能得到很大程度的提升,进而提高人们的工作效率。本文主要讨论了SQL查询语句的优化,从而指出了查询优化在数据库管理系统中的重要作用及优化技巧。
  关键词:关系数据库; 查询优化; SQL语句
  引言
  查询优化是数据库管理系统设计和实现所采用的一项重要技术,也是影响数据库性能的关键因素。为了优化数据库的性能,除了在数据库的物理设计,关系规范化等方面进行改进外,还有一个简单有效的方法就是通过设计高效合理的查询计划提高查询响应速度。
  数据库管理系统处理查询计划的方式是:在做完查询语句的词法、语法检查之后,将语句提交给数据库管理系统的查询优化器进行代数优化和存取路径的优化,之后由预编译模块处理语句并生成查询规划,然后在合适的时间交由系统处理执行,最后将执行结果返回给用户。SQL语句是对数据库进行操作的唯一途径,应用程序的执行最终要归结为SQL语句的执行,SQL语句的效率对数据库系统的性能起到了决定性作用。因此对查询语句的优化是提高查询效率的根本。
  一、SQL查询语句的优化策略
  影响数据库系统性能的因素很多,包括数据库连接方式、应用系统架构、数据库设计、管理等。其中最本质又至关重要的是数据库管理系统本身的查询优化技术。通过分析关系代数表达式的等价变换准则及查询代价,给定的SQL查询与关系代数表达式对应关系,研究出基于关系代数等价变换规则的SQL查询优化。此外,优化器的优化策略还与所查询表的内容和其他一些与服务器有关的因素有关。因此对优化器来讲,最为重要的选择就是使用什么索引和采用何种表的连接手段。如果用户提交的SQL语句和系统的索引体系是一个不合理的查询计划,仅仅经过系统优化器的优化,根本不可能变得高效。因此用户应合理适当的建立索引体系。
  二、SQL查询的优化方法
  设计高性能的SQL语句的前提是:熟悉你所用的优化器的优化策略并深入理解数据库中的数据,以及透彻的分析用户的需求。在此基础上,才能尝试编写效率最高的SQL语句,优化程序设计。以下所举实例中使用的数据表来自工作实际中的学生信息表(students )、教师信息表(teachers)以及学生成绩表(sc)。
  1.合理使用常规优化查询
  观察下面两组查询语句,它们查询的结果都是一样,但是查询的速度却有着明显的区别。
  第1组:SELECT*FROM teachers WHERE salary/25 =1000
  第2组:SELECT*FROM teachers WHERE salary =1000 * 25
  第2组的语句,在经过了优化后,查询的速度减少了数十倍。因为,数据库优化器在面对第2组的salary=1000* 25时,会转换成salary=25000进行查询,却不能将第1组中的salary/25=1000进行转换。鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中,否则就没有办法进行优化。
  2.拆分子句优化查询
  使用了IN,OR子句的查询语句,常会使工作表中索引失效。在不会产生大量重复值的前提下,可以考虑把子句拆分开,要求拆分的子句中应该包含索引。在WHERE子句中的“IN”在逻辑上相当于“OR”,所以数据库优化器会将sno in ('01', '02')转化为sno='0l' or sno='02'来执行。这里采用了“OR策略”,就是将满足每个OR子句的行取出,存入临时数据库的工作表中,再建立唯一索引去掉重复行,最后从这个临时表中计算结果。因此,实际过程中并没有利用sno的索引,这样还会因tempdb数据库性能的不同而影响查询时间。
  假设在一个表table中有二十万行,其中no字段上有非群集索引,则执行下面这条语句的速度将会非常慢:
  SELECT*FROM table WHERE no IN ('0',' 1')
  当这个表中的行越来越多,速度也将越来越慢。如果我们将这个OR子句分开,变成:
  SELECT*FROM table WHERE no='0'
  SELECT*FROM table WHERE no='1'
  然后将得到的结果进行UINIO运算,执行的时间只需短短数秒,因为这里的每句都使用了索引,由此提高了查询速度。
  3.使用存储过程优化查询
  存储过程是用SQL语句和数据库编程语言编写的,完成一定的数据访问功能或提供一定的服务过程,预先进行编译和优化后,存储在服务器中,客户程序可以通过远程调用的模式调用它们,因此在执行时不需要将应用程序代码向服务器端传送,可以大大减轻网络负载。同时,由于存储过程已编译为可执行代码,不需要每次执行时进行分析和优化工作,从而减少了预处理的时间,提高了效率。另一方面,使用存储过程还易于维护,且表的结构改变时,不影响客户端的应用程序。
  4.通过查询语句优化提高查询速度
  ⑴避免使用不兼容的数据类型
  查询的问题之一是在where子句中对有不同类型的列的比较企图。例如float和int;char和varchar;binary和varbinary是不兼容的。因此要求where子句中表达式的数据类型是兼容的,数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。
  ⑵避免或简化排序
  应当简化或避免对海量数据表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素,索引中不包括一个或几个待排序的列;group by或order by子句中列的次序与索引的次序不一样;排序的列来自不同的表。为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。
  ⑶避免相关子查询
  若子查询中引用外层查询的值,就构成相关子查询。执行时就不能象无关子查询那样,先单独处理子查询,再处理外层查询,而需要外层查询和子查询交叉进行。先用外层查询定位一行数据,这样子查询的引用就有了确定值,然后执行子查询,得到结果后判定外层查询定位的那行数据是否满足条件,再取下一条记录,再执行子查询……直到外层查询涉及的数据全部检查完为止。例如一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。这样的查询嵌套层次越多,效率越低,因此应当尽量避免子查询。
  三、结论
  以上所述只是对SQL查询进行优化的方法,查询优化的重点环节是使得数据库服务器少从磁盘中读数据,同时尽量避免非顺序读页。要想实现SQL的性能优化,还需要深人研究数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计等。为了能更好地实现数据库应用系统优化,平时需要多积累一些SQL语句的优化技巧,充分利用硬件性能和软件方法来解决。
  参考文献
  [1] 刘亚欣.数据库查询优化技术研究及其应用[D].大连理工大学,2006,(12)
  [2] 郭玉栋、左金平.SQL 语言查询优化方案探究[J].晋中学院学报,2006,(6)
  [3] 肖捷、肖正新、袁华强.关系数据库查询优化策略的分析与应用[J].计算机与现代化,2006,(11)
  [4] 宋喜忠.关系数据库查询优化技术探析[J].天中学刊,2008,23(2)
  [5] 柴美娟.基于关系数据库的查询优化[J].浙江工商职业技术学院学报,2005,(10)
转载注明来源:https://www.xzbu.com/9/view-5118479.htm