读书笔记-《基于Oracle的SQL优化》-第二章-1(一)

2014-11-24 17:05:58 · 作者: · 浏览: 0
第二章:Oracle里的执行计划 2.1 什么是执行计划 Oracle用来执行目标SQL语句的这些步骤的组合就被称为执行计划。 执行计划可以分为如下三个部分: 1、目标SQL的正文、SQL ID和其执行计划所对应的的PLAN HASH VALUE。 2、执行计划的主体部分。 可以看到Oracle在执行目标SQL时所用的内部执行步骤,这些步骤的执行顺序,所对应的的谓词信息、列信息,优化器评估出来执行这些步骤后返回结果集的Cardinality、成本等内容。 执行计划行前*字符指执行步骤有对应的驱动或者过滤查询条件,这个星号对应的具体的驱动或过滤查询条件可以从执行计划的“Predicate Information(identified y operation id)”中找到。实际上,这部分内饿哦那个就是上述执行步骤所对应的谓词信息。access表示驱动查询条件。 3、执行计划的额外补充信息。 是否使用动态采样(dynamic sampling) 是否使用Cardinality Feedback(Oracle 11g中引入的修正执行计划中返回结果集的Cardinality的一种技术手段) 是否使用SQL Profile(Oracle 10g中引入的调整、稳定执行计划的一种方法)。
2.2 如何查看执行计划 (1)、explain plan命令 按F5,PL/SQL Developer就调用explain plan命令,F5只是explain plan命令上的一层封装而已。 语法: explain plan for + 目标SQL select * from table(dbms_xplan.display) 执行explain plan命令,则Oracle就将解析目标SQL所产生的执行计划的具体执行步骤写入PLAN_TABLE$,随后执行的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将这些具体执行步骤以格式化的方式显示出来。PLAN_TABLE$是一个ON COMMIT PRESERVE ROWS的GLOBAL TEMPORARY TABLE,所以这里Oracle可以做到各个session只能看到自己执行的SQL所产生的执行计划,并且各个session往PLAN_TABLE$写入执行计划的过程互不干扰。 SQL> select dbms_metadata.get_ddl('TABLE', 'PLAN_TABLE$', 'SYS') from dual; CREATE GLOBAL TEMPORARY TABLE "SYS"."PLAN_TABLE$" ( "STATEMENT_ID" VARCHAR2(30), "PLAN_ID" NUMBER, "TIMESTAMP" DATE, "REMARKS" VARCHAR2(4000), "OPERATION" VARCHAR2(30), "OPTIONS" VARCHAR2(255), "OBJECT_NODE" VARCHAR2(128), "OBJECT_OWNER" VARCHAR2(30), "OBJECT_NAME" VARCHAR2(30), "OBJECT_ALIAS" VARCHAR2(65), "OBJECT_INSTANCE" NUMBER(*,0),
"OBJECT_TYPE" VARCHAR2(30), "OPTIMIZER" VARCHAR2(255), "SEARCH_COLUMNS" NUMBER, "ID" NUMBER(*,0), "PARENT_ID" NUMBER(*,0), "DEPTH" NUMBER(*,0), "POSITION" NUMBER(*,0), "COST" NUMBER(*,0), "CARDINALITY" NUMBER(*,0), "BYTES" NUMBER(*,0), "OTHER_TAG" VARCHAR2(255), "PARTITION_START" VARCHAR2(255), "PARTITION_STOP" VARCHAR2(255),
"PARTITION_ID" NUMBER(*,0), "OTHER" LONG, "OTHER_XML" CLOB, "DISTRIBUTION" VARCHAR2(30), "CPU_COST" NUMBER(*,0), "IO_COST" NUMBER(*,0), "TEMP_SPACE" NUMBER(*,0), "ACCESS_PREDICATES" VARCHAR2(4000), "FILTER_PREDICATES" VARCHAR2(4000), "PROJECTION" VARCHAR2(4000), "TIME" NUMBER(*,0), "QBLOCK_NAME" VARCHAR2(30) ) ON COMMIT PRESERVE ROWS
Oracle 10g及其以上版本,explain plan命令在执行后确实将解析目标SQL所产生的执行计划的具体步骤写入了PLAN_TABLE$,随后执行的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将具体执行步骤以格式化的方式显示出来。 SQL> select count(*) from sys.plan_table$; COUNT(*)
----------
0

SQL> select sid from v$mystat where rownum < 2;
SID
----------
1178

SQL> select count(*) from v$mystat;
COUNT(*)
----------
604

SQL> select saddr from v$session where sid=1178;
SADDR
----------------
00000001EEC37778

SQL> select count(*) from v$transaction where ses_addr='00000001EEC37778';
COUNT(*)
----------
0

SQL> select count(*) from v$locked_object;
COUNT(*)
----------
0
SQL> explain plan for select empno, ename, dname from scott.emp, scott.dept where emp.deptno=dept.deptno;
Explained.
SQL> set long 90000
SQL> set heading off
SQL> set serveroutput on size 1000000
SQL> select operation, options, object_name, id, cardinality, cost from sys.plan_table$;
OPERATION
------------------------------
OPTIONS
--------------------------------------------------------------------------------
OBJECT_NAME ID CARDINALITY COST
------------------------------ ---------- ----------- ----------
SELECT STATEMENT
0 14 6
MERGE JO