HUGE表就是列式存储表,存储在特定的HUGE表空间中。普通的表空间,数据是通过段、簇、页来管理的,并且以固定大小(4K、8K、16K、32K)的页面为管理单位;而HUGE 表空间是通过HFS 存储机制来管理的,它相当于一个文件系统。创建一个HUGE 表并插入数据时,数据库会在指定的HTS 表空间目录下创建一系列的目录及文件。
下图展示了相同的表数据在行存储表与列存储表中的不同存储方式。
行存储图 列存储图
HUGE表的存储方式有以下几个优点:
①同一个列的数据都是连续存储的,可以加快某一个列的数据查询速度;
②连续存储的列数据,具有更大的压缩单元和数据相似性,可以获得远优于行存储的压缩效率,压缩的单位是区;
③条件扫描借助数据区的统计信息进行精确过滤,可以进一步减少IO,提高扫描效率;
④允许建立二级索引;
⑤支持以 ALTERTABLE 的方式添加或者删除PK 和UNIQUE 约束。
HUGE表分类
非事务型 HUGE 表
非事务型HUGE 表的增、删、改是直接对HUGE 表进行写操作,不写UNDO 日志,直接操纵文件,速度快,并发性能不高,但也因此导致不支持事务。当非事务型HUGE 表在操作过程中出现系统崩溃或者断电等问题时,因为修改时采取的是直接写的策略,所以有可能会出现数据不一致的问题。
事务型HUGE 表
事务型HUGE 表,通过增加RAUX、DAUX和UAUX 行辅助表,减少了事务型HUGE 表增、删、改操作的IO,提高效率,同时提高并行性能。事务型HUGE 表支持UNDO 日志,实现了事务特性。
HUGE表创建
创建事务型的HUGE表,数据库默认会创建
HUGE表指定普通表空间存储报错
HUGE表未指定HUGE表空间,默认是HMAIN表空间。
需要注意的是,当指定创建事务型HUGE表时,指定HUGE表镜像文件方案的选项LOGNONE|LOG LAST|LOG ALL失效。
创建非事务型的HUGE表
需要将参数HUGE_WITH_DELTA修改为0,否则不支持创建非事务型HUGE表。
成功创建HUGE表后会生成一个目录,目录名为SCH+长度为9 的ID 号组成的字符串。
查询HUGE表
查询单列时,数据库性能有明显的提升。
使用HUGE表时应注意存在以下一些限制
1.建HUGE表时仅支持定义NULL、NOTNULL、UNIQUE约束以及PRIMARYKEY,后两种约束也可以通过ALTERTABLE的方式添加,但这两种约束不检查唯一性;
2.HUGE不允许建立聚簇索引,允许建立二级索引,不支持建位图索引,其中UNIQUE索引不检查唯一性;
3.不支持SPACELIMIT(空间限制);
4.不支持建立全文索引;
5.不支持使用自定义类型;
6.不支持引用约束;
7.不支持IDENTITY自增列;
8.不支持大字段列;
9.不支持建触发器;
10.不支持游标的修改操作;
11.PK和UNIQUE约束不检查唯一性,对应的索引都为虚索引;UNIQUE索引也不检查唯一性,为实索引,索引标记中不包含唯一性标记,即和普通二级索引相同;
12.不允许对分区子表设置SECTION和WITH/WITHOUTDELTA;
13.当事务型HUGE表进行了较多增删改操作时,应对其进行数据重整操作,以提高性能。