Chinaunix首页 | 论坛 | 博客
  • 博客访问: 427256
  • 博文数量: 239
  • 博客积分: 8010
  • 博客等级: 中将
  • 技术积分: 2431
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-02 21:12
文章分类
文章存档

2008年(239)

我的朋友

分类: Oracle

2008-06-17 23:49:17

优化器的处理过程

在第2.2.7一节中,我们已经对优化器的处理过程有所了解,这里我们将作进一步的介绍。

数据库系统对SQL语句的处理,要经过以下三个步骤:

1)语法分析与翻译

2)优化

3)执行

其具体执行过程可见图5-1。其中,语法分析与翻译、优化过程由优化器进程完成,而SQL语句的执行由代理进程实现。对一个SQL语句,如果系统能够在内存中找到它的最终执行计划,就直接使用,不会再去分析与优化。

 

 

 

1. 语法分析与翻译

 

优化器对SQL语句的语法分析,就是构造该SQL语句的语法分析树表示,验证SQL语句是否存在语法错误、发出请求的用户是否有执行权限等。然后基于语法分析树,将SQL语句翻译成一个关系代数表达式。最后,对这个关系代数表达式使用等价转换规则,找出SQL语句所有等价的关系代数表达式,每一个关系代数表达式就对应SQL语句的一个执行方式。

 

2. 优化

 

对表中数据的访问,可以使用表扫描,也可以使用索引。在从多个表中返回结果时,要执行表的连接,可以采用嵌套循环连接,也可以使用排序归并连接、散列连接,并且表和表之间的连接顺序可以是任意的。SQL语句的一个执行方式,就是各种可能执行途径的一种组合和编排方式,明确指定了语句执行的访问路径、连接方式以及连接顺序等等。

SQL语句的不同执行计划,在性能、资源使用上可能会有非常大的差异。优化器对SQL语句的优化处理,就是要从SQL语句所有的执行方式中找出费用最低的一个,作为SQL语句最终的执行计划。而所谓SQL语句的执行费用,就是执行SQL语句时,所需执行时间、CPU使用、内存空间使用、I/O操作数量、生成的中间结果集数量等多方面因素的综合。其中由于I/O操作比较慢,是影响SQL语句运行的关键因素。一些系统的优化器就单纯以I/O操作的数量来衡量SQL语句的费用。

为了找出费用最低的执行计划,而将所有的执行计划都执行一遍,这是不可取、也是不现实的。优化器是根据数据字典中的相关信息,通过估算来决定每一个执行计划的执行费用,尽管这种估算有时候并不完全正确。

优化器对SQL语句的优化处理,由以下三个步骤完成:

1)根据关系代数表达式,使用等价转换规则,找出所有等价的执行计划。

2)依据数据字典中表和索引的结构定义和相关的统计信息,分别估算每一种执行计划的费用。

3)比较所有执行计划的费用,费用最低的那一个就是SQL语句最终的执行计划。

 

3. 优化器要使用的数据字典信息

 

在数据字典中,被优化器参照的表和索引信息,可以分为两大类:结构定义、数据库对象统计信息。对表、索引的结构定义,具体来说会包括以下这些:

1)表中的字段定义(类型,长度等)、字段的完整性定义、表上是否存在主键和外键、表上是否存在索引,等等。

2)索引建立在那些字段上、索引中字段的顺序(对复合索引而言)、索引的类型(唯一索引、非唯一索引、聚集索引),等等。

而对表、索引的统计信息,用户可以根据自己的需要进行选择、收集。大体来说,有以下的内容:

1)对一个表来说,可以统计:表中的字段个数、表中记录的长度、表中的记录数、表的块因子(即一个数据库的数据块可以存放的记录数)、表使用的数据页数,等等。

2)对表中的单个字段来说,可以统计其取值的最大值、最小值、不同取值的个数。可以设定字段取值区间的个数、区间中不同取值的个数,进而可以统计其在每一个取值区间内所包含的记录个数。也可以将多个字段合并在一起进行统计,等等。

3)对索引来说,可以统计:索引的高度、叶索引页的数目、索引中记录的长度、索引的块因子,等等。

正是依据这些结构定义和统计信息,优化器能够估算出SQL语句一个执行计划的执行成本。例如:根据一个查询条件,优化器可以检查相应字段的统计信息。如果查询条件中的数值大于字段最大值、或者小于字段最小值,优化器就可以判断符合条件的记录数为零;如果查询条件中的数值在字段的某个取值区间之中,优化器就根据该取值区间中不同取值的个数、所包含的记录个数,估算出符合条件的记录数,再根据表的块因子,估算存放这些记录需要多少数据页、读入内存需要多少次的I/O操作,进而估算出需要CPU、内存资源的数量,等等。

优化器的整个估算过程是复杂、耗时的,特别是对一些复杂的SQL语句,如:包含多个查询条件、需要多个表之间的连接、需要产生中间结果集、需要分组和排序等,将耗费更多的时间和系统资源。数据库系统会采取一些措施,来减少优化器对SQL语句的估算、优化次数,这一点我们会在下面讲到。

阅读(595) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~