`
dreamoftch
  • 浏览: 498086 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

plsql 分析 执行计划

阅读更多
基于oracle的应用系统很多性能问题,是由应用系统sql性能低劣引起的,所以,sql的性能优化很重要,分析与优化sql的性能我们一般通过查看该sql的执行计划,本文就如何看懂执行计划,以及如何通过分析执行计划对sql进行优化做相应说明。

一、什么是执行计划(explain plan)

执行计划:一条查询语句在oracle中的执行过程或访问路径的描述。

二、如何查看执行计划

1.set autotrace on

2.explain plan for sql语句;

select plan_table_output from table(dbms_xplan.display());

3.通过第3方工具,如plsql developer(f5查看执行计划)、toad等;

三、看懂执行计划

1.执行计划中字段解释

SQL> select * from scott.emp a,scott.emp b where a.empno=b.mgr;   已选择13行。       执行计划   ----------------------------------------------------------   Plan hash value: 992080948   ---------------------------------------------------------------------------------------   | Id  | Operation                    | Name   | Rows  | Bytes | Cost (%CPU)| Time     |   ---------------------------------------------------------------------------------------   |   0 | SELECT STATEMENT             |        |    13 |   988 |     6  (17)| 00:00:01 |   |   1 |  MERGE JOIN                  |        |    13 |   988 |     6  (17)| 00:00:01 |   |   2 |   TABLE ACCESS BY INDEX ROWID| EMP    |    14 |   532 |     2   (0)| 00:00:01 |   |   3 |    INDEX FULL SCAN           | PK_EMP |    14 |       |     1   (0)| 00:00:01 |   |*  4 |   SORT JOIN                  |        |    13 |   494 |     4  (25)| 00:00:01 |   |*  5 |    TABLE ACCESS FULL         | EMP    |    13 |   494 |     3   (0)| 00:00:01 |   ---------------------------------------------------------------------------------------       Predicate Information (identified by operation id):   ---------------------------------------------------      4 - access("A"."EMPNO"="B"."MGR")          filter("A"."EMPNO"="B"."MGR")      5 - filter("B"."MGR" IS NOT NULL)       统计信息   ----------------------------------------------------------             0  recursive calls             0  db block gets            11  consistent gets             0  physical reads             0  redo size          2091  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)            13  rows processed   SQL> 对上面执行计划列字段的解释:

Id: 执行序列,但不是执行的先后顺序。执行的先后根据Operation缩进来判断(采用最右最上最先执行的原则看层次关系,在同一级如果某个动作没有子ID就最先执行。 一般按缩进长度来判断,缩进最大的最先执行,如果有2行缩进一样,那么就先执行上面的。)

如:上面执行计划的执行顺序为:3--》2--》5--》4--》1

Operation: 当前操作的内容。

Name:操作对象

Rows:也就是10g版本以前的Cardinality(基数),Oracle估计当前操作的返回结果集行数。

Bytes:表示执行该步骤后返回的字节数。

Cost(CPU):表示执行到该步骤的一个执行成本,用于说明SQL执行的代价。

Time:Oracle 估计当前操作的时间。

 

2.谓词说明:

Predicate Information (identified by operation id):

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

4 - access("A"."EMPNO"="B"."MGR")

filter("A"."EMPNO"="B"."MGR")

5 - filter("B"."MGR" IS NOT NULL)

 

Access: 表示这个谓词条件的值将会影响数据的访问路劲(全表扫描还是索引)。

Filter:表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

在谓词中主要注意access,要考虑谓词的条件,使用的访问路径是否正确。

 

四、 动态分析

如果在执行计划中有如下提示:

Note

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

-dynamic sampling used for the statement

 

这提示用户CBO当前使用的技术,需要用户在分析计划时考虑到这些因素。 当出现这个提示,说明当前表使用了动态采样。 我们从而推断这个表可能没有做过分析。

这里会出现两种情况:

(1) 如果表没有做过分析,那么CBO可以通过动态采样的方式来获取分析数据,也可以或者正确的执行计划。

(2) 如果表分析过,但是分析信息过旧,这时CBO就不会在使用动态采样,而是使用这些旧的分析数据,从而可能导致错误的执行计划。

 

五、表访问方式

1.Full Table Scan (FTS) 全表扫描

2.Index Lookup 索引扫描

There are 5 methods of index lookup:

index unique scan --索引唯一扫描

Method for looking up a single key value via a unique index. always returns a single value, You must supply AT LEAST the leading column of the index to access data via the index.

 

index range scan --索引局部扫描

Index range scan is a method for accessing a range values of a particular column. AT LEAST the leading column of the index must be supplied to access data via the index. Can be used for range operations (e.g. > < <> >= <= between) .

 

index full scan --索引全局扫描

Full index scans are only available in the CBO as otherwise we are unable to determine whether a full scan would be a good idea or not. We choose an index Full Scan when we have statistics that indicate that it is going to be more efficient than a Full table scan and a sort. For example we may do a Full index scan when we do an unbounded scan of an index and want the data to be ordered in the index order.

 

index fast full scan --索引快速全局扫描,不带order by情况下常发生

Scans all the block in the index, Rows are not returned in sorted order, Introduced in 7.3 and requires V733_PLANS_ENABLED=TRUE and CBO, may be hinted using INDEX_FFS hint, uses multiblock i/o, can be executed in parallel, can be used to access second column of concatenated indexes. This is because we are selecting all of the index.

 

index skip scan --索引跳跃扫描,where条件列是非索引的前导列情况下常发生

Index skip scan finds rows even if the column is not the leading column of a concatenated index. It skips the first column(s) during the search.

 

3.Rowid 物理ID扫描

This is the quickest access method available.Oracle retrieves the specified block and extracts the rows it is interested in. --Rowid扫描是最快的访问数据方式

 

六、表连接方式

请参照另一篇文章:Oracle 表连接方式详解

http://www.fengfly.com/plus/view-210420-1.html

 

七、运算符

1.sort --排序,很消耗资源

There are a number of different operations that promote sorts:

(1)order by clauses (2)group by (3)sort merge join –-这三个会产生排序运算

 

2.filter --过滤,如not in、min函数等容易产生

Has a number of different meanings, used to indicate partition elimination, may also indicate an actual filter step where one row source is filtering, another, functions such as min may introduce filter steps into query plans.

 

3.view --视图,大都由内联视图产生(可能深入到视图基表)

When a view cannot be merged into the main query you will often see a projection view operation. This indicates that the 'view' will be selected from directly as opposed to being broken down into joins on the base tables. A number of constructs make a view non mergeable. Inline views are also non mergeable.

 

4.partition view --分区视图

Partition views are a legacy technology that were superceded by the partitioning option. This section of the article is provided as reference for such legacy systems.

 

附:oracle优化器(Optimizer)

 

Oracle 数据库中优化器(Optimizer)是SQL分析和执行的优化工具,它负责指定SQL的执行计划,也就是它负责保证SQL执行的效率最高,比如优化器决定Oracle 以什么样的方式来访问数据,是全表扫描(Full Table Scan),索引范围扫描(Index Range Scan)还是全索引快速扫描(INDEX Fast Full Scan:INDEX_FFS);对于表关联查询,它负责确定表之间以一种什么方式来关联,比如HASH_JOHN还是NESTED LOOPS 或者MERGE JOIN。 这些因素直接决定SQL的执行效率,所以优化器是SQL 执行的核心,它做出的执行计划好坏,直接决定着SQL的执行效率。

Oracle 的优化器有两种:

RBO(Rule-Based Optimization): 基于规则的优化器

CBO(Cost-Based Optimization): 基于代价的优化器

从Oracle 10g开始,RBO 已经被弃用,但是我们依然可以通过Hint 方式来使用它。 

 

在Oracle 10g中,CBO 可选的运行模式有2种:

(1) FIRST_ROWS(n)

Oracle 在执行SQL时,优先考虑将结果集中的前n条记录以最快的速度反馈回来,而其他的结果并不需要同时返回。

(2) ALL_ROWS -- 10g中的默认值

Oracle 会用最快的速度将SQL执行完毕,将结果集全部返回,它和FIRST_ROWS(n)的区别在于,ALL_ROWS强调以最快的速度将SQL执行完毕,并将所有的结果集反馈回来,而FIRST_ROWS(n)则侧重于返回前n条记录的执行时间。

修改CBO 模式的三种方法:

(1) SQL 语句:

Sessions级别:

SQL> alter session set optimizer_mode=all_rows;

(2) 修改pfile 参数:

OPTIMIZER_MODE=RULE/CHOOSE/FIRST_ROWS/ALL_ROWS

(3) 语句级别用Hint(/* + ... */)来设定

Select /*+ first_rows(10) */ name from table;

Select /*+ all_rows */ name from table;


 原文网址:http://www.fengfly.com/plus/view-210418-1.html

分享到:
评论

相关推荐

    使用plsql查看执行计划

    总的来说,理解和分析Oracle的执行计划是优化数据库性能的重要手段。通过观察执行计划中的操作类型(如全表扫描、索引扫描等)、成本和字节数,我们可以找出性能瓶颈,并通过调整索引、更新统计信息或优化查询语句来...

    PLSQL程序性能分析及优化

    PLSQL程序性能分析及优化 经验总结 实施过程中,经常会使用 PL/SQL Developer 工具进行数据转换和处理业务数据。通过性能 优化来提高程序执行效率是必须掌握的一份技能。性能问题中绝大部分都是由于程序编写的 不合理...

    PLSQL_Developer_7.0解释计划

    PL/SQL Developer是一款专为Oracle数据库设计的集成开发环境(IDE),其7.0版本集成了解释计划工具,使得用户可以直接在IDE内部查看和分析SQL语句的执行计划。这一功能极大地简化了数据库性能调优的过程,使开发者...

    PLSQL程序优化和性能分析方法

    PLSQL程序优化和性能分析方法 PLSQL程序优化是指在编写PLSQL程序时,为了提高程序的执行效率和性能所采取的一系列措施和技术。这些措施和技术可以帮助开发者编写高效、可靠、可维护的PLSQL程序,从而提高系统的整体...

    表提示不能执行,PLSQL Developer

    在使用PLSQL Developer工具进行数据库开发的过程中,可能会遇到“表提示不能执行”的问题。这通常是因为用户对某些表或视图没有足够的权限所导致的。本文将详细介绍这一问题及其解决方案。 ### 一、问题背景 #### ...

    PLSQL隔断时间再执行sql的时候卡死未响应(要等很久才有结果)解决办法

    - 检查SQL语句的执行计划,确保使用了最优路径。 - 合理建立索引,提高数据检索速度。 - 避免使用过度嵌套的子查询,尝试转换为JOIN操作。 2. **调整网络配置**: - 检查客户端到数据库服务器的网络状况,确保...

    PLSQL性能分析方法.doc

    PLSQL程序优化与性能分析是数据库管理中至关重要的一个环节,尤其在处理大量数据时,高效的PL/SQL代码能够显著提升系统性能。本文档主要针对PLSQL中的SQL优化,旨在帮助开发者了解如何评估SQL执行效率并采取相应的...

    PLSQL程序优化和性能分析方法.pdf

    优化器可以根据不同的执行环境和数据分布来选择最优的执行计划,以提高查询效率。 2.4 PLSQL 优化 PLSQL 优化是指通过对 PLSQL 代码的修改和调整来提高程序的执行效率和性能。以下是一些常见的 PLSQL 优化方法: *...

    PLSQL.rar_pl\sql_plsql_plsql java 分析_语法分析

    在本压缩包“PLSQL.rar”中,包含了一个针对PLSQL语法分析的软件及相关资源,帮助用户理解和解析PLSQL代码。 PLSQL由以下几个主要部分组成: 1. **声明部分(Declaration)**:在此部分,程序员可以声明变量、常量...

    PLSQL_Developer8.0绿色版64位

    8. **性能分析**:提供性能分析工具,如执行计划分析,帮助优化SQL语句,提升数据库性能。 9. **脚本执行**:用户可以编写和执行批处理脚本,进行数据库维护或自动化任务。 10. **连接管理**:支持多个数据库连接...

    转帖--oracle分析函数+PLSQL小结

    - 分析函数的窗口定义了行的集合,这些行用于执行分析操作。可以基于行序、分组或特定条件定义窗口。 - ORDER BY子句用于定义行的排序,PARTITION BY子句用于定义数据的分区。 3. PL/SQL块结构: - DECLARE:...

    plsql 32位下载

    2. **调试器**:内置调试器允许设置断点、单步执行、查看变量值,便于定位和解决程序问题。 3. **数据库连接**:可以轻松连接到多个Oracle数据库实例,进行数据查询和管理。 4. **数据浏览**:直观展示表、视图、...

    PLSQL调试存储过程

    8. **性能分析**:在某些高级IDE中,还可以进行性能分析,查看哪些部分的代码执行时间较长,从而优化代码。 9. **日志记录**:在代码中插入日志语句也是一种有效的调试方法,通过查看日志输出,可以了解程序执行的...

    PlSql中的 CnPlugin 插件

    PL/SQL Developer(简称PLSQL)是一款由Allround Automations公司开发的专业Oracle数据库管理与开发工具,它为数据库管理员和开发人员提供了强大的功能,包括编写、调试、执行SQL和PL/SQL代码等。而CnPlugin是针对...

    PLSQL developer 64 位

    6. **报表生成**:能够生成关于数据库对象的详细报告,有助于理解和分析数据库结构。 7. **版本控制集成**:可以与常见的版本控制系统(如Git、SVN等)集成,便于团队协作开发。 在使用PLSQL Developer时,用户可能...

    PLSQL v12.0 Oracle 64

    7. **性能分析**:通过执行计划和性能监控,帮助优化SQL语句和PL/SQL块的执行效率。 8. **脚本执行**:可以批量执行一系列SQL或PL/SQL命令,适合日常维护任务或自动化工作流。 9. **数据库连接管理**:用户可以...

    PLSQL Developer 8.0汉化包

    PLSQL Developer是一款强大的Oracle数据库开发工具,主要用于编写、调试、执行和管理PL/SQL代码。这个8.0版本的汉化包是专为那些需要中文界面的用户设计的,使得国内用户在使用PLSQL Developer时能更加方便地理解和...

    PLSQL 中文乱码.docx

    但是,在执行 SQL 语句时,PLSQL 经常会出现中文乱码的问题,导致输出的中文标题显示成问号????。今天,我们将讨论这个问题的解决方案。 问题描述 在 PLSQL 中执行 SQL 语句时,如果语句中包含中文字符,输出的...

    plsql中文免安装版

    10. **性能优化**:通过分析执行计划和性能监控,PLSQL Developer有助于找出性能瓶颈并提供优化建议。 总的来说,"PLSQL中文免安装版"是一个高效且便捷的数据库开发环境,特别适合那些需要在不同环境之间灵活切换...

Global site tag (gtag.js) - Google Analytics