您的位置:首页 > 数据库 > Oracle

【读书笔记】【收获,不止Oracle】索引组织表

2014-07-12 23:13 363 查看
本次试验,用于讨论索引组织表与普通表的区别:

1.创建两个表:heap_addresses(普通表),iot_addresses(索引组织表)

SYS@ orcl>drop table heap_addresses purge;

Table dropped.

SYS@ orcl>drop table iot_addresses purge;

Table dropped.

SYS@ orcl>create table heap_addresses (
2  empno number (10),
3  addr_type varchar2(10),
4  street varchar2(10),
5  city varchar2(10),
6  state varchar2(2),
7  zip number,
8  primary key(empno)
9  )
10  /

Table created.

SYS@ orcl>create table iot_addresses (
2  empno number (10),
3  addr_type varchar2(10),
4  street varchar2(10),
5  city varchar2(10),
6  state varchar2(2),
7  zip number,
8  primary key(empno)
9  )
10  organization index
11  /

Table created.



2.向两个表投入相同的数据

SYS@ orcl>insert into heap_addresses
2  select object_id,'WORK','123street','washington','DC',20123
3  from all_objects;

49896 rows created.

SYS@ orcl>insert into iot_addresses
2  select object_id,'WORK','123street','washington','DC',20123
3  from all_objects;

49896 rows created.

SYS@ orcl>commit;

Commit complete.


3.执行查看计划,首先查看普通表

SYS@ orcl>set linesize 1000
SYS@ orcl>set autotrace traceonly
SYS@ orcl>select * from heap_addresses
2  where empno=22;

Execution Plan
----------------------------------------------------------
Plan hash value: 1273877215

----------------------------------------------------------------------------------------------
| Id  | Operation                   | Name           | Rows  | Bytes | Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |                |     1 |    50 |     1   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| HEAP_ADDRESSES |     1 |    50 |     1   (0)| 00:00:01 |
|*  2 |   INDEX UNIQUE SCAN         | SYS_C006637    |     1 |       |     1   (0)| 00:00:01 |
----------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("EMPNO"=22)

Statistics
----------------------------------------------------------
1  recursive calls
0  db block gets
5  consistent gets
0  physical reads
124  redo size
627  bytes sent via SQL*Net to client
370  bytes received via SQL*Net from client
1  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed
4.接着查看索引组织表

SYS@ orcl>select * from iot_addresses
2  where empno=22;

Execution Plan
----------------------------------------------------------
Plan hash value: 2496347326

---------------------------------------------------------------------------------------
| Id  | Operation         | Name              | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |                   |     1 |    50 |     1   (0)| 00:00:01 |
|*  1 |  INDEX UNIQUE SCAN| SYS_IOT_TOP_54159 |     1 |    50 |     1   (0)| 00:00:01 |
---------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

1 - access("EMPNO"=22)

Statistics
----------------------------------------------------------
1  recursive calls
0  db block gets
4  consistent gets
0  physical reads
124  redo size
719  bytes sent via SQL*Net to client
381  bytes received via SQL*Net from client
2  SQL*Net roundtrips to/from client
0  sorts (memory)
0  sorts (disk)
1  rows processed


总结:

普通表
索引组织表

1.consistent gets(逻辑读) 5 4

由此可见,索引组织表比普通表要产生更少的逻辑读。

2.普通表产生 TABLE ACCESS BY INDEX ROWID 来获取列以外的信息

3.索引组织表特点:表 = 索引 ,索引更新会比普通表开销更大。表和索引一样有序的排列,更新负担会加重。

4.索引组织表一般用于很少更新,频繁读的应用场合。用于数据很少变动,却大量读取的场合。(如地区配置表)

以上代码和观点摘自原书,试验由本人试验,所以与原书略有不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: