使用IOT表

IOT的物理存储结构

首先,要理解IOT表的物理存储模式。以下面这个表为例

CREATE TABLE SMSG_LOGS_ARCH_zxm_iot
   (  
   created_date timestamp (6) default sysdate,
   station_id varchar2(20),
    log_id number
,
    src_id varchar2(22),
   src_terminal_id varchar2(22),
   dest_id varchar2(22), 
   dest_terminal_id varchar2(22),
   command_id number,
   MSG_ID NUMBER,
    SERVICE_ID VARCHAR2(10),
   TP_PID NUMBER,
 TP_UDHI NUMBER,
 MSG_FMT NUMBER,
 REGISTERED_DELIVERY NUMBER,
 MSG_LENGTH NUMBER,
 MSG_CONTENT VARCHAR2(300),
 STAT VARCHAR2(7),
 SUBMIT_TIME VARCHAR2(10),
 DONE_TIME VARCHAR2(10),
 SMSC_SEQUENCE NUMBER,
 PK_TOTAL NUMBER,
 PK_NUMBER NUMBER,
 MSG_LEVEL NUMBER,
 FEE_USERTYPE NUMBER,
 FEE_TERMINAL_ID VARCHAR2(22),
 FEETYPE NUMBER,
 FEECODE VARCHAR2(6),
 VALID_TIME VARCHAR2(10),
 AT_TIME VARCHAR2(10),
 DESTUSR_TL NUMBER,
 SITE_ID VARCHAR2(22),
 NODE_ID VARCHAR2(22),
 UP_MSG_ID NUMBER,
 SENT_MSG_ID NUMBER,
   MSG_SRC VARCHAR2(1000),
 constraint smsg_logs_arch_pk primary key (created_date,station_id,log_id)
 ) 
  organization index
  tablespace sale_stage
  including  command_id
  overflow tablespace sale_stage

   只需要关注其中的红字部分。这个表创建成功后,接下来看这个表的物理存储。通过下面视图的查询来发现存储结构。

1、创建的对象仍然是按照指定名称命名,但是这个对象的DATA_OBJECT_ID是空,也就是这个对象并不是一个真正的物理对象。

select object_name,object_type,object_id,data_object_id  from user_objects

OBJECT_NAME                     OBJECT_TYPE          OBJECT_ID DATA_OBJECT_ID
------------------------- --------------------------------------------------------------------------------- ---------- --------------
 SYS_IOT_OVER_59513            TABLE                      59514          59514
SMSG_LOGS_ARCH_ZXM_IOT TABLE                      59513                    
 SMSG_LOGS_ARCH_PK            INDEX                      59515          59515

2、看这个表在user_tables中的定义,用到了iot_type和IOT_NAME两列

select table_name,iot_name,iot_type  from user_tables

TABLE_NAME                               IOT_NAME                                        IOT_TYPE   
------------------------------------------------------------------------------------------------------------------------------------
SYS_IOT_OVER_59513                SMSG_LOGS_ARCH_ZXM_IOT      IOT_OVERFLOW
SMSG_LOGS_ARCH_ZXM_IOT                                                             IOT

3、如果察看user_segments视图,就无法看到表名对应的Segment。而只能看到如下两条记录,这才是IOT表最终的Segment。

select segment_name,segment_type from user_segments

SEGMENT_NAME           SEGMENT_TYPE
------------------------------           ----------------------------
SMSG_LOGS_ARCH_PK   INDEX
SYS_IOT_OVER_59513    TABLE

4、INDEX段的信息,我们可以从约束中找到
select constraint_name,constraint_type,index_name from user_constraints

CONSTRAINT_NAME                   CONSTRAINT_TYPE                        INDEX_NAME     
-----------------------------------------------------------------------------------------------------------------------------------------   
SMSG_LOGS_ARCH_PK                P                                            SMSG_LOGS_ARCH_PK

INDEX_NAME                         INDEX_TYPE            TABLE_NAME                          
------------------------------------------------------------------------------------------------------------------------------------
A_PK                                       NORMAL                    A                                              
SMSG_LOGS_ARCH_PK       IOT - TOP                  SMSG_LOGS_ARCH_ZXM_IOT

因此
   Oracle会用两个段来实现一个IOT表,第一个段其实是一个 Index Segment,用来支持IOT的主键,这个段的名称是根据PK名称命名的。而另一个段由于支持Overflow部分,这个段的名称是由系统自动命名的。

   而create table语句指定的表的名称已经变成了一个桥梁,又来连接着两个表。

   利用下面语句,就可以同时获得这两个Segment。

select table_name   segment_name,'overflow' type
from user_tables
where iot_name='SMSG_LOGS_ARCH_ZXM_IOT'
union all
select index_name,'index' type from user_indexes
where index_type='IOT - TOP'
    and table_name='SMSG_LOGS_ARCH_ZXM_IOT'

SEGMENT_NAME                TYPE   
-----------------------------------------------
SYS_IOT_OVER_59513     overflow
SMSG_LOGS_ARCH_PK    index   

比较IOT和堆表的性能

首先,创建两个结构相同的表,分别是IOT和堆表,然后用SQLLDR比较数据加载的速度。

CREATE TABLE SMSG_LOGS_ARCH_zxm
   (  
   created_date timestamp (6) default sysdate,
    station_id varchar2(20),
    log_id number not null enable,
    src_id varchar2(22),
   src_terminal_id varchar2(22),
 dest_id varchar2(22), 
   dest_terminal_id varchar2(22),
   command_id number,
   MSG_ID NUMBER,
    SERVICE_ID VARCHAR2(10),
   TP_PID NUMBER,
 TP_UDHI NUMBER,
 MSG_FMT NUMBER,
 REGISTERED_DELIVERY NUMBER,
 MSG_LENGTH NUMBER,
 MSG_CONTENT VARCHAR2(300),
 STAT VARCHAR2(7),
 SUBMIT_TIME VARCHAR2(10),
 DONE_TIME VARCHAR2(10),
 SMSC_SEQUENCE NUMBER,
 PK_TOTAL NUMBER,
 PK_NUMBER NUMBER,
 MSG_LEVEL NUMBER,
 FEE_USERTYPE NUMBER,
 FEE_TERMINAL_ID VARCHAR2(22),
 FEETYPE NUMBER,
 FEECODE VARCHAR2(6),
 VALID_TIME VARCHAR2(10),
 AT_TIME VARCHAR2(10),
 DESTUSR_TL NUMBER,
 SITE_ID VARCHAR2(22),
 NODE_ID VARCHAR2(22),
 UP_MSG_ID NUMBER,
 SENT_MSG_ID NUMBER,
   MSG_SRC VARCHAR2(1000),
 constraint smsg_logs_arch_pk primary key (created_date,station_id,log_id)
 ) 
  organization index
  tablespace warehouse
  including  command_id
  overflow tablespace warehouse

  PARTITION BY RANGE (CREATED_DATE)
  SUBPARTITION BY LIST (STATION_ID)
  SUBPARTITION TEMPLATE (
    SUBPARTITION GUANGXI values ( 'GUANGXI' ),
    SUBPARTITION SHAN3XI values ( 'SHAN3XI' ),
    SUBPARTITION FUZHOU values ( 'FUZHOU' ),
    SUBPARTITION HANGZHOU values ( 'HANGZHOU' ),
    SUBPARTITION GUANGZHOU values ( 'GUANGZHOU' ),
    SUBPARTITION HEBEI values ( 'HEBEI' ),
    SUBPARTITION SHAN1XI values ( 'SHAN1XI' ),
    SUBPARTITION BEIJING values ( 'BEIJING' ),
    SUBPARTITION LIAONING values ( 'LIAONING' ),
    SUBPARTITION JILIN values ( 'JILIN' ),
    SUBPARTITION JIANGXI values ( 'JIANGXI' ),
    SUBPARTITION JIANGSU values ( 'JIANGSU' ),
    SUBPARTITION SICHUAN values ( 'SICHUAN' ),
    SUBPARTITION SHANGHAI values ( 'SHANGHAI' ),
    SUBPARTITION YUNNAN values ( 'YUNNAN' ),
    SUBPARTITION HENAN values ( 'HENAN' ),
    SUBPARTITION SHANDONG values ( 'SHANDONG' ) )
 (PARTITION P20091113  VALUES LESS THAN  to_date('2009-11-14 00:00:00','yyyy-mm-dd hh24:mi:ss')
 , PARTITION P20091114 VALUES LESS THAN to_date('2009-11-15 00:00:00','yyyy-mm-dd hh24:mi:ss')
 

第一个脚本遇到这个错误,也就是说IOT表不支持复合分区表结构。
 --ORA-25198
 00000, "only range, list, and hash partitioning are supported for index-organized table"
// *Cause:  System, or Composite partitioning schemes are not supported yet
// *Action: Select a different partitioning scheme

修改这个脚本

考虑:
分区是按照时间进行分区;
列的顺序或者说including 中列的顺序,是

按照 src_id varchar2(22),
   src_terminal_id varchar2(22),
  dest_id varchar2(22), 
   dest_terminal_id varchar2(22),
最后 是station_id为好呢,还是应该把station_id放在前面?

等测试下再说吧

CREATE TABLE SMSG_LOGS_ARCH_zxm
   (  src_id varchar2(22) default '999999999999999',
     dest_id varchar2(22) default '999999999999999', 
     created_date timestamp (6) default sysdate,
     station_id varchar2(20),
     log_id number ,
     command_id number,
     src_terminal_id varchar2(20),
     dest_terminal_id varchar2(20),
  ... ....
  constraint smsg_logs_arch_pk_2 primary key 
  (src_id,dest_id,created_date,station_id,log_id)
  ) 
  organization index
  tablespace warehouse
  including  command_id
  overflow tablespace warehouse
  PARTITION BY RANGE (CREATED_DATE)
 (PARTITION P20091116  VALUES LESS THAN  (to_date('2009-11-16 00:00:00','yyyy-mm-dd hh24:mi:ss') )
 , PARTITION P20091117 VALUES LESS THAN (to_date('2009-11-17 00:00:00','yyyy-mm-dd hh24:mi:ss') )
  , PARTITION P20091118 VALUES LESS THAN (to_date('2009-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss') )
 )

加载性能

Total logical records skipped:          0
Total logical records read:      14489771
Total logical records rejected:         1
Total logical records discarded:        0

Run began on Wed Nov 18 11:55:41 2009
Run ended on Wed Nov 18 12:28:41 2009

Elapsed time was:     00:33:00.47
CPU time was:         00:05:10.96

               

结构相同的堆表,带有索引

drop table smsg_logs_arch_zxm_heap;

CREATE TABLE SMSG_LOGS_ARCH_zxm_heap
   (  src_id varchar2(22) default '999999999999999',
     dest_id varchar2(22) default '999999999999999', 
    created_date timestamp (6) default sysdate,
    station_id varchar2(20),
     log_id number ,
   command_id number,
   src_terminal_id varchar2(20),
   dest_terminal_id varchar2(20),
  ......,
  constraint smsg_logs_arch_pk_3 primary key (src_id,dest_id,created_date,station_id,log_id)
  ) 
  PARTITION BY RANGE (CREATED_DATE)
 (PARTITION P20091116  VALUES LESS THAN  (to_date('2009-11-16 00:00:00','yyyy-mm-dd hh24:mi:ss') )
 , PARTITION P20091117 VALUES LESS THAN (to_date('2009-11-17 00:00:00','yyyy-mm-dd hh24:mi:ss') )
  , PARTITION P20091118 VALUES LESS THAN (to_date('2009-11-18 00:00:00','yyyy-mm-dd hh24:mi:ss') )
 )


Total logical records skipped:          0
Total logical records read:      14489771
Total logical records rejected:         1
Total logical records discarded:        0

Run began on Wed Nov 18 12:32:02 2009
Run ended on Wed Nov 18 13:09:45 2009

Elapsed time was:     00:37:42.80
CPU time was:         00:05:08.68

load data                                             
infile '/backup/station_exp/hisdata/guangzhou/guangzhou_smsg_logs.exp' "str x'232323230A'"         
append into table smsg_logs_arch_zxm                           
FIELDS TERMINATED BY "," ENCLOSED BY '"'                   
(                                                  
LOG_ID INTEGER EXTERNAL ,                             
MSG_ID INTEGER EXTERNAL,                             
COMMAND_ID INTEGER EXTERNAL,                         
DEST_ID char   "9999999999999999",                                        
SERVICE_ID char,                                     
TP_PID INTEGER EXTERNAL,                             
TP_UDHI INTEGER EXTERNAL,                            
MSG_FMT INTEGER EXTERNAL,                            
SRC_TERMINAL_ID char,                                
REGISTERED_DELIVERY INTEGER EXTERNAL,                
MSG_LENGTH INTEGER EXTERNAL,                         
MSG_CONTENT char,                                    
STAT char,                                           
SUBMIT_TIME char,                                    
DONE_TIME char,                                      
DEST_TERMINAL_ID char,                              
SMSC_SEQUENCE INTEGER EXTERNAL,                      
PK_TOTAL INTEGER EXTERNAL,                           
PK_NUMBER INTEGER EXTERNAL,                         
MSG_LEVEL INTEGER EXTERNAL,                          
FEE_USERTYPE INTEGER EXTERNAL,                       
FEE_TERMINAL_ID char,                                
MSG_SRC char,                                        
FEETYPE INTEGER EXTERNAL,                            
FEECODE char,                                        
VALID_TIME char,                                     
AT_TIME char,                                        
SRC_ID char   "9999999999999999",                                         
DESTUSR_TL INTEGER EXTERNAL,                         
SITE_ID char,                                        
NODE_ID char,                                        
CREATED_DATE date "yyyy-mm-dd hh24:mi:ss",           
UP_MSG_ID INTEGER EXTERNAL,                          
STATION_ID char                                      
)
      

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

转载于:http://blog.itpub.net/75321/viewspace-619600/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值