ORACLE之索引查询与全表扫描对比实验

2025-11-01 15:19:44

1、构造实验环境

drop table t ;删除现有表,以防影响实际结果

create table t as select * from all_objects; 创建表

create index idx_object_id on t(object_id); 创建索引

set autotrace on 跟踪SQL执行计划和统计信息

set linesize 1000 设置显示的行宽

set timing on 跟踪SQL执行完成时间

ORACLE之索引查询与全表扫描对比实验

2、第一次执行查询语句

select object_name from t where object_id=29;

结果:

CPU COST 152 次递归调用;82 次逻辑读;次物理读

ORACLE之索引查询与全表扫描对比实验

3、第二次执行查询语句

select object_name from t where object_id=29;

结果:

CPU COST 10 次递归调用;2 次逻辑读;0 次物理读

和第一次查询相比,第二次的代价明显小于第一次,这是因为第一次执行的时候已经将用户连接信息和相关权限信息保存到PGA内存;将SQL解析动作存在了SGA共享池;将数据存在SGA的数据缓冲区。因此,第二次不用递归调用和物理读。

ORACLE之索引查询与全表扫描对比实验

4、重新连接后,第一次故意强制走全表扫描的情况

set autotrace on 

set linesize 1000

set timing on 

select /*+full(t)*/ object_name from t where object_id=29;

结果:

CPU COST 1317 次递归调用;648 次逻辑读;0 次物理读

和走索引相比,HASH 值不一样了,CPU COST逻辑读 明显增加

ORACLE之索引查询与全表扫描对比实验

5、第二次故意强制走全表扫描的情况

select /*+full(t)*/ object_name from t where object_id=29;

结果:

CPU COST 1310 次递归调用;572 次逻辑读;0 次物理读

和走索引相比,HASH 值不一样了,CPU COST 和 逻辑读 明显增加

和第一次全表扫描相比,HASH 值一样,递归调用逻辑读 减少

ORACLE之索引查询与全表扫描对比实验

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢