回表

  • 什么是回表 

  • 怎么避免回表

什么是回表?
          简单来说就是数据库根据索引找到了指定的记录所在行后,还需要根据rowid再次到数据块里取数据的操作;

    示例:基本表结构与索引情况如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
create  table  MOB_ANALYZE_NAME
(
       PHONETYPE VARCHAR2(100),
       TYPENAME  VARCHAR2(500)
;
--这时候还没有索引 访问数据块为 是全表扫描 效率肯定不行
select  a.phonetype  from  mob_analyze_name a  where  a.phonetype =  'zg_20090611_00057' ;
--加入索引
create  index  IDX_MOB_ANALYZE_NAME_ID  on  MOB_ANALYZE_NAME (PHONETYPE);
--该语句不会回表 从索引块里就可取出全部数据 
select  a.phonetype  from  mob_analyze_name a  where  a.phonetype =  'zg_20090611_00057' ;
--该语句取得数据行rowid后 将会根据rowid回表查询出typename,因为有两行,就回表多查了2个数据块
--此处遗留一个问题是 一行数据是否有可能放到两个数据块里,那是不是可能会出现本来查询一行数据 就多访问两个数据块
select  a.typename  from  mob_analyze_name a  where  a.phonetype =  'zg_20090611_00057' ;//2行
怎么避免回表?
          如果只是简单的查询name id 这种情况 可以考虑创建组合索引 要根据实际情况考虑创建索引的成本!
1
2
drop  index  IDX_MOB_ANALYZE_NAME_ID ;
create  index  IDX_MOB_ANALYZE_NAME_ID_NAME  on  MOB_ANALYZE_NAME (PHONETYPE, TYPENAME);



你可能感兴趣的:(Oracle,Turning)