[20151008]索引组织表上创建BITMAP索引.txt
[20151008]索引组织表上创建BITMAP索引.txt
--IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表。
--我偏向使用静态以及"只读"的小表。
--以前写过一个系列,一直没有很好理解在IOT表上建立位图索引,最近再研究看看;
--我当时不理解为什么mapping table与iot表对应的块为什么不一致?
1.建立测试环境:
SCOTT@test> @ver1
PORT_STRING VERSION BANNER
------------------------------ -------------- --------------------------------------------------------------------------------
x86_64/Linux 2.4.xx 11.2.0.3.0 Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
create table t_iot ( a varchar2(10),b varchar2(10),vc varchar2(1200),d varchar2(1), constraint t_iot_pk PRIMARY KEY(a)) ORGANIZATION INDEX;
create index i_t_iot_b on t_iot(b);
insert into t_iot values ('1' ,'a','a','1');
insert into t_iot values ('22' ,'b','a','1');
insert into t_iot values ('333' ,'c','a','1');
insert into t_iot values ('4444' ,'d','a','1');
insert into t_iot values ('55555' ,'e','a','1');
insert into t_iot values ('666666' ,'f','a','0');
insert into t_iot values ('7777777' ,'g','a','0');
insert into t_iot values ('88888888' ,'h','a','0');
insert into t_iot values ('999999999','i','a','0');
commit ;
exec dbms_stats.gather_table_stats(ownname=>USER, tabname=>'T_iot');
2.建立位图索引:
SCOTT@test> create bitmap index i_t_iot_d on t_iot(d);
create bitmap index i_t_iot_d on t_iot(d)
*
ERROR at line 1:
ORA-28669: bitmap index can not be created on an IOT with no mapping table
--可以发现要在IOT表上建立位图索引必须要建立mapping table .
SCOTT@test> alter table t_iot move mapping table;
SCOTT@test> SELECT object_name, object_id, data_object_id, object_type, status FROM dba_objects WHERE owner = USER AND object_name IN ('T_IOT', 'T_IOT_PK');
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE STATUS
-------------------- ---------- -------------- ------------------- -------
T_IOT 316905 TABLE VALID
T_IOT_PK 316906 316909 INDEX VALID
SCOTT@test> SELECT object_name, object_id, data_object_id, object_type, status FROM dba_objects WHERE owner = USER AND object_name like '%IOT_MAP%';
OBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE STATUS
-------------------- ---------- -------------- ------------------- -------
SYS_IOT_MAP_316905 316908 316908 TABLE VALID
--可以知道mapping table的命名是SYS_IOT_MAP_<object_id>,OBJECT_TYPE=TABLE;
SCOTT@test> @desc SYS_IOT_MAP_316905
Name Null? Type
---------- -------- ----------------------------
SYS_NC_01 ROWID
--可以发现map table 仅仅有1个字段,类型是rowid。
SCOTT@test> column x format a66
SCOTT@test> column y format a66
SCOTT@test> select dump(rowid,16) y ,dump(sys_nc_01,16) x from SYS_IOT_MAP_316905;
Y X
------------------------------------------------------------------ ------------------------------------------------------------------
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,0 Typ=208 Len=9: 2,4,0,0,0,0,1,31,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,1 Typ=208 Len=10: 2,4,1,0,2,44,2,32,32,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,2 Typ=208 Len=11: 2,4,1,0,2,44,3,33,33,33,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,3 Typ=208 Len=12: 2,4,1,0,2,44,4,34,34,34,34,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,4 Typ=208 Len=13: 2,4,1,0,2,44,5,35,35,35,35,35,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,5 Typ=208 Len=14: 2,4,1,0,2,44,6,36,36,36,36,36,36,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,6 Typ=208 Len=15: 2,4,1,0,2,44,7,37,37,37,37,37,37,37,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,7 Typ=208 Len=16: 2,4,1,0,2,44,8,38,38,38,38,38,38,38,38,fe
Typ=69 Len=10: 0,4,d5,ec,1,0,2,33,0,8 Typ=208 Len=17: 2,4,1,0,2,44,9,39,39,39,39,39,39,39,39,39,fe
9 rows selected.
SCOTT@test> select dump(rowid,16) x,a from t_iot;
X A
------------------------------------------------------------------ ----------
Typ=208 Len=9: 2,4,1,0,2,43,1,31,fe 1
Typ=208 Len=10: 2,4,1,0,2,43,2,32,32,fe 22
Typ=208 Len=11: 2,4,1,0,2,43,3,33,33,33,fe 333
Typ=208 Len=12: 2,4,1,0,2,43,4,34,34,34,34,fe 4444
Typ=208 Len=13: 2,4,1,0,2,43,5,35,35,35,35,35,fe 55555
Typ=208 Len=14: 2,4,1,0,2,43,6,36,36,36,36,36,36,fe 666666
Typ=208 Len=15: 2,4,1,0,2,43,7,37,37,37,37,37,37,37,fe 7777777
Typ=208 Len=16: 2,4,1,0,2,43,8,38,38,38,38,38,38,38,38,fe 88888888
Typ=208 Len=17: 2,4,1,0,2,43,9,39,39,39,39,39,39,39,39,39,fe 999999999
9 rows selected.
--IOT的rowid格式在以前的文章有介绍,参考http://blog.itpub.net/267265/viewspace-719517/
--IOT的rowid是逻辑rowid,其存贮格式如下:
--结合dump(rowid),dump(rowid,16)的转出信息.很容易推导出rowid的信息。以下的例子来说明:
Typ=208 Len=17: 2,4,1,0,2,43,9,39,39,39,39,39,39,39,39,39,fe 999999999
1.开头的2,4,以及结尾fe实在不好猜测,不过好像是固定不变的。
2.中间的1,0,2,43正好对应的就是IOT的根节点,也就是对应数据IOT的数据块。(因为我的数据量很小)
3.9,39,39,39,39,39,39,39,39,39中9表示主键长度,39,39,39,39,39,39,39,39,39就是主键的信息。
--我当时感到奇怪的是map table记录的sys_nc_01信息,第一条是0,0,0,0,剩下的都是1,0,2,44。与当前IOT表看到的逻辑rowid完全不一致。
--当然随着数据的插入,表IOT的记录的逻辑rowid会变化,map table的对应信息应该不会改变(除非主键发生了变化).
SCOTT@test> select sys_nc_01 c30 from SYS_IOT_MAP_316905;
C30
------------------------------
*BAAAAAABMf4
*BAEAAkQCMjL+
*BAEAAkQDMzMz/g
*BAEAAkQENDQ0NP4
*BAEAAkQFNTU1NTX+
*BAEAAkQGNjY2NjY2/g
*BAEAAkQHNzc3Nzc3N/4
*BAEAAkQIODg4ODg4ODj+
*BAEAAkQJOTk5OTk5OTk5/g
9 rows selected.
--实际上映射的信息主要主键对上就ok了,做1个简单的查询例子:
SCOTT@test> select sys_nc_01 c30,'*BAAAABABMf4' c20 from SYS_IOT_MAP_316905 where sys_nc_01='*BAAAABABMf4';
C30 C20
------------------------------ --------------------
*BAAAAAABMf4 *BAAAABABMf4
SCOTT@test> select sys_nc_01 c30,'*BAAFFFABMf4' c20 from SYS_IOT_MAP_316905 where sys_nc_01='*BAAFFFABMf4';
C30 C20
------------------------------ --------------------
*BAAAAAABMf4 *BAAFFFABMf4
--注意从字串看两者是不等的。实际上这种逻辑rowid比较仅仅关心主键部分是否一致。当然开头的2,4,以及结尾fe应该不变。
--以此作为前面的补充。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
欢聚时代笔试题,滴滴出行编程题
感谢赛码网,奇怪的A题设计,bat一轮大企业过去,没A上去几道。 intel 笔试: 1.单链表逆置,双向链表删除 2.层次遍历二叉树 3.rand4()生成rand9() 4.非常多的各种指针操作。 面试:完全的问项目 1.stl boost c++中的智能指针,以及其实现原理? 2.b 树的插入 3.代码实现stack 的排序,只能用stack 的基本操作 乐港面试: 服务器实时排名?(和完美世界一个样子) 为啥下午5点review code 的问题。 // testofrecursive.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" using namespace std; class A { int a; char c; public: void foo(){cout<<"a foo"<<endl;} virtual void fool(){cout<<"a fool"<<endl;} }; class B:public A { int a; cha...
- 下一篇
关于本地分区索引和索引组织表保证唯一性的限制
首先说明索引组织表和本地分区唯一索引有着共同的特点。 1、索引组织表(以下简称IOT)要求主键是必须的因为表的结构会按照主键索引进行构造,如果IOT分区那么,那么可以理解为一个类似的按照某个字段分区的 本地索引,因为索引和表是在一起的,表的分区必然就是索引的分。而这个分区字段必须要是主键的一部分。考虑一个主键(name,time),如果分区键 为TIME,如果范围是10-16 00:00:00到10-17 00:00:00 如果我们能够保证在这个范围内name time的唯一那么在整个主键内必然唯一。如果我们使用其他 字段比如一个额外的ID字段分区,那么要保证主键的name time的唯一性只能全部扫描整个分区,这样分区的剪裁的特性就消耗殆尽了。 2、一样的本地分区索引来保证唯一性也是这样的,他必须包含分区键,这样才能做到在分区内唯一则唯一。 那么我们大概用语言描述一下: 如果IOT表分区 -> 那么分区键必须是主键的一部分 如果本地分区索引唯一 -> 那么其索引字段必须包含分区键 考虑如下几个报错 ORA-14039: partitioning column...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS7设置SWAP分区,小内存服务器的救世主
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- CentOS关闭SELinux安全模块
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境