索引组织表上创建BITMAP索引(一)

Oracle的索引组织表也支持BITMAP索引类型,不过需要映射表的支持。

 

 

如果没有创建映射表,直接建立BITMAP索引,则会报错:

SQL> CREATE TABLE T_INDEX_ORG
  2  (ID NUMBER PRIMARY KEY,
  3  NAME VARCHAR2(30),
  4  TYPE VARCHAR2(30))
  5  ORGANIZATION INDEX;

表已创建。

SQL> CREATE BITMAP INDEX IND_B_ORG_TYPE
  2  ON T_INDEX_ORG (TYPE);
ON T_INDEX_ORG (TYPE)
   *
2 行出现错误:
ORA-28669:
在没有映射表的情况下, 不能在 IOT 上创建位图索引

只有建立了映射表MAPPING TABLE,创建BITMAP索引才能成功:

SQL> CREATE TABLE T_INDEX_ORG
  2  (ID NUMBER PRIMARY KEY,
  3  NAME VARCHAR2(30),
  4  TYPE VARCHAR2(30))
  5  ORGANIZATION INDEX
  6  MAPPING TABLE;

表已创建。

SQL> CREATE BITMAP INDEX IND_B_ORG_TYPE
  2  ON T_INDEX_ORG (TYPE);

索引已创建。

可以看一下这时索引组织表的结构:

SQL> SELECT TABLE_NAME, IOT_NAME, IOT_TYPE
  2  FROM USER_TABLES
  3  WHERE IOT_TYPE IS NOT NULL;

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
SYS_IOT_MAP_32375              T_INDEX_ORG                    IOT_MAPPING
T_INDEX_ORG                                                   IOT

SQL> SELECT INDEX_NAME, INDEX_TYPE, TABLE_NAME, UNIQUENESS
  2  FROM USER_INDEXES
  3  WHERE TABLE_NAME = 'T_INDEX_ORG';

INDEX_NAME           INDEX_TYPE        TABLE_NAME           UNIQUENES
-------------------- ----------------- -------------------- ---------
IND_B_ORG_TYPE       BITMAP            T_INDEX_ORG          NONUNIQUE
SYS_IOT_TOP_32375    IOT - TOP         T_INDEX_ORG          UNIQUE

现在这个索引组织表的结构已经很清晰了,T_INDEX_ORG说是一张表,其实是以索引的结构来报错的,这个索引就是表的主键SYS_IOT_TOP_32375。而IND_B_ORG_TYPE索引是表的第二索引,由于是BITMAP类型,因此要求建立一个MAPPING TABLE。从上面的查询可以看到对应的MAPPING TABLE就是SYS_IOT_MAP_32375

无论是ORACLE创建的主键名称,还是自动生成的MAPPING TABLE名称,在后缀部分都包括了一个32375数值。一般来说这种数值都是取自一个序列,但是两个对象取值相同,说明这个数值是存在一定意义的,怀疑32375是数据库对象的ID

SQL> SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, OBJECT_ID
  2  FROM DBA_OBJECTS
  3  WHERE OBJECT_ID = 32375;

OWNER           OBJECT_NAME          OBJECT_TYPE         OBJECT_ID
--------------- -------------------- ------------------ ----------
YANGTK          T_INDEX_ORG          TABLE                   32375

果然如此,那么现在不但可以根据查询得到一个MAPPING TABLE对应的索引组织表,也可以根据索引组织表的OBJECT_ID以及MAPPING TABLE的命名规则,找到MAPPING TABLE

上面演示的是在创建索引组织表的时候建立对应的MAPPING TABLE,有些时候是需要在一个已经存在的索引组织表上添加映射表的,不过Oracle的官方文档SQL REFERENCES中的语法图这里似乎有点问题。而且Oracle的文字描述似乎也有些问题,Oracle提到可以将一个堆表改变为索引组织表,而测试发现似乎根本行不通,对应的MAPPING TABLE语法也是有问题的。

SQL> DROP TABLE T_INDEX_ORG;

表已删除。

SQL> CREATE TABLE T_INDEX_ORG
  2  (ID NUMBER PRIMARY KEY,
  3  NAME VARCHAR2(30),
  4  TYPE VARCHAR2(30))
  5  ORGANIZATION INDEX;

表已创建。

SQL> ALTER TABLE T_INDEX_ORG MOVE MAPPING TABLE;

表已更改。

SQL> SELECT TABLE_NAME, IOT_NAME, IOT_TYPE
  2  FROM USER_TABLES
  3  WHERE IOT_TYPE IS NOT NULL;

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
SYS_IOT_MAP_32383              T_INDEX_ORG                    IOT_MAPPING
T_INDEX_ORG                                                   IOT

映射表无法直接删除,直接删除会报错:

SQL> DROP TABLE SYS_IOT_MAP_32383;
DROP TABLE SYS_IOT_MAP_32383
           *
1 行出现错误:
ORA-28668:
无法引用按索引组织的表的映射表

可以仍然通过MOVE来删除索引组织表的映射表:

SQL> ALTER TABLE T_INDEX_ORG MOVE NOMAPPING;

表已更改。

SQL> SELECT TABLE_NAME, IOT_NAME, IOT_TYPE
  2  FROM USER_TABLES
  3  WHERE IOT_TYPE IS NOT NULL;

TABLE_NAME                     IOT_NAME                       IOT_TYPE
------------------------------ ------------------------------ ------------
T_INDEX_ORG                                                   IOT

而如果在建立了BITMAP索引的索引组织表上,是无法直接去掉映射表的:

SQL> ALTER TABLE T_INDEX_ORG MOVE MAPPING TABLE;

表已更改。

SQL> CREATE BITMAP INDEX IND_B_INDEX_TYPE
  2  ON T_INDEX_ORG (TYPE);

索引已创建。

SQL> ALTER TABLE T_INDEX_ORG MOVE NOMAPPING;
ALTER TABLE T_INDEX_ORG MOVE NOMAPPING
            *
1 行出现错误:
ORA-28670:
由于某个现有位图索引而导致无法删除映射表

必须先执行删除BITMAP索引的操作,然后才能去掉映射表:

SQL> DROP INDEX IND_B_INDEX_TYPE;

索引已删除。

SQL> ALTER TABLE T_INDEX_ORG MOVE NOMAPPING;

表已更改。

当然,如果索引组织表本身不需要了,也可以直接删除索引组织表。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-670704/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-670704/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值