利用AUTOTRACE查看执行计划
注意:AUTOTRACE 所查询的执行计划并不是真实的执行计划,是CBO预估的。从PLAN_TABLE出来的
SQL> set autot
用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
方括号内的字母都可以省略。
set autot on ----执行SQL 并且显示执行计划和统计信息
set autot trace ----执行SQL 但不显示运行结果,显示执行计划和统计信息(一般都用这个)
set autot trace exp ----如果SELECT 就不执行SQL(dml 执行),只显示执行计划
set autot trace stat ----执行SQL,只显示统计信息
AUTOTRACE最主要就是用来查看统计信息,也就是我们最关心的逻辑读和物理读,【递归( recursive calls),sql里面有自定义函数】
还有最终返回的行数
例子如下:
SQL> set autot trace
SQL> select count(*) from test;
执行计划
----------------------------------------------------------
Plan hash value: 1950795681
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 31 | 290 (1)| 00:00:04 |
| 1 | SORT AGGREGATE | | 1 | 31 | | |
| 2 | TABLE ACCESS FULL| TEST | 72543 | 2196K| 290 (1)| 00:00:04 |
---------------------------------------------------------------------------
统计信息
----------------------------------------------------------
0 recursive calls
0 db block gets
1038 consistent gets
0 physical reads
0 redo size
432 bytes sent via SQL*Net to client
420 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
1 rows processed
利用AUTOTRACE查看执行计划我们最关心的就是 consistent gets 以及physical reads部分。有时候一个SQL跑很久,利用AUTOTRACE去查看执行计划不现实,因为要等很久啊。
你愿意等吗?所以这个时候要利用DBMS_XPLAN包来查看执行计划。对OLAP环境进行SQL优化的时候,一般用DBMS_XPLAN,因为OLAP的SQL一般都跑很长。
set autot trace 真正执行了SQL,但是执行计划是从PLAN_TABLE出来的,PLAN_TABLE是假的执行计划
recursive calls : 硬解析或自定义函数 (1、执行次数为多次,递归不为0的 为自定义函数 v$sql 的执行次数和V$SQL_PLAN的递归次数)
db block gets: 变化的物理块(DML或延迟块) select一般没有、
consistent gets 逻辑读 块为单位 (309*8K) 逻辑读包含物理读
physica read 物理读
redo size 运行这个SQL产生多少read, redo size大于0,DB BLOCL GETS必大于0
bytes sent via sql*net to client 发送多少数据到客户端
sort 不用看
rows processed SQL返回多少行