`

Oracle 执行计划(Explain Plan)说明

阅读更多

如果要分析某条SQL 的性能问题,通常我们要先看 SQL 的执行计划,看看 SQL 的每一步执行是否存在问题。 如果一条 SQL 平时执行的好好的,却有一天突然性能很差,如果排除了系统资源和阻塞的原因,那么基本可以断定是执行计划出了问题。

      

看懂执行计划也就成了 SQL 优化的先决条件。 这里的 SQL 优化指的是 SQL 性能问题的定位,定位后就可以解决问题。

 

 

一.         查看执行计划的三种方法

1.1 设置 autotrace

序号

命令

解释

1

SET AUTOTRACE OFF

此为默认值,即关闭 Autotrace 

2

SET AUTOTRACE ON EXPLAIN

只显示执行计划

3

SET AUTOTRACE ON STATISTICS

  只显示执行的统计信息

4

SET AUTOTRACE ON

  包含 2,3 两项内容

5

SET AUTOTRACE TRACEONLY

  ON 相似,但不显示语句的执行结果

 

SQL> set autotrace on

SQL> select * from dave;

        ID NAME

---------- ----------

         8 安庆

          1 dave

         2 bl

         1 bl

         2 dave

         3 dba

         4 sf-express

         5 dmm

 

已选择 8 行。

 

执行计划

----------------------------------------------------------

Plan hash value: 3458767806

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     8 |    64 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| DAVE |     8 |    64 |     2   (0)| 00:00:01 |

--------------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

          0  recursive calls

          0  db block gets

          4  consistent gets

          0  physical reads

          0  redo size

        609  bytes sent via SQL*Net to client

        416  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          8  rows processed

 

SQL>

 

1.2 使用 SQL

SQL>EXPLAIN PLAN FOR sql 语句 ;

SQL>SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

 

示例:

SQL> EXPLAIN PLAN FOR SELECT * FROM DAVE;

已解释。

SQL> SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));

或者:

SQL>   select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT

--------------------------------------------------------------------------------

Plan hash value: 3458767806

 

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     8 |    64 |     2   (0)| 00:00:01 |

|   1 |  TABLE ACCESS FULL| DAVE |     8 |    64 |     2   (0)| 00:00:01 |

--------------------------------------------------------------------------

已选择 8 行。

执行计划

----------------------------------------------------------

Plan hash value: 2137789089

--------------------------------------------------------------------------------

| Id  | Operation                         | Name    | Rows  | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                  |         |  8168 | 16336 |    29   (0)| 00:00:01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH| DISPLAY |  8168 | 16336 |    29   (0)| 00:00:01 |

---------------------------------------------------------------------------------------------

 

统计信息

----------------------------------------------------------

         25  recursive calls

         12  db block gets

        168  consistent gets

          0  physical reads

          0  redo size

        974  bytes sent via SQL*Net to client

        416  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          1  sorts (memory)

          0  sorts (disk)

          8  rows processed

SQL>

 

1.3 使用 Toad,PL/SQL Developer 工具

 

 

二.         Cardinality (基数) / rows

Cardinality 值表示 CBO 预期从一个行源( row source )返回的记录数,这个行源可能是一个表,一个索引,也可能是一个子查询。   Oracle 9i 中的执行计划中, Cardinality 缩写成 Card 10g 中, Card 值被 rows 替换。

 

这是 9i 的一个执行计划,我们可以看到关键字 Card

       执行计划

----------------------------------------------------------

   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=402)

   1    0   TABLE ACCESS (FULL) OF 'TBILLLOG8' (Cost=2 Card=1 Bytes=402)

 

Oracle 10g 的执行计划,关键字换成了 rows

执行计划

----------------------------------------------------------

Plan hash value: 2137789089

--------------------------------------------------------------------------------

| Id  | Operation                         | Name    | Rows   | Bytes | Cost (%CPU)| Time     |

---------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT                   |         |  8168 | 16336 |    29   (0)| 00:00:01 |

|   1 |  COLLECTION ITERATOR PICKLER FETCH| DISPLAY |  8168 | 16336 |    29   (0)| 00:00:01 |

---------------------------------------------------------------------------------------------

 

    Cardinality 的值对于 CBO 做出正确的执行计划来说至关重要。 如果 CBO 获得的 Cardinality 值不够准确(通常是没有做分析或者分析数据过旧造成),在执行计划成本计算上就会出现偏差,从而导致 CBO 错误的制定出执行计划。

 

    在多表关联查询或者 SQL 中有子查询时,每个关联表或子查询的 Cardinality 的值对主查询的影响都非常大,甚至可以说, CBO 就是依赖于各个关联表或者子查询 Cardinality 值计算出最后的执行计划。

 

    对于多表查询, CBO 使用每个关联表返回的行数( Cardinality )决定用什么样的访问方式来做表关联(如 Nested loops Join hash Join )。

 

 

    对于子查询,它的 Cardinality 将决定子查询是使用索引还是使用全表扫描的方式访问数据。

分享到:
评论

相关推荐

    oracle explain plan总结

    oracle执行计划,oracle explain plan,在ORACLE数据库中,需要对SQL语句进行优化的话需要知道其执行计划,从而针对性的进行调整.ORACLE的执行计划的获得有几种方法,下面就来总结下

    Oracle中explain_plan的用法

    详细讲解在Oracle中如何使用explain_plan,值得参考和收藏学习。

    ORACLE EXPLAIN PLAN的总结

    NULL 博文链接:https://babydeed.iteye.com/blog/1567772

    Oracle中EXPLAIN PLAN的使用技巧

    Oracle中EXPLAIN PLAN的使用技巧

    Oracle 执行计划

    Oracle 执行计划 explain sql execution plan

    oracle执行计划文档

    explain plan非常令人难解,初学者看看很好,有助于搞清楚最基本的概念

    数据库调优:ORACLE EXPLAIN PLAN的总结

    NULL 博文链接:https://qidaoxp.iteye.com/blog/758552

    oracle explain plan

    详细介绍了oracle解释计划的原理,对理解oracle解释计划非常有用。

    Oracle中获取执行计划的几种方法分析

    1. 预估执行计划 – Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中。 首先,在你要执行的SQL语句前加explain plan for,此时将生成的执行计划存储到计划...

    ORACLE数据库查看执行计划的方法

    一、什么是执行计划(explain plan) 执行计划:一条查询语句在ORACLE中的执行过程或访问路径的描述。 二、如何查看执行计划 1: 在PL/SQL下按F5查看执行计划。第三方工具toad等。 很多人以为PL/SQL的执行计划只能...

    为快捷显示Oracle执行计划创建存储过程

    第一种:不设置输出格式参数,即用默认的 SQL> create or replace procedure sql_explain(v_sql varchar2) ...  7 execute immediate 'explain plan for '||v_sql;  8 open explain_cursor fo

    ORACLE数据库DBA面试集锦

     CBO尝试找到最低成本的访问数据的方法,为了最大的吞吐量或最快的初始响应时间,计算使用不同 的执行计划的成本,并选择成本最低的一个,关于表的数据内容的统计被用于确定执行计划。  4:如何定位重要(消耗资源多)...

    oracle 语句

    explain plan for select ename,job,sal,comm from empcon where (sal-700);--已解释 desc plan_table; col id for 999 col operation for a16 col option for a16 col object_name for a16 Select id,operation,...

    DBA笔试题.wps

     2:不借助第三方工具,怎样查看sql的执行计划  set autot on  explain plan set statement_id = &item_id for &sql;  select * from table(dbms_xplan.display); 或者: SQL>EXPLAIN PLAN FOR SELECT * FROM ...

    Oracle SQL Handler (Oracle客户端工具) V3.1

    <7> 运行命令 "explain plan for SQL" 或按菜单项 "Explain Plan",能快速地显示 SQL 的执行计划; "Export" 按钮或菜单项,能直接将 SELECT 语句结果转化为 INSERT 语句,方便于数据移植、备份等 <8> 运行命令...

    oracle performance tuning

    query processing,Explain plan,autotrace

    深入解析Oracle.DBA入门进阶与诊断案例

    10.2.1 通过V$SQL_PLAN获得执行计划 479 10.2.2 EXPLAIN PLAN FOR与DBMS_XPLAN 483 10.2.3 通过AWR获取SQL执行计划 487 10.3 捕获问题SQL解决过度CPU消耗问题 488 10.3.1 使用vmstat检查系统当前情况 488 ...

    Oracle性能优化方法(SQL篇)

    1.如何分析SQL语句 2.选用适合的ORACLE优化器 3.用EXPLAIN PLAN 分析SQL语句 4.使用TKPROF 工具来查询SQL性能状态 5.表分区的应用

    ORACLE重建索引总结

    SQL> explain plan for alter index idx_policy_id2 rebuild online; Explained SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -----------------------------------------------------...

    一个oracle客户端(oracle sql handler)

    (2)“Explain Plan” 按钮能快速地显示语句的执行计划; (3)“Export” 按钮能将 SELECT 语句块直接导出为 INSERT 语句,方便于数据移植、备份等; (4)支持列块操作; (5)加上/去掉注释标记、加上/去掉...

Global site tag (gtag.js) - Google Analytics