使用聚集索引的最大好处就是能够根据查询要求,迅速缩小查询范围,避免全表扫描。比如要返回2004年4月1日到2004年10月1日之间的数据,如果在日期的字段建立了聚集索引,那么数据本来就是按照日期的顺序排列的,只要找到开始和结尾日期的数据就可以了,可以极大的节省时间。而如果使用非聚集索引,必须查到这个时间段中每个日期对应的位置,然后在根据位置存取数据,明显效率很低。显而易见,使用聚集索引的优势很明显。一个表只能按照一个固定的顺序来存储数据,因此,在建立聚集索引的时候一定要和实际查询相结合,看哪个字段对于查询贡献大,而且操作不是很频繁。
1.2.3 书写高效的SQL语句
虽然特定的数据库服务器都会对输入的查询语句进行一定的优化操作,但是查询效率主要取决于DBA所书写的SQL语句的好坏。为确保编写的SQL语句有较好的性能,应考虑以下的优化方法:
(1)尽量减少使用负逻辑的操作符和函数,因为它们会导致全表扫描,而且容易出错。可以把含有NOT、<> 等负逻辑的条件表达式转化为意思相当的正逻辑。
(2)字段提取要多少,取多少,避免使用“select *”格式,因为在数据量较大的时候,影响查询性能的最大因素不在与数据的查找,而在于物理I/O的操作。
(3)避免使用LIKE、EXISTS、IN等标准表达式,他们会使字段上的索引无效,引起全表扫描。尽量减少表的联接操作,不可避免的时候要适当增加一些冗余条件,使参与联接的字段集尽量少。
(4)OR会使字段上的索引失效,引起全表扫描。下面的例子中,可以把or子句分开,在把结果做加法和算,也可以编写一个存储过程来避免索引的失效。
(5)尽量减少使用联接字段而把所有的条件分列出来用and来进行连接,可以充分的利用在某些字段上已经存在的索引。
(6)尽量避免使用相关的嵌套查询。
1.2.4 Where字句的影响
Where子句说明查询的条件,直接决定查询的性能。因此在where子句的书写及应用中要多加注意。书写where 子句时尽量避免使用不兼容的数据类型,避免对where 子句中的条件参数使用其他的数学操作符,尽可能的把操作转化到式子的左边,这样可以有效的利用已有的索引技术。对于where字句中的多个选择条件,要选取结果集小的先执行。
1.2.5 存储过程的使用
存储过程由SQL语句和SPL语言的语句组成,创建后转换为可执行代码,作为数据库的一个对象存储在数据库中,存储过程的代码驻留在服务器端,因而执行时不需要将应用程序代码向服务器端传送,可以大大减轻网络负载,加快系统响应时间。同时,由于存储过程已编译为可执行代码,不需要每次执行时进行分析和优化工作,从而减少了预处理所花费的时间,提高了系统的效率。
1.2.6 视图的应用
利用视图不仅可以提高数据的保密性,方便的设置用户的权限,而且也可以提高数据的精炼性。在DBMS中有着许多不同的角色,他们对数据的要求是不同的,针对不同类别的用户分别建立合适的视图,可以在有效的条件下提高数据的有用性,提高系统对不同用户的查询响应时间。此外用户访问数据库一般要求得到的是最近的数据,比如查询话费,最常用的数据是最近三个月的。因此在许多情况下,可以按照时间对数据库中的数据进行水平分片,把最近一段时间的数据呈现给用户。当用户需要查找“过期”数据时再把相应的块调进来。由于这种情况极少发生,在一定的情况下,可以有效的减少数据量,缩小数据查找范围。使用这种方法要注意分区数据的维护,因此一定要在权衡维护和查询代价的基础上确定是否要使用分片。如果经常要访问全库数据进行综合对比的话,这种方法就不适用[5]。
2 分布式数据库系统概述
分布式数据库系统(Distributed Data Base System,DDBS),是计算机网络技术与数据库技术互相渗透和有机结合的产物。它的出现使得不同区域的数据可以相互共享,节省了大量的资源,从而提高了工作的效率与协调性。分布式数据库系统是物理上分布而逻辑上集中的数据库系统。物理上分布是指分布式数据库系统中的数据分布在由网络连接起来的、地理位置分散的不同站点上;逻辑上集中是指各数据库站点之间在逻辑上是一个整体,并由统一的数据库管理系统进行管理;同时各站点又独立地具有管理本地数据的能力。因为分布式数据库系统在物理上要实现数据的分布和冗余,这使得分布式数据库查询更加复杂,难度更大,所以为了提高查询效率,分布式查询处理的优化显得非常重要[6]。
2.1 分布式数据库查询过程
分布式数据库中的查询过程主要包括查询分解、查询转换和全局优化三个部分。在分布式数据库中,用户可以根据全局数据模式用全局查询语言对多个局部数据库同时进行查询。一个全局查询一般要经过以下三步处理:
(1)把全局查询分解成多个逻辑子查询,每一个子查询对应一个局部数据库中的数据,分解后的子查询是用全局查询语言表示的。
(2)如果全局查询语言与局部数据库的查询语言不同,还要将每一个逻辑子查询都转换成相应的局部数据库的本地语言并传到相应的局部数据库中执行。
(3)所有子查询的结果返回并组合成最终的查询结果。一个全局查询被分解成两类逻辑子查询:一类是相对应于每一个局部数据库模式的子查询,称为输出模式子查询;另一类是把各个子查询结果合并成输出结果的查询语句,称为后处理查询。
通过查询分解以后,每一个子查询对应一个局部数据库,但子查询的查询语言还是全局查询语言,如果全局查询语言和本地语言不同,还要通过查询转换把全局查询语言转换成本地查询语言。
不同的查询分解对应不同的系统性能,因此为达到优化系统性能的目的,还需要相应的查询优化器。查询优化器确定出一个执行计划,说明需要访问哪些局部数据库,如何组合成中间结果,在哪个站点执行全局处理等,最后启动执行查询计划。
在这里,我们只是粗略地了解一下查询过程,重点是要阐述分布式数据库查询优化。
2.2 分布式数据库查询优化的目标
查询处理和优化在关系数据库系统中占有非常重要的地位,也是分布式数据库主要研究问题之一。在集中式数据库中,查询优化的目的在于为每个用户查询寻求总代价最小的执行策略。由于这种系统一般都运行在单个的计算机上,那么使总代价最小就意味着使查询的响应时间最短,所以查询执行总代价=CPU代价+I/O代价。
在分布式数据库系统中,由于数据的分布和冗余,使得查询处理中需要考虑站点间传输数据的通信费用,所以除了考虑CPU代价和I/O代价之外,还应该包括数据在网络上的传输代价,即总代价=CPU代价+I/O代价+通信代价。
转贴于 酷文网-论文下载中心 http://www.coolwen.net
共7页: 上一页 [1] 2 [3] [4] [5] [6] [7] 下一页
网摘收藏: