select * from user_segments where segment_name
组织索引表上的在次索引
SQL>create bitmap index idx_bit_owner onorg_index_table_2(owner);
createbitmap index idx_bit_owner onorg_index_table_2(owner)
ORA-28669:在没有映射表的情况下, 不能在IOT 上创建位图索引
ALTER TABLE org_index_table_2 MOVE MAPPING TABLE
之后就可以建立位图索引了
create index idx_bit_owner onorg_index_table_2(owner)
select count(*) from org_index_table_2 whereowner='SYS'
create table IOT_MAPPING_TEST (name varchar2(32),
nonumber,
constraint PK_IOT_MAPPING_TEST primary key(no)
)
organization index
mapping table;
Table created
SQL>
SQL> select table_name,iot_name,iot_type from user_tables wheretable_name='IOT_MAPPING_TEST';
TABLE_NAME IOT_NAME IOT_TYPE
------------------------------------------------------------ ------------
IOT_MAPPING_TEST IOT
select table_name,iot_name,iot_type from user_tables whereiot_type='IOT_MAPPING';
TABLE_NAME IOT_NAME IOT_TYPE
------------------------------------------------------------ ------------
SYS_IOT_MAP_56839 IOT_MAPPING_TEST IOT_MAPPING
alter table iot_mapping_test shrink space;
Table altered
SQL> alter table SYS_IOT_MAP_56839 shrink space;
alter table SYS_IOT_MAP_56839 shrink space
ORA-28668: cannot reference mapping table of an index-organized table
借助上面的测试,顺便介绍一下如何move IOT MAPPING TABLES。移动IOT MAPPING TABLES的语法是:
ALTER TABLE
下面做个简单的测试
SQL> select segment_name,segment_type,tablespace_name fromuser_segments where segment_name like '%MAP%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------- ------------------ ---------------------
SYS_IOT_MAP_56839 TABLE DATA_01
PK_IOT_MAPPING_TEST INDEX DATA_01
SQL> alter table iot_mapping_test move tablespace users;
Table altered
SQL> select segment_name,segment_type,tablespace_name fromuser_segments where segment_name like '%MAP%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------------- ------------------ -----------------
SYS_IOT_MAP_56839 TABLE DATA_01
PK_IOT_MAPPING_TEST INDEX USERS
可以看到,常规的move操作只是表索引移了。SQL> alter table iot_mapping_test movemapping table tablespace users;
Table altered
SQL> select segment_name,segment_type,tablespace_name fromuser_segments where segment_name like '%MAP%';
SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME
------------------------- ------------------ ---------------------
SYS_IOT_MAP_56839 TABLE USERS
PK_IOT_MAPPING_TEST INDEX USERS
SQL>
OK,到这里mapping table被成功的移动了
据行的内容。这个确定有时会破坏B-tree 索引的dense clustering property。
Oracle 针对以上问题,提出了 OVERFLOW 子句。如果必要,可以设定OVERFLOW 表空间,每个数据行可以被分割为两部分,一部分用于存储索引项, 另一部分保存在overflow 存储区域中,如下所示:
索引项,其中包含了所有主键字段的字段值,还包含了指向overflow 部 分的物理rowid,以及可选的一些非键字段;
overflow 部分,包含了没有保