如何识别低效的执行计划,关注执行计划中的真实返回值与产生逻辑的的比例。一般而言,每获取一行,开销5个以下的逻辑读是属于基本比较满意的。
关键字:
BUFERS/A-ROWS (statistics_level方法)
consistent gets/rows processed (autotrace 方法)
测试环境
SQL> drop table t purge;
SQL> CREATE TABLE t as select * from dba_objects;
案例1
用statitics_level=all获取执行计划的方式,发现获取1条记录(A-ROWS),却产生1048次逻辑读(Buffers)。
SQL> alter session set statistics_level=all;
SQL> set linesize 1000
SQL> set pagesize 200
SQL> select * from t where object_id=6;
SQL> SELECT * FROM SQL> table(dbms_xplan.display_cursor(NULL,NULL,'allstats last'));
要获取一条记录,产生了1048次逻辑读(Buffers),非常多啊。
案例2
改用autotrace 获取执行计划,发现获取1条记录(1 rows processed),竟产生1048次逻辑读(1048 consistent gets)。
SQL> set autotrace traceonly
SQL> select * from t where object_id=6;
总共获取1条记录(1 rows processed),产生1048次逻辑读(1048 consistent gets)。
案例3
增加索引后,发现获取1条记录(1 rows processed),产生4次逻辑读(4 consistent gets),比较满意。
SQL> CREATE INDEX idx ON t (object_id);
SQL> set autotrace traceonly
SQL> select * from t where object_id=6;
添加索引后,一条记录,4条逻辑读,正常比率。