[20151008]索引组织表上创建BITMAP索引.txt

简介: [20151008]索引组织表上创建BITMAP索引.txt --IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表。

[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应该不变。
--以此作为前面的补充。

目录
相关文章
|
SQL 数据采集 运维
实时数仓入门训练营:实时数仓助力互联网实时决策和精准营销
《实时数仓入门训练营》由阿里云研究员王峰、阿里云高级产品专家刘一鸣等实时计算Flink版和 Hologres 的多名技术/产品一线专家齐上阵,合力搭建此次训练营的课程体系,精心打磨课程内容,直击当下同学们所遇到的痛点问题。由浅入深全方位解析实时数仓的架构、场景、以及实操应用,7 门精品课程帮助你 5 天时间从小白成长为大牛!
实时数仓入门训练营:实时数仓助力互联网实时决策和精准营销
|
机器学习/深度学习 传感器 边缘计算
【无人机路径规划】基于强化学习的多无人机移动边缘计算与路径规划附matlab代码
【无人机路径规划】基于强化学习的多无人机移动边缘计算与路径规划附matlab代码
|
缓存 监控 Java
日志服务接入方式之log producer library
Producer Library解决的问题: 客户端日志不落盘:既数据生产后直接通过网络发往服务端。 客户端高并发写入:例如一秒钟会有百次以上写操作。 客户端计算与IO逻辑分离:打日志不影响计算耗时。
6746 0
|
9月前
uView throttle & debounce节流防抖
uView throttle & debounce节流防抖
167 0
|
IDE Java 测试技术
史上最详细的Maven使用笔记(建议收藏)
Maven 🍅 Java学习路线:搬砖工的Java学习路线 🍅 作者:程序员小王 🍅 程序员小王的博客:https://www.wolai.com/wnaghengjie/ahNwvAUPG2Hb1Sy7Z8waaF 🍅 扫描主页左侧二维码,加我微信 一起学习、一起进步 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 温馨提示:如果需要详细的线下笔记,PDF文件方便保存,可以关注公众号“程序员小王”回复“maven”领取PDF版本笔记
516 0
史上最详细的Maven使用笔记(建议收藏)
Dialog和软键盘的冲突
一、冲突描述 为了说明问题,我先随意在我之前的项目写个dialog做个测试。 先写一个dialog,自定义的,宽高为填充屏幕,里面是两个edittext。
2129 0
|
SQL OLAP 数据库连接
AnalyticDB错误码文档
#Analytic DB错误码 - DDL, ACL相关 | 范围 | 说明 | | :-- | :-- | |18000 ~ 18599| DDL CREATE语句用户错误| |18600 ~ 18799| DDL ALTER语句用户错误| |18800 ~ 18899| DDL DROP语句用户错误| |18900 ~ 18999| ACL操作相关用户错误| |19000 ~
8552 0
|
Oracle 关系型数据库 数据库
配置ACL报ORA-24247的解决方法
配置ACL报ORA-24247的解决方法 前言: 在通过ORACLE11往外部发送邮件的时候,ORA-24247的错误,详细的错误错误信息如下: ERROR at line 1: ORA-24247: network access denied by access control list (ACL) ORA-06512: at "SYS.
1213 0
|
9月前
|
存储 API 开发工具
【ZYNQ】SD 卡读写及文件扫描实验
【ZYNQ】SD 卡读写及文件扫描实验
409 0

热门文章

最新文章