论文部分内容阅读
摘要:本文重点围绕数据库的查询优化,从设计、管理和使用三方面着手,针对如何缩短大数据量的查询处理时间和提高数据库应用系统效率的问题,提出了相应的优化策略。本文首先分析了规范良好的数据库系统的设计对优化的影响;然后介绍了如何通过数据库的基本管理达到优化的目的;最后分析编写恰当的SQL语句进行优化的通用策略和原则,通过相应的解释加深读者对这些策略和方法的理解。
关键词:数据库;优化;查询
一、引言
由于数据库技术的不断创新和发展,数据库技术被越来越多的应用,而且也不断地开发出新的数据库应用系统和信息管理系统。而在数据库应用系统和信息管理系统的众多功能里面,必不可少的一向功能就是查询,查询功能也是数据库系统和信息管理系统中占最大比例的功能。数据库的查询功能对于整个数据库系统的效率有很大的影响,优化好的查询功能可以有效的提高效率,由此可见查询优化规划的重要性。只有从需求、设计到使用等环节都做好相应的规划和技术改进,才能最大程度的优化整个数据的查询功能。
二、数据库设计优化
数据库的设计是否优良从根本上决定了数据库查询效率的好坏,因此要提高数据库的查询效率首先就应该从数据库需求分析阶段入手。
1.详细的需求分析是优化的基础
数据库设计是从系统的需求出发,结合软硬件相关要求,设计符合系统需要功能的数据的集合。数据库模式的设计是数据库设计中最基本的环节,可以使用E-R图对数据库模式的设计进行建模。但是,往往需要经历一个反复且周期性的过程才能完善的设计出一个较为优秀的数据库系统。
2.数据库规范化是优化的关键
逻辑结构设计在数据库的设计周期中是必须要开展的,在这一设计中,为了达到优化数据库的目的必须规范关系模式。所谓关系规范化就是按统一标准对关系进行优化,从而最大程度上消除关系数据库中的数据冗余,消除添加、删除和修改等操作异常,以提高关系的质量。冗余度大、插入异常和删除异常是在操作不好的关系时经常会遇到的三个问题。在规范化理论中,关系中的各属性被认为是相互依赖和相互制约的,这样一个有严谨结构的整体才能构成。函数依赖、多值依赖和连接依赖三种类型大致就是参照属性间相关的关系而分类的,其中按照函数依赖又可分为部分依赖、完全依赖和传递依赖。根据这三类函数依赖可得到规范化等级,主要有5种,即第1范式(1NF),第2范式(2NF),第3范式(3NF),BC范式(BCNF)和第4范式(4NF),满足这些范式条件的关系模式可在不同程度上避免冗余、插入和更新异常问题。
三、数据库管理优化
当我们选定数据库管理软件,完成数据库的实现后,通过建立索引、存储过程等数据库管理手段可以进一步为提高数据库的查询效率打下基础。
1.合理使用索引
索引是数据库中重要的数据结构,提高查询的效率是设计索引的根本目的。索引的使用要恰到好处,其使用原则如下:在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。在频繁进行排序或分组的列上建立索引。在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
2.使用存储过程
存储过程是SQL语句和流程控制语句的集合,经编译后存储在数据库中。用户通过指定存储过程名字并给定参数来执行它。如某一操作包含大量的SQL代码或分别被多次执行,那么存储过程的执行速度快很多。因为存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句每执行一次就要编译一次,所以使用存储过程可提高数据库的运行效率。另外,存储过程保存在数据库中,比起从客户端发送SQL语句到数据库服务器,使用存储过程节省了网络传输的时间,这一定程度上提高了数据库的执行效率。
四、SQL语句优化
通过以上手段固然能有效的提高查询效率,但功能正确而编写不恰当的SQL语句同样能降低数据库的查询效率。以下就如何编写优良的SQL语句做介绍:
1.在进行查询时,返回的值应该是查询所需要的,即在查询中应该尽量减少对数据库表的访问列数,使查询返回的数据最小。这就意味着在查询时,不能过多的使用通配符,如:select*from table1语句,而应该做到最小化查询范围,要查询几列就选择几列,如:select col1 from table1。
2.多数情况下,当用户并不需要查询到的所有数据,而只是部分或靠前的数据时,这时我们可以通过SQL语句来限制查询的结果,如:select top 50 col1 from table1。
3.对于一些特殊的SQL语句,在使用时应正确选择。我们用一组例子来说明,如:EXISTS,NOT EXISTS。语句一:select sum(t1.c1) from t1 where (select count(*)from t2 where t2.c2=t1.c2)>0。语句二:select sum(t1.c1) from t1 where exists(select*from t2 where t2.c2=t1.c1)。两个语句所得到的结果相同,但语句二的效率要远高于语句一,因为语句一在查询中产生了大量的索引扫描。在对数据库查询时,所使用的语句多种多样,但选择恰当的字句能够有效的提高查询效率。
4. WHERE子句在使用时应该注意以下的问题:在WHERE子句中对字段进行null值判断,如:select id from t1 where name is null,使用in、not in、or、!= 或<>,都会导致索引失效而进行全表扫描。可以使用exist 和not exist代替in和not in。
5.充分利用“查询分析优化器”。以下两个语句是等效的:select * from table1 where name='zhangsan' and tID > 10000和select * from table1 where tID > 10000 and name='zhangsan'。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。会导致“查询分析优化器”失效的SQL操作有,or、NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等。
6.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,这将导致引擎放弃使用索引而进行全表扫描。如:查询name以abc开头的id的语句select id from t where substring(name,1,3)='abc'可以改为select id from t where name like 'abc%'。(作者单位:广安职业技术学院)
参考文献:
[1]徐慧.数据库技术与应用.北京:北京理工大学出版社,2010
[2](美)克罗恩克等著, 姜玲玲等译.数据库原理.北京: 清华大学出版社,2008
关键词:数据库;优化;查询
一、引言
由于数据库技术的不断创新和发展,数据库技术被越来越多的应用,而且也不断地开发出新的数据库应用系统和信息管理系统。而在数据库应用系统和信息管理系统的众多功能里面,必不可少的一向功能就是查询,查询功能也是数据库系统和信息管理系统中占最大比例的功能。数据库的查询功能对于整个数据库系统的效率有很大的影响,优化好的查询功能可以有效的提高效率,由此可见查询优化规划的重要性。只有从需求、设计到使用等环节都做好相应的规划和技术改进,才能最大程度的优化整个数据的查询功能。
二、数据库设计优化
数据库的设计是否优良从根本上决定了数据库查询效率的好坏,因此要提高数据库的查询效率首先就应该从数据库需求分析阶段入手。
1.详细的需求分析是优化的基础
数据库设计是从系统的需求出发,结合软硬件相关要求,设计符合系统需要功能的数据的集合。数据库模式的设计是数据库设计中最基本的环节,可以使用E-R图对数据库模式的设计进行建模。但是,往往需要经历一个反复且周期性的过程才能完善的设计出一个较为优秀的数据库系统。
2.数据库规范化是优化的关键
逻辑结构设计在数据库的设计周期中是必须要开展的,在这一设计中,为了达到优化数据库的目的必须规范关系模式。所谓关系规范化就是按统一标准对关系进行优化,从而最大程度上消除关系数据库中的数据冗余,消除添加、删除和修改等操作异常,以提高关系的质量。冗余度大、插入异常和删除异常是在操作不好的关系时经常会遇到的三个问题。在规范化理论中,关系中的各属性被认为是相互依赖和相互制约的,这样一个有严谨结构的整体才能构成。函数依赖、多值依赖和连接依赖三种类型大致就是参照属性间相关的关系而分类的,其中按照函数依赖又可分为部分依赖、完全依赖和传递依赖。根据这三类函数依赖可得到规范化等级,主要有5种,即第1范式(1NF),第2范式(2NF),第3范式(3NF),BC范式(BCNF)和第4范式(4NF),满足这些范式条件的关系模式可在不同程度上避免冗余、插入和更新异常问题。
三、数据库管理优化
当我们选定数据库管理软件,完成数据库的实现后,通过建立索引、存储过程等数据库管理手段可以进一步为提高数据库的查询效率打下基础。
1.合理使用索引
索引是数据库中重要的数据结构,提高查询的效率是设计索引的根本目的。索引的使用要恰到好处,其使用原则如下:在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。在频繁进行排序或分组的列上建立索引。在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。
2.使用存储过程
存储过程是SQL语句和流程控制语句的集合,经编译后存储在数据库中。用户通过指定存储过程名字并给定参数来执行它。如某一操作包含大量的SQL代码或分别被多次执行,那么存储过程的执行速度快很多。因为存储过程是预编译的,只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句每执行一次就要编译一次,所以使用存储过程可提高数据库的运行效率。另外,存储过程保存在数据库中,比起从客户端发送SQL语句到数据库服务器,使用存储过程节省了网络传输的时间,这一定程度上提高了数据库的执行效率。
四、SQL语句优化
通过以上手段固然能有效的提高查询效率,但功能正确而编写不恰当的SQL语句同样能降低数据库的查询效率。以下就如何编写优良的SQL语句做介绍:
1.在进行查询时,返回的值应该是查询所需要的,即在查询中应该尽量减少对数据库表的访问列数,使查询返回的数据最小。这就意味着在查询时,不能过多的使用通配符,如:select*from table1语句,而应该做到最小化查询范围,要查询几列就选择几列,如:select col1 from table1。
2.多数情况下,当用户并不需要查询到的所有数据,而只是部分或靠前的数据时,这时我们可以通过SQL语句来限制查询的结果,如:select top 50 col1 from table1。
3.对于一些特殊的SQL语句,在使用时应正确选择。我们用一组例子来说明,如:EXISTS,NOT EXISTS。语句一:select sum(t1.c1) from t1 where (select count(*)from t2 where t2.c2=t1.c2)>0。语句二:select sum(t1.c1) from t1 where exists(select*from t2 where t2.c2=t1.c1)。两个语句所得到的结果相同,但语句二的效率要远高于语句一,因为语句一在查询中产生了大量的索引扫描。在对数据库查询时,所使用的语句多种多样,但选择恰当的字句能够有效的提高查询效率。
4. WHERE子句在使用时应该注意以下的问题:在WHERE子句中对字段进行null值判断,如:select id from t1 where name is null,使用in、not in、or、!= 或<>,都会导致索引失效而进行全表扫描。可以使用exist 和not exist代替in和not in。
5.充分利用“查询分析优化器”。以下两个语句是等效的:select * from table1 where name='zhangsan' and tID > 10000和select * from table1 where tID > 10000 and name='zhangsan'。SQL SERVER中有一个“查询分析优化器”,它可以计算出where子句中的搜索条件并确定哪个索引能缩小表扫描的搜索空间,也就是说,它能实现自动优化。会导致“查询分析优化器”失效的SQL操作有,or、NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等。
6.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,这将导致引擎放弃使用索引而进行全表扫描。如:查询name以abc开头的id的语句select id from t where substring(name,1,3)='abc'可以改为select id from t where name like 'abc%'。(作者单位:广安职业技术学院)
参考文献:
[1]徐慧.数据库技术与应用.北京:北京理工大学出版社,2010
[2](美)克罗恩克等著, 姜玲玲等译.数据库原理.北京: 清华大学出版社,2008