1. 采用 explain plan
如果 PLAN_TABLE 表不存在,执行 $ORACLE_HOME/rdbms/admin/utlxplan.sql 创建 plan_table 表。创建表的过程如下:
打开 cmd
sqlplus /nolog
conn test/test123@test
将 $ORACLE_HOME/rdbms/admin/utlxplan.sql 的内容粘贴到 cmd ,然后回车执行。
第一步: explain plan for select * from ......
第二步: select * from table(DBMS_XPLAN.Display)
如:
SQL> explain plan for select * from student;
Explained.
SQL> select * from table(DBMS_XPLAN.Display);
也可以查找 SQL 的 ID 后再看执行计划
select sql_id,address,hash_value, executions, sql_text from v$sql where sql_text like '%select id from student%';
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('sql_id', 0, 'ADVANCED'));
DBMS_XPLAN是用来展现执行计划的, 通过display函数我们可以展示explain plan方法获得的执行计划,通过display_cursor函数可以展示动态性能视图(v$sql_plan和v$sql_plan_statistics等)中获得的执行计划。explain plan只是一个评估的执行计划,并不是真正SQL执行的路径,而动态性能视图是SQL执行过程中的执行路径,所以说,更准确一些。
2. 使用 oracle 第三方工具
a. plsql developer
写好SQL 后,按F5
b.Toad
写好SQL 后,按Ctrl+E
3. 使用 Autotrace
Set timing on -- 记录所用时间
Set autot trace -- 自动记录执行计划
关于Autotrace 几个常用选项的说明:
SET AUTOTRACE OFF ---------------- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN ------ AUTOTRACE 只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON ----------------- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY ------ 同set autotrace on ,但是不显示查询
例:
SQL> SET AUTOTRACE ON
SQL> select id from student;
4. sql trace
a.alter session set sql_trace=true;
b. 执行 sql
c.alter session set sql_trace=false;
d. 利用 TKPROF 工具格式化输出的 trace 文件。
命令为:Tkprof 文件路径 d:1.txt
注: tkprof 直接在 cmd 下就可以输入
任何一条 SQL ,都包含三个步骤
分析 (Parse):SQL 的分析阶段
执行 (Execute):SQL 的执行阶段
数据提取 (Fetch): 数据提取阶段 ( 数据提取不一定一次就可以完成 )
COUNT: 计数器,表示当前的操作被执行了多少次。
CPU: 当前的操作消耗 CPU 的时间(单位秒)
ELAPSED: 当前的操作一共用时多少。
DISK: 当前操作的物理读(磁盘 I/O 次数);
QUERY: 当前操作的一致性读方式读取的数据快数(通常是查询时使用)
CURRENT: 当前操作的 CURRENT 方式读取的数据块数(通常是修改时使用)
ROWS: 当前操作处理的数据记录数
CR :一致性度 PR :物理读, PW: 物理写, TIME 就不用解释了吧单位是 us( 微秒 )
5. 诊断事件 (10046)
alter session set events '10046 trace name context forever ,level 12' ;
select * from student;
alter session set events '10046 trace name context off' ;
tkprof 文件路径 d:5.txt
6. 10053 事件
启用 10053 事件
ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';
关闭 10053 事件:
ALTER SESSION SET EVENTS '10053 trace name context off';
如:
ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';
select * from student;
ALTER SESSION SET EVENTS '10053 trace name context off';
注意:
1 、 sqlplus 中打开 autotrace 看到的执行计划实际上是用 explain plan 命令得到的, explain plan 命令不会进行 bind peeking 。应该通过 v$sql_plan 查看 SQL 的真实的执行计划。
2 、 10053 只对 CBO 有效,而且如果一个 sql 语句已经解析过,就不会产生新的 trace 信息。 (
刷新共享池,alter system flush shared_pool)
3 、 10053 事件产生的 trace 文件不能用 tkprof 格式化。
4 、执行计划的查看顺序是:从内到外 从上到下。对于不并列的,靠右的先执行:对于并列的,靠上的先执行。