explain plan set STATEMENT_ID='testplan' for select * from dual;
select lpad(' ',5*(level-1))||operation operation, options, object_name, cost,position from plan_table start with id=0 and STATEMENT_ID='testplan' connect by prior id=parent_id ;
rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统本身给加上的。对每一个表都有一个rowid的伪列,可是表中并不物理存储ROWID列的值。不过你能够像使用其它列那样使用它,可是不能删除改列,也不能对该列的值进行修改、插入。一旦一行数据插入数据库,则rowid在该行的生命周期内是惟一的,即即便该行产生行迁移,行的rowid也不会改变。sql
有时为了执行用户发出的一个sql语句,Oracle必须执行一些额外的语句,咱们将这些额外的语句称之为‘recursive calls’或‘recursive SQL statements’。如当一个DDL语句发出后,ORACLE老是隐含的发出一些recursive SQL语句,来修改数据字典信息,以便用户能够成功的执行该DDL语句。当须要的数据字典信息没有在共享内存中时,常常会发生Recursive calls,这些Recursive calls会将数据字典信息从硬盘读入内存中。用户不比关心这些recursive SQL语句的执行状况,在须要的时候,ORACLE会自动的在内部执行这些语句。固然DML语句也均可能引发recursive SQL。简单的说,咱们能够将触发器视为recursive SQL。数据库
Driving Table(驱动表):该表又称为外层表(OUTER TABLE)。这个概念用于嵌套与HASH链接中。若是该row source返回较多的行数据,则对全部的后续操做有负面影响。注意此处虽然翻译为驱动表,但实际上翻译为驱动行源(driving row source)更为确切。通常说来a,是应用查询的限制条件后,返回较少行源的表做为驱动表,因此若是一个大表在WHERE条件有有限制条件(如等值限制),则该大表做为驱动表也是合适的,因此并非只有较小的表能够做为驱动表,正确说法应该为应用查询的限制条件后,返回较少行源的表做为驱动表。在执行计划中,应该为靠上的那个row source,后面会给出具体说明。oracle
Probed Table(被探查表):该表又称为内层表(INNER TABLE)。在咱们从驱动表中获得具体一行的数据后,在该表中寻找符合链接条件的行。因此该表应当为大表(实际上应该为返回较大row source的表)且相应的列上应该有索引。优化
由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则咱们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当咱们进行查询时可使用”where col1 = ? ”,也可使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,可是”where col2 = ? ”查询就不会使用该索引。因此限制条件中包含先导列时,该限制条件才会使用该组合索引。spa
比较一下列中惟一键的数量和表中的行数,就能够判断该列的可选择性。若是该列的”惟一键的数量/表中的行数”的比值越接近1,则该列的可选择性越高,该列就越适合建立索引,一样索引的可选择性也越高。在可选择性高的列上进行查询时,返回的数据就较少,比较适合使用索引查询。.net
第1个不加order by的SQL确定比第2个SQL效率高是毋庸置疑的。
可是为何第2个SQL的consistent gets如此之少?
缘由有以下两点:
翻译
set autotrace off : 不生成autotrace 报告,这是缺省模式3d
set autotrace on explain: autotrace只显示优化器执行路径报告code
set autotrace on statistics: 只显示执行统计信息blog
set autotrace on: 包含执行计划和统计信息
set autotrace traceonly: 同set autotrace on,可是不显示查询输
说明:用以查看SQL语句的执行计划
准备:
运行$ORACLE_HOME/rdbms/admin目录下的utlxplan.sql脚本
创建plan_table表
执行方案:explain plan for SQL