DM HUGE表简介及应用示例

1.列存储和HUGE表

DM数据库中表的数据存储方式既支持行存储,也支持列存储,可满足不同应用场景。行存储是以记录为单位进行存 储的,数据页面中存储的是完整的若干条记录;列存储是以列为单位进行存储的,每一个列 的所有行数据都存储在一起,而且一个指定的页面中存储的都是某一个列的连续数据。 下图为两种存储方式的对比,左为行存储,右为列存储:
在这里插入图片描述
行存储(左)和列存储对比图
Huge File System是达梦数据库实现的,针对海量数据进行分析的一种高效、简单的列存储机制。列存储表(也称为 HUGE 表)就是建立在 HFS 存储机制上的 一种表。
HUGE表建立在HTS(HUGE TABLESPACE,即HUGE表空间)上,其相关信息存储在动态视图V$HUGE_TABLESPACE 中。 这个表空间与普通的表空间不同,通过 HFS 存储机制来管理,相当于一个文件系统。在创建一个HUGE表并插入数据时,数据库会在指定的HTS表空间目录下创建一系列的目录及文件。HFS文件系统结构如下图所示:
在这里插入图片描述
对于一个文件,其内部存储是按照区来管理的,区是文件内部数据管理的最小单位,也是唯一的单位。一个区中,可以存储单列数据的行数是在创建表时指定的,一经指定,在这个表的生命过程就不能再修改。所以,对于定长数据,一个区的大小是固定的;而对于变长 数据,一般情况下区大小都是不相同的。每一个区的开始位置及长度在文件内都是4K对齐的。

2.非事务型HUGE表

DM支持两种类型的HUGE表:非事务型HUGE表和事务型HUGE表。非事务型HUGE表的增、删、改是直接对HUGE表进行写操作的,不写UNDO日志,不通过 BUFFER 缓存,直接操纵文件,速度快,但也因此导致不支持事务,非事务型HUGE表中的ROWID是不固定的。
当非事务型HUGE表在操作过程中出现系统崩溃或者断电等问题时,因为修改时采取的是直接写策略,所以有可能会出现数据不一致的问题。为了保证数据的一致性,在操作时可以适当地做一些日志来保证数据的完整性,完整性保证策略主要是通过数据的镜像来实现的,镜像的不同程度可以实现不同程度的完整性恢复。镜像文件是放在表目录中的以.mir 为扩展名的文件。镜像分为三种类型,分别是:LOG NONE:不做镜像;LOG LAST:做部分镜像;LOG ALL:全部做镜像。
对于每个HUGE 表,相应地配备一个AUX辅助表来管理其数据。因为在 HUGE 表文件中只存储了数据,辅助表用来管理以及辅助系统用户操作这些数据,AUX 辅助表是在创建 HUGE 表时系统自动创建的,表名为“表名 A U X ” , 如 果 该 H U G E 表 为 分 区 表 , 则 辅 助 表 名 为 “ 子 表 名 AUX”,如果该 HUGE 表为分区表,则辅助表名为“子表名 AUXHUGEAUX”。

3.事务型HUGE表

事务型HUGE表,通过增加RAUX、DAUX和UAUX 行辅助表,减少了事务型HUGE表增、删、改操作的IO,提高效率,同时提高并行性能。事务型HUGE表支持UNDO日志,实现了事务特性。RAUX行辅助表中内容对应于HUGE表中的最后一部分记录(不够存满一个数据区的)。RAUX表与HUGE表结构相同,不论数据在那个表中,每一行数据ROWID固定不变。DAUX 行辅助表记录 HUGE 表数据文件中被删除的数据,表名为“HUGE 表名 D A U X ” 。 如 果 该 H U G E 表 为 分 区 表 , 则 辅 助 表 名 为 “ 子 表 名 DAUX”。如果该HUGE表为分区表,则辅助表名为“子表名 DAUXHUGEDAUX”。UAUX行辅助表记录HUGE表被更新的数据的新值,表名为“HUGE 表名 U A U X ” 。 如 果 该 H U G E 表 为 分 区 表 , 则 辅 助 表 名 为 “ 子 表 名 UAUX”。如果该HUGE表为分区表,则辅助表名为“子表名 UAUXHUGEUAUX”。

4.HUGE表创建示例

创建一个HUGE表需要有CREATE TABLE数据库权限,要想在其他用户的模式中创建新表需要有CREATE ANY TABLE 数据库权限。如果不使用默认的表空间,则要先创建一个 HUGE TABLESPACE(HTS)。
创建 HTS语法如下:
CREATE HUGE TABLESPACE <表空间名> PATH <表空间路径>

SQL> create huge tablespace my_test path '/dm8/data/DAMENG/my_hts';

操作已执行
已用时间: 488.990(毫秒). 执行号:42.
在这里插入图片描述
在创建HUGE表时,根据 WITH|WITHOUT DELTA 区分创建非事务型 HUGE 表还是事务型HUGE表。指定WITH DELTA,创建事务型HUGE表;指定WITHOUT DELTA,则创建非事务型HUGE表,缺省为WITHOUT DELTA。
创建事务型HUGE表T2。

SQL> CREATE HUGE TABLE T2 (A INT, B INT) STORAGE(WITH DELTA, ON "MY_TEST");

在这里插入图片描述
创建HUGE表test,指定区的大小为2048,其它默认。

SQL> CREATE HUGE TABLE test(name VARCHAR, sno INT) STORAGE(SECTION (2048), ON "MY_TEST"); 

在这里插入图片描述
创建 HUGE表test2,通过列存储属性指定统计信息属性(不记录区统计信息)。

SQL> CREATE HUGE TABLE test2(name VARCHAR STORAGE (STAT NONE), sno INT)STORAGE(ON "MY_TEST");

在这里插入图片描述
创建 HUGE表test3,通过表存储属性指定统计信息属性(不记录区统计信息)。

SQL> CREATE HUGE TABLE test3(name VARCHAR, sno INT) STORAGE (STAT NONE, ON "MY_TEST");

在这里插入图片描述
创建 HUGE 表时还可以指定单个文件的大小,通过表的存储属性来指定,取值范围为 16M~1024*1024M。不指定则默认为64M。文件大小必须是2的多少次方,如果不是则向上对齐。

SQL> CREATE HUGE TABLE test4(name VARCHAR, sno INT) STORAGE (filesize(64),ON MY_TEST);

在这里插入图片描述
创建HUGE表test5,指定sno列按照最大压缩比压缩。

SQL> CREATE HUGE TABLE test5(name VARCHAR, sno INT) STORAGE (filesize(64),ON MY_TEST) COMPRESS LEVEL 1 (sno); 

在这里插入图片描述
综合的创建HUGE表的例子:

SQL> 
CREATE HUGE TABLE orders  
( o_orderkey        INT,    
o_custkey             INT,   
o_orderstatus          CHAR(1),    
o_totalprice          FLOAT,   
o_orderdate           DATE,   
o_orderpriority       CHAR(15),   
o_clerk              CHAR(15),   
o_shippriority       INT,   
o_comment        VARCHAR(79) STORAGE(stat none)
)  STORAGE(section(65536), filesize(64), with delta, on MY_TEST) COMPRESS LEVEL 9 FOR 'QUERY HIGH'  (o_comment);  

在这里插入图片描述
上例中创建了一个名为 ORDERS 的事务型 HUGE 表,ORDERS 表的区大小为 65536 行,文件大小为64M,指定所在的表空间为MY_TEST,o_comment列指定的区大小为不 做统计信息,其它列(默认)都做统计信息,指定列o_comment列压缩类型为查询高压缩率,压缩级别为9。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值