------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 702 | 32292 | 122 (1)| 00:00:02 |
|* 1 | INDEX FASTFULL SCAN| SYS_IOT_TOP_84235 | 702 | 32292 | 122 (1)| 00:00:02 |
------------------------------------------------------------------------------------------
)
我们查找的字段并不是主键,然而还是走索引了,只是走的是全索引扫描。
explain plan for
select * from HEAP_TABLE t
where t.object_id=30
select * from table(dbms_xplan.display())
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 44 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID|HEAP_TABLE | 1 | 44 | 2 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | SYS_C0016433 | 1 | | 1 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
对比而言,我们看到组织索引表在查找某些数据(根据主键),没有出现TABLE ACCESS BY INDEX ROWID, 因此提高了查询效率。
从以上分析可以看出,索引组织表有些象普通表与单独索引组成的配置,只不过 没有维护两个单独的存储结构,数据库仅维护一个单独的 B-tree 索引。因此, 每一个索引项包含了
使用索引组织表的好处。
索引组织表通过主键或可以成为主键合法前缀的任何键提供了对表数据的 更快访问,在 B-tree 叶块中出现的非键字段避免了额外的数据块访问。同时, 由于数据行是按照主键的顺序进行存储的,对主键或合法前缀的范围扫描只涉及 到最小数据块的访问。
我们看到组织索引表示一个全新类型的表,在查询时候,我们发现由于没有TABLE ACCESS BY INDEX ROWID ,从而提高了查询的性能。oracle数据库不会提供一个全方面全天候的优化技术。了解组织索引表以及适合应用场所,就显得很有必要。
组织索引表的基本存储
我们删除一部分数据,然后再插入这部分数据,观察数据存储
HEIGHT
2
2
2
BLOCKS
512
512
512
NAME
SYS_IOT_TOP_71372
SYS_IOT_TOP_71372
SYS_IOT_TOP_71372
PARTITION_NAME
LF_ROWS
68261
68261
68261
LF_BLKS
417
417
417
LF_ROWS_LEN
3271826
3271826
3271826
LF_BLK_LEN
8000
8000
8000
BR_ROWS
416
416
416
BR_BLKS
1
1
1
BR_ROWS_LEN
4517
4517
4517
BR_BLK_LEN
8032
8032
8032
DEL_LF_ROWS
0
34110
0
DEL_LF_ROWS_LEN
0
1643446
0
DISTINCT_KEYS
68261
68261
68261
MOST_REPEATED_KEY
1
1
1
BTREE_SPACE
3344032
3344032
3344032
USED_SPACE
3276343
3276343
3276343
PCT_USED
98
98
98
ROWS_PER_KEY
1
1
1
BLKS_GETS_PER_ACCESS
3
3
3
PRE_ROWS
0
0
0
PRE_ROWS_LEN
0
0
0
OPT_CMPR_COUNT
0
0
0
OPT_CMPR_PCTSAVE
0
0
0
1、我们隔行删除一半数据记录
delete from ORG_INDEX_TABLE where mod(object_id,2) = 1;
analyze index SYS_IOT_TOP_84235 validate structure;
select * fromindex_stats
alter table ORG_INDEX_TABLE move online;
analyze index SYS_IOT_TOP_84235 validate structure;
select *from index_stats
HEIGHT
2
2
2
BLOCKS
512
512
256
NAME
SYS_IOT_T…
SYS_IOT…
SYS_IOT_...
PARTITION_NAME
LF_ROWS
70231
70231
35124
LF_BLKS
440
440
233
LF_ROWS_LEN
3350295
3350295
1667079
LF_BLK_LEN
8000
8000
8000
BR_ROWS
439
439
232
BR_BLKS
1
1
1
BR_ROWS_LEN
4757
4757
2521
BR_BLK_LEN
8032
8032
8032
DEL_LF_ROWS
0
35107
0
DEL_LF_ROWS_LEN
0
1683216
0
DISTINCT_KEYS
70231
70231
35124
MOST_REPEATED_KEY
1
1
1
BTREE_SPACE
3528032
3528032
1872032
USED_SPACE
3355052
3