ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 执行计划一:相关概念

执行计划一:相关概念

原创 Linux操作系统 作者:zofe2008 时间:2009-02-22 14:54:37 0 删除 编辑

一、什么是执行计划

一个SQL语句表示你所想要得到的但是并没有告诉Server如何去做. 例如, 利用一个SQL语句, 你可能要Server取出所有住在Prague的客户. Server收到的这条SQL的时候, 第一件事情并不是解析它. 如果这条SQL没有语法错误, Server才会继续工作. Server会决定最好的计算方式. Server会选择, 是读整个客户表好呢, 还是利用索引会比较快些. Server会比较所有可能方法所耗费的资源. 最终SQL语句被物理性执行的方法被称做执行计划或者是查询计划.

     
一个执行计划由若干基本操作组成. 例如, 遍历整张表, 利用索引, 执行一个嵌套循环或Hash连接等等. 所有的基本操作都有一个输出: 结果集. 有些操作, 比如嵌套循环, 有一个输入. 还有一些操作, 比如Hash连接, 有两个输入. 每个输入应与其它基本操作的的输出相连接. 这也就是为什么一个执行可以被看做是一棵树的原因: 信息从树叶流向树根
.
      
负责处理或计算最优的执行计划的DB Server组件叫优化器. 优化器是建立在其所在的DB资源的基础上而进行工作的
.
   
说白了就是数据库服务器在执行sql语句之前会制定几套执行计划!看哪个计划消耗的系统资源少,就是用那套计划!被数据库服务器执行的那天执行计划就叫做sql语句的执行计划!

 

二、相关概念

 

要想比较透彻的理解执行计划并据此来调优SQL,需要先了解以下相关的概念:

 

Rowidrowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的。 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值。不过你可以像使用其它列那样使用它,但是不能删除改列,也不能对该列的值进行 修改、插入。一旦一行数据插入数据库,则rowid在该行的生命周期内是唯一的,即即使该行产生行迁移,行的rowid也不会改变。

 

Recursive SQL有时为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句,我们将这些额外的语句称之为'recursive calls''recursive SQL statements'。如当一个DDL语句发出后,ORACLE总是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便用户可以成功的执行该DDL语句。当需要的数据字典信息没有在共享内存中时,经常会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。用户并不关心这些recursive SQL语句的执行情况,在需要的时候,ORACLE会自动的在内部执行这些语句。当然DML语句与SELECT都可能引起recursive SQL。简单的说,我们可以将触发器视为recursive SQL

 

Row Source用在查询中,由上一操作返回的符合条件的行的集合,即可以是表的全部行数据的集合;也可以是表的部分行数据的集合;也可以为对上2row source进行连接操作(join连接)后得到的行数据集合。

 

Predicate(谓词)一个查询中的WHERE限制条件。

 

Driving Tables(驱动表)该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH连接中。如果该row source返回较多的行数据,则对所有的后续操作有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。一般说来,是应用查询的限制条件后,返回较少行源的表作为驱动表,所以如果一个大表在WHERE条件有有限制条件(如等值限 ),则该大表作为驱动表也是合适的,所以并不是只有较小的表可以作为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表作为驱动表。在执行 计划中,应该为靠上的那个row source,后面会给出具体说明。在我们后面的描述中,一般将该表称为连接操作的row source 1

 

Probed Table(被探查表)该表又称为内层表(INNER TABLE)。在我们从驱动表中得到具体一行的数据后,在该表中寻找符合连接条件的行。所以该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。在我们后面的描述中,一般将该表称为连接操作的row source 2

 

组合索引(Concatenated index)由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。

 

可选择性:比较一下列中唯一键的数量和表中的行数,就可以判断该列的可选择性。 如果该列的唯一键的数量/表中的行数的比值越接近1,则该列的可选择性越高,该列就越适合创建索引,同样索引的可选择性也越高。在可选择性高的列上进 行查询时,返回的数据就较少,比较适合使用索引查询。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14969361/viewspace-557351/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-01-17

  • 博文量
    24
  • 访问量
    42336