zoukankan      html  css  js  c++  java
  • Oracle优化AutoTrace输出内容的含义

    SQLPLUS的AutoTrace是分析SQL的执行计划,执行效率的一个非常简单方便的工具,在绝大多数情况下,也是非常有用的工具。利用AutoTrace工具提供的SQL执行计划和执行状态可以为我们优化SQL的时候提供优化的依据,以及优化效果的明显的对比效果。

    在SQLPLUS中输入相关AUTOTRACE命令,输入想要优化的SQL语句,即可得到SQL的执行计划和执行状态信息。

    SQL> set timing on //开启时间显示
    SQL> set autot traceonly //仅显示trace结果,不显示SQL执行结果
    SQL> select * from ac01 where aac001=’9990000111′;

    已用时间: 00: 00: 00.62

    Execution Plan
    ———————————————————-
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 TABLE ACCESS (BY INDEX ROWID) OF ‘AC01′
    2 1 INDEX (UNIQUE SCAN) OF ‘PK_AC01′ (UNIQUE)
    Statistics
    ———————————————————-
    0 recursive calls
    0 db block gets
    3 consistent gets
    2 physical reads
    0 redo size
    1875 bytes sent via SQL*Net to client
    424 bytes received via SQL*Net from client
    2 SQL*Net roundtrips to/from client
    0 sorts (memory)
    0 sorts (disk)
    1 rows processed
    用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
    举例:
    SET AUTOT[RACE] OFF 停止AutoTrace
    SET AUTOT[RACE] ON 开启AutoTrace,显示AUTOTRACE信息和SQL执行结果
    SET AUTOT[RACE] TRACEONLY 开启AutoTrace,仅显示AUTOTRACE信息
    SET AUTOT[RACE] ON EXPLAIN 开启AutoTrace,仅显示AUTOTRACE的EXPLAIN信息
    SET AUTOT[RACE] ON STATISTICS开启AutoTrace,仅显示AUTOTRACE的STATISTICS信息

    三. 执行计划的分析
    Execution Plan
    ———————————————————-
    0 SELECT STATEMENT Optimizer=CHOOSE
    1 0 TABLE ACCESS (BY INDEX ROWID) OF ‘AC01′
    2 1 INDEX (UNIQUE SCAN) OF ‘PK_AC01′ (UNIQUE)
    ———————————————————-

    这个就是SQL select * from ac01 where aac001=’9990000111′;执行计划。
    执行的过程为:
    1) INDEX (UNIQUE SCAN) OF ‘PK_AC01′ (UNIQUE)
    2) TABLE ACCESS (BY INDEX ROWID) OF ‘AC01′
    执行计划是一个树状结构,计划的执行是从叶结点开始,直到根结点。所以不同的层上,越底层的越先被执行(第一列数字中较大的);不同层上,越左边的越先被执行(第二列数字中较小的)。
    通过分析这个实行计划可以知道以下几点:
    a) 这是一条SELECT语句
    b) 数据库系统现在使用的优化器模式为CHOOSE
    c) 执行的时候先通过AC01表上的唯一索引PK_AC01查找到相应记录的ROWID,然后通过索引的ROWID直接访问AC01表,找到相应的记录。
    这是一条比较简单的SQL,所以执行计划也相对来说比较简单,没有涉及到过多的连接和索引等。

    四. 执行状态的分析
    Statistics
    ———————————————————-
    0 recursive calls
    0 db block gets
    3 consistent gets
    2 physical reads
    0 redo size
    1875 bytes sent via SQL*Net to client
    424 bytes received via SQL*Net from client
    2 SQL*Net roundtrips to/from client
    0 sorts (memory)
    0 sorts (disk)
    1 rows processed

    这些数据就是这条SQL语句的执行状态。下面分别说一下各个数据项的含义:
    (1)recursive calls
    递归调用——执行SQL的时候的产生的递归调用的数量,这个参数和访问数据字典的次数有很大的关系。一般来说,这个参数值不会很大。
    (2)db block gets
    DB块取——在发生INSERT,DELETE,UPDATE,SELECT FOR UPDATE的时候,数据库缓冲区中的数据库块的个数。在SELECT语句中一般为0。
    (3)consistent gets
    一致性读——除了SELECT FOR UPDATE的时候,从数据库缓冲区中读取的数据块的个数
    (4)physical reads
    物理读——执行SQL的过程中,从硬盘上读取的数据快个数
    (5)redo size
    重做数——执行SQL的过程中,产生的重做日志的大小
    (6)bytes set via sql*net to client
    通过sql*net发送给客户端的字节数
    (7)bytes received via sql*net from client
    通过sql*net接受客户端的字节数
    (8)sql*net roundtrips to/from client
    (9)sorts(memory)
    在内存中发生的排序
    (10)sorts(disk)
    不能在内存中发生的排序,需要硬盘来协助
    (11)rows processed
    结果的记录数

    五. 用AutoTrace进行优化的注意事项
    1. 可以通过设置timing来得到执行SQL所用的时间,但不能仅把这个时间来当作SQL执行效率的唯一量度。这个时间会包括进行AUTOTRACE的一些时间消耗,所以这个时间并不仅仅是SQL执行的时间。这个时间会与SQL执行时间有一定的误差,而在SQL比较简单的时候尤为明显。
    2. 判断SQL效率高低应该通过执行SQL执行状态里面的逻辑读的数量
    逻辑读 =(db block gets+ consistent gets)
    六. 总结
    AutoTrace是ORACLE中优化工具中最基本的工具,虽然功能比较有限,但足以满足我们日常工作的需要。

  • 相关阅读:
    Win10删除anaconda重装
    anaconda python no module named 'past'的解决方法
    detectMultiScale 读取冲突的一个解决方法
    [原] Android快速开发框架-AndroidFine,GitHub开源
    [原] Android 自定义View 密码框 例子
    [原]发布一个jQuery提示框插件,Github开源附主站,jquery.tooltips.js
    [原] Jenkins Android 自动打包配置
    [原] Android性能优化方法
    阿里云9折推荐码:0LGVW2
    [原]那些年整理的Linux常用命令,简单明了
  • 原文地址:https://www.cnblogs.com/hyl8218/p/2723396.html
Copyright © 2011-2022 走看看