Oracle性能优化读书笔记(1)-SQL执行计划分析工具

主要的SQL执行计划分析工具
1.explain
首先建立explain分析表
@?/rdbms/admin/utlxexplan.sql;
分析执行计划
explain plan for select * from z01_amount;
最后查看SQL执行计划
@?/rdbms/admin/utlxplp.sql;

好处:老掉牙可是在封闭环境没有其余开发工具时简单好用
也能够直接引用10g的新特性,输入查询。其中
dbms_xplan.display() 显示v$sql_plan视图中的语句执行计划
dbms_xplan.display_awr() 显示保存在AWR报表中的语句执行计划
select plan_table_output from table(dbms_xplan.display());


2.配套使用sqlTrace和tkprof
与上面explain的差别:不是针对sql语句级别,而是session甚至instance级别的诊断

会话级跟踪
SQL_TRACE的一般使用方式是仅跟踪一个会话。被跟踪的会话能够是您本身的,也能够是其它用户的会话。若是是本身的会话,只须要在SQL*PLUS中运行一下命令便可:
       SQL> alter session set sql_trace = true;
      相似的若是取消对会话的跟踪,运行一下命令:
       SQL> alter session set sql_trace = false;
若是须要跟踪一个特定的会话,首先须要获取会话的SID和Serial#,这些信息能够在视图V$SESSION中得到,一旦知道了这两个参数,就能够运行一下命令:
      SQL> execute SYS.dbms_system.set_sql_trace_in_session(13,9,true);

跟踪文件的位置:
     一旦为会话激活了SQL_TRACE,ORACLE就会在udump管理区建立跟踪文件,文件的目标位置由参数user_dump_dest来肯定。每一个操做都不会覆盖原来的文件,新的跟踪记录将会被追加到文件末尾。一般状况下,能够根据文件的修改时间判断目录下哪一个文件是最新的文件。
   SQL> show parameter user_dump_dest;


计时信息:
    为了最大限度的利用跟踪文件,应该打开计时标志,经过参数TIMED_STATISTICTS=TRUE进行设置,这样能够对每一个SQL语句的执行时间等进行记录,这个功能对系统性能的负担很小。
    打开会话的计时信息:
    SQL> alter session set timed_statistics = true ;
    打开数据库系统的计时信息
    SQL> alter system set timed_statistics = true;

在Oracle 10g中,SQL_TRACE生成的trace文件默认路劲是$ORACLE_BASE/admin/SID/udump.
在Oracle 11g,trace 默认路径在:$ORACLE_BASE/diag/rdbms/orcl/orcl/trace目录下.

Tkprof 命令
Tkprof 命令是 Oracle 客户端的一个可执行文件,好比 在 11.5.10 安装完后,在
prodora\8.0.6\BIN 目录下 有个 TKPROF80.EXE .
TKPROF 的命令行格式是:
Tkprof tricefile outputfile [Sys=] [Explain=] [Sort=] [Table=] [Print=] [Insert=]
说明:
filename1    指定的输入文件,能够是多个文件联起来。
Filename2    格式化输出文件。
SORT       在输出到输出文件前,先进程排序。若是省去,则按照实际使用的顺序输出到文件中。
PRINT          只列出输出文件的第一个 integer  SQL 语句。默认为全部的 SQL 语句。
AGGREGATE      若是 = NO  ,则不对多个相同的 SQL 进行汇总。
INSERT        SQL  语句的一种,用于将跟踪文件的统计信息存储到 数据库 中。在 TKPROF 建立脚本后,在将结果输入到数据库中。
SYS           禁止或启用   SYS 用户所发布的 SQL 语句列表到输出文件中。
TABLE         在输出到输出文件前,用于存放临时表的用户名和表名。
EXPLAIN       对每条 SQL  语句肯定其执行规划。并将执行规划写到输出文件中。

其中比较有用的一个排序选项是 fchela ,即按照 elapsed time fetching 来对分析的结果排序(记住要设置初始化参数 timed_statistics=true ),生成的文件将把最消耗时间的 sql 放在最前面显示。另一个有用的参数就是 sys ,这个参数设置为 no 能够阻止全部以 sys 用户执行的 sql 被显示出来,这样能够减小分析出来的文件的复杂度,便于查看



找到咱们执行的sql语句的trace

对上图 Tkprof 命令输出的解释:
首先解释输出文件中列的含义:
CALL :每次 SQL 语句的处理都分红三个部分
Parse :这步将 SQL 语句转换成执行计划,包括检查是否有正确的受权和所须要用到的表、列以及其余引用到的对象是否存在。
Execute 这步是真正的由 Oracle 来执行语句。对于 insert update delete 操做,这步会修改数据,对于 select 操做,这步就只是肯定选择的记录。
Fetch 返回查询语句中所得到的记录,这步只有 select 语句会被执行。
COUNT: 这个语句被 parse execute fetch 的次数。
CPU 这个语句对于全部的 parse execute fetch 所消耗的 cpu 的时间, 以秒为单位。
ELAPSED 这个语句全部消耗在 parse execute fetch 总的时间。
DISK 从磁盘上的数据文件中物理读取的块的数量。通常来讲更想知道的是正在从缓存中读取的数据而不是从磁盘上读取的数据。
QUERY 在一致性读模式下,全部 parse execute fetch 所得到的 buffer 的数量。一致性模式的 buffer 是用于给一个长时间运行的事务提供一个一致性读的快照,缓存实际上在头部存储了状态。
CURRENT current 模式下所得到的 buffer 的数量。通常在 current 模式下执行 insert update delete 操做都会获取 buffer 。在 current 模式下若是在高速缓存区发现有新的缓存足够给当前的事务使用,则这些 buffer 都会被读入了缓存区中。
ROWS:   全部 SQL 语句返回的记录数目,可是不包括子查询中返回的记录数目。对于 select 语句,返回记录是在 fetch 这步,对于 insert update delete 操做,返回记录则是在 execute 这步。

3.使用autotrace工具
SQL>set autotrace on
SQL>set timing on

若是只想看到执行计划&统计信息,不想看到sql查询结果
SQL>set autotrace traceonly
若是只想看到执行计划,不想看到其余
SQL>set autotrace traceonly explain
若是只想看到统计信息,不想看到其余
SQL>set autotrace statistics

统计信息中重点看 consistent gets 和 physical reads 指标,他们分别表明内存消耗和磁盘I/O消耗