`

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的Explain Plan是数据库管理员和开发人员用来分析SQL查询执行计划的重要工具。它能提供关于如何执行SQL语句的详细信息,包括哪些操作(如全表扫描、索引访问等)将被使用,以及这些操作的预计成本、时间及资源...

    oracle explain plan总结

    #### 一、Oracle 执行计划的重要性 在Oracle数据库中,为了提高查询效率和系统性能,我们需要对SQL语句进行优化。优化的第一步就是理解SQL语句的执行计划。执行计划是指Oracle数据库优化器为执行特定SQL语句所选择...

    Oracle中explain_plan的用法

    Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...

    Oracle中EXPLAIN PLAN的使用技巧

    其中,EXPLAIN PLAN是一个不可或缺的诊断工具,它用于分析和展示SQL语句的具体执行计划,从而让开发者和数据库管理员能够窥探SQL语句在执行过程中的每一步操作。通过对执行计划的深入理解,可以有效地诊断查询瓶颈,...

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

    在数据库管理领域,Oracle数据库的性能优化是一项至关重要的任务,其中`EXPLAIN PLAN`是数据库管理员和开发人员常用的工具,用于分析SQL查询的执行计划,从而理解查询如何在数据库中运行,找出潜在的性能瓶颈。...

    oracle执行计划建立与阅读

    在`SQL*Plus`环境中,可以使用`EXPLAIN PLAN FOR`命令来生成执行计划。例如: ``` SQL> explain plan for select sal from emp where deptno in (select deptno from dept); ``` 然后通过`DBMS_XPLAN.DISPLAY`...

    Oracle执行计划.ppt

    * Explain 语句:使用 Explain 语句可以获取执行计划,例如:Explain Plan Set STATEMENT_ID='testplan' For Select ….. * Autotrace 工具:Autotrace 是 Oracle 提供的一种工具,可以自动跟踪执行计划。 * 其他...

    Oracle执行计划分析

    为了生成执行计划,可以使用EXPLAIN PLAN命令结合DBMS_XPLAN包来进行。通过分析执行计划,可以了解Oracle是如何访问数据的,以及哪些操作可能导致性能瓶颈。这有助于识别潜在的问题并采取相应的优化措施。 - **生成...

    Oracle执行计划介绍与测试.pdf

    ### Oracle执行计划深入解析 #### 引言 在数据库领域,尤其对于大型企业级应用,Oracle数据库因其强大的功能和稳定性而被广泛采用。在Oracle中,执行计划是数据库优化器根据SQL语句特性生成的一系列步骤,用于指导...

    关于Oracle中执行计划稳定性深入研究

    3. 使用`EXPLAIN PLAN`或`AUTOTRACE`来分析和比较不同执行计划的性能。 4. 创建并使用物化视图和索引来改善查询性能。 5. 设置适当的优化器相关参数,如`optimizer_features_enable`,以控制特定版本的优化行为。 6....

    Oracle 执行计划、表分区

    - **EXPLAIN PLAN**:Oracle提供了一个名为`EXPLAIN PLAN`的工具,用于预览SQL语句的执行计划,而无需实际执行查询。 - **成本基础优化器**:Oracle使用成本基础优化器(CBO)来评估各种执行策略的成本,并选择...

    Oracle执行计划1.ppt

    其中,Explain 是通过 Execute Plan 语句生成执行计划的,Autotrace 是通过设置 autotrace 参数生成执行计划的。 在 Oracle 中,生成执行计划需要创建一个 Plan_table 表,用于存储执行计划的信息。该表包括了执行...

    Oracle 执行计划PPT

    了解执行计划有助于评估SQL语句的效率,通常可以通过`EXPLAIN PLAN`或`EXPLAIN PLAN FOR`命令预览执行计划。通过分析执行计划,可以识别可能导致性能瓶颈的操作,如全表扫描在大数据量时的低效,或者未充分利用索引...

    oracle explain plan

    ### Oracle Explain Plan详解 #### 一、引言 在Oracle数据库中,查询优化器(Oracle Optimizer)的主要职责是为SQL语句确定最高效的执行计划。优化器通过收集关于数据的统计信息,并利用Oracle数据库的各种特性(如...

    oracle怎么查看执行计划

    同样,与EXPLAIN PLAN相比,AUTOTRACE不仅展示了执行计划,还执行了SQL语句,从而能够提供更加准确的统计信息。 #### 准备工作 为了使用AUTOTRACE,需要进行以下准备工作: 1. **创建PLAN_TABLE** - 每个需要运行...

    Oracle执行计划与SQL优化实例.pptx

    1. **使用EXPLAIN PLAN语句**:通过`EXPLAIN PLAN FOR`语句生成执行计划,随后使用`DBMS_XPLAN.DISPLAY`包来格式化并显示执行计划。这一步并不执行SQL语句,仅生成执行计划。 2. **SQL\*Plus AutoTrace功能**:除了...

    explain plan interpreting

    在Oracle数据库系统中,"explain plan" 是一个关键的工具,用于分析和理解SQL查询的执行计划,也就是数据检索的路径。它可以帮助数据库管理员和开发人员优化查询性能,确保数据库高效运行。以下是对"explain plan ...

    Oracle 执行计划

    Oracle执行计划是数据库执行SQL语句前确定的操作步骤序列。...它更侧重于提供一个关于如何阅读和理解Oracle SQL执行计划的基础说明。通过实践和学习,用户可以逐渐深化对执行计划的理解,并在此基础上优化SQL语句。

    Oracle执行计划.pptx

    1. 使用 Explain 语句:Explain 语句可以用来获取执行计划,例如:Explain plan set STATEMENT_ID='testplan' for select * from dual; 2. 使用 Autotrace 语句:Autotrace 语句可以用来获取执行计划,例如:set ...

Global site tag (gtag.js) - Google Analytics