欢迎来到天天文库
浏览记录
ID:13807601
大小:26.00 KB
页数:6页
时间:2018-07-24
《数据库管理系统中的查询优化》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、数据库管理系统中的查询优化 摘要:查询在数据库操作中有着广泛的应用,查询语句的优劣直接影响数据库应用系统的性能。随着数据库技术越来越广泛的应用,理解关系数据查询优化的方法,书写合理高效的查询语句,可以使数据库应用系统的性能得到很大程度的提升,进而提高人们的工作效率。本文主要讨论了SQL查询语句的优化,从而指出了查询优化在数据库管理系统中的重要作用及优化技巧。 关键词:关系数据库;查询优化;SQL语句 引言 查询优化是数据库管理系统设计和实现所采用的一项重要技术,也是影响数据库性能的关键因素。为了优化数据库的性能,除了在数据库的物理设计,关系规范化
2、等方面进行改进外,还有一个简单有效的方法就是通过设计高效合理的查询计划提高查询响应速度。 数据库管理系统处理查询计划的方式是:在做完查询语句的词法、语法检查之后,将语句提交给数据库管理系统的查询优化器进行代数优化和存取路径的优化,之后由预编译模块处理语句并生成查询规划,然后在合适的时间交由系统处理执行,最后将执行结果返回给用户。SQL语句是对数据库进行操作的唯一途径,应用程序的执行最终要归结为SQL语句的执行,SQL语句的效率对数据库系统的性能起到了决定性作用。因此对查询语句的优化是提高查询效率的根本。 一、SQL查询语句的优化策略 影响数据库系统
3、性能的因素很多,包括数据库连接方式、应用系统架构、数据库设计、管理等。其中最本质又至关重要的是数据库管理系统本身的查询优化技术。通过分析关系代数表达式的等价变换准则及查询代价,给定的SQL查询与关系代数表达式对应关系,研究出基于关系代数等价变换规则的SQL查询优化。此外,优化器的优化策略还与所查询表的内容和其他一些与服务器有关的因素有关。因此对优化器来讲,最为重要的选择就是使用什么索引和采用何种表的连接手段。如果用户提交的SQL语句和系统的索引体系是一个不合理的查询计划,仅仅经过系统优化器的优化,根本不可能变得高效。因此用户应合理适当的建立索引体系。
4、二、SQL查询的优化方法 设计高性能的SQL语句的前提是:熟悉你所用的优化器的优化策略并深入理解数据库中的数据,以及透彻的分析用户的需求。在此基础上,才能尝试编写效率最高的SQL语句,优化程序设计。以下所举实例中使用的数据表来自工作实际中的学生信息表(students)、教师信息表(teachers)以及学生成绩表(sc)。 1.合理使用常规优化查询 观察下面两组查询语句,它们查询的结果都是一样,但是查询的速度却有着明显的区别。 第1组:SELECT*FROMteachersWHEREsalary/25=1000 第2组:SELECT*FROM
5、teachersWHEREsalary=1000*25 第2组的语句,在经过了优化后,查询的速度减少了数十倍。因为,数据库优化器在面对第2组的salary=1000*25时,会转换成salary=25000进行查询,却不能将第1组中的salary/25=1000进行转换。鉴于此,应尽量写用常量跟字段比较检索的表达式,而不要将字段置于表达式当中,否则就没有办法进行优化。 2.拆分子句优化查询 使用了IN,OR子句的查询语句,常会使工作表中索引失效。在不会产生大量重复值的前提下,可以考虑把子句拆分开,要求拆分的子句中应该包含索引。在WHERE子句中的“
6、IN”在逻辑上相当于“OR”,所以数据库优化器会将snoin('01','02')转化为sno='0l'orsno='02'来执行。这里采用了“OR策略”,就是将满足每个OR子句的行取出,存入临时数据库的工作表中,再建立唯一索引去掉重复行,最后从这个临时表中计算结果。因此,实际过程中并没有利用sno的索引,这样还会因tempdb数据库性能的不同而影响查询时间。 假设在一个表table中有二十万行,其中no字段上有非群集索引,则执行下面这条语句的速度将会非常慢: SELECT*FROMtableWHEREnoIN('0','1') 当这个表中的行越来
7、越多,速度也将越来越慢。如果我们将这个OR子句分开,变成: SELECT*FROMtableWHEREno='0' SELECT*FROMtableWHEREno='1' 然后将得到的结果进行UINIO运算,执行的时间只需短短数秒,因为这里的每句都使用了索引,由此提高了查询速度。 3.使用存储过程优化查询 存储过程是用SQL语句和数据库编程语言编写的,完成一定的数据访问功能或提供一定的服务过程,预先进行编译和优化后,存储在服务器中,客户程序可以通过远程调用的模式调用它们,因此在执行时不需要将应用程序代码向服务器端传送,可以大大减轻网络负载。同时
8、,由于存储过程已编译为可执行代码,不需要每次执行时进行分析和优化工作,从而减少了
此文档下载收益归作者所有