达梦管理列存储表

达梦管理列存储表,全部参照官方文档。

  1. DM数据库中,表的数据存储方式分为行存储和列存储。行存储是以记录为单位进行存储的,数据页面中存储的是完整的若干条记录;列存储是以列为单位进行存储的,每一个列的所有行数据都存储在一起,而且一个指定的页面中存储的都是某一个列的连续数据。
  2. Huge File System(简称HFS)是DM数据库实现的,针对海量数据进行分析的一种高效、简单的列存储机制,列存储表(也称为HUGE表)就是建立在HFS存储机制上的一种表。
  3. HUGE表是建立在自己特有的表空间HTS(HUGE TABLESPACE)上的,最多可创建32767个HUGE表空间,其相关信息存储在动态视图V$HUGE_TABLESPACE中。这个表空间与普通的表空间不同。普通的表空间,数据是通过段、簇、页来管理的,并且以固定的大小(4K、8K、16K、32K)的页面为管理单位;而HUGE表空间是通过HFS存储机制来管理的,它相当于一个文件系统。创建一个HTS,其实就是创建一个空的文件目录(系统中有一个默认的HTS,目录名为HMAIN)。在创建一个HUGE表并插入数据时,数据库会在指定的HTS表空间目录下创建一系列的目录及文件。首先在HTS目录下创建这个表对应的模式目录,目录名为“SCH+长度为9的ID号”组成的字符串,创建时若这个目录已经存在,则无需重新创建;其次,在模式目录下创建对应的表目录,目录名为“TAB+长度为4的ID号”,表目录中存放的是这个表中的所有文件;再次,在新创建表后插入数据时,每一个列对应一个以dta为后缀的文件,文件大小可以在建表时指定,默认为64M,文件名为“COL+长度为4的列号+_+长度为10的文件号”。
  4. 对于一个文件,其内部存储是按照区来管理的,区是文件内部数据管理的最小单位,也是唯一的单位。一个区中,可以存储单列数据的行数是在创建表时指定的,一经指定,在这个表的生命过程中就不能再修改。所以,对于定长数据,一个区的大小是固定的;而对于变长数据,一般情况下区大小都是不同的。每一个区的开始位置及长度在文件内都是4K对齐的。
  5. HUGE表的存储方式有以下几个优点:同一个列的数据都是连续存储的,可以加快某一个列的数据查询速度;连续存储的列数据,具有更大的压缩单元和数据相似性,可以获得远优于行存储的压缩效率,压缩的单位是区;条件扫描借助数据区的统计信息进行精确过滤,可以进一步减少IO,提高扫描效率;允许建立二级索引;支持以ALTER TABLE的方式添加或删除PK或UNIQUE索引;
  6. DM支持两种类型的HUGE表:非事务型HUGE表和事务型HUGE表。
  7. 对非事务型HUGE表的增删改是直接对HUGE表进行写操作的,不写REDO日志,不通过BUFFER缓存,直接操作文件,速度快(??直接操作文件不就是直接写磁盘吗?不是说写磁盘慢吗?),但也因此导致不支持事务。另外非事务型HUGE表中的ROWID是不固定的。
  8. 当非事务型HUGE表在操作过程中出现系统崩溃或断电等问题时,因为修改时采取的是直接写的策略,所以有可能会出现数据不一致的问题,为了保证数据的一致性,在操作时可以适当地做一些日志来保证数据的完整性,完整性保证策略主要是通过数据的镜像来实现的,镜像的不同程度可以实现不同程度的完整性恢复。镜像文件是放在表目录中的以.mir为扩展名的文件。DM提供三种方案:LOG NONE,不做镜像,相当于不做数据一致性的保证,若出错只能手动通过系统函数(哪些系统函数?)来修复表数据,速度是最快的,不需要额外的IO;LOG LAST(默认),做部分镜像,但是在任何时候都只对当前操作的区做镜像,若当前区的操作完成了,那么这个区的镜像也就失效了,可能会被下一个被操作区覆盖,这样做的好处是镜像文件不会太大,同时也可以保证数据是完整的。但有可能遇到的问题是,一次操作很多的情况下,有可能一部分数据已经完成,另一部分数据还没有来得及做的问题;LOG ALL,全部做镜像,在操作过程中,所有被修改的区都会被记录下来,当一次操作修改的数据过多时,镜像文件有可能会很大,但好处是能够保证操作完整性。如:CREATE HUGE TABLE TEST(A INT,B VARCHAR) LOG ALL;
  9. 对于每个HUGE表,相应的配备一个AUX辅助表来管理其数据,因为在HUGE表文件中只存储了数据,辅助表用来管理以及辅助系统用户操作这些数据,AUX辅助表是在创建HUGE表时系统自动创建的,表名为“表名$AUX”,若该HUGE表为分区表,则辅助表名为“子表名$AUX”。辅助表的表名长度不能超过128个字节。AUX辅助表中每一条记录对应文件中的一个数据区,包括下面15列:COLID(表示当前这条记录对应的区所在的列的列ID号)、SEC_ID(表示当前这个记录对应的区的区ID号,每一个区都有一个ID号,并且唯一)、FILE_ID(表示这个区的数据所在的文件号)、OFFSET(表示这个区的数据在文件中的偏移位置,4K对齐)、COUNT(表示这个区中存储的数据总数,有可能包含被删除的数据)、ACOUNT(表示这个区中存储的实际数据行数)、N_LEN(表示这个区中存储的数据在文件中的长度,4K对齐)、N_NULL(表示这个区中的数据中包括的NULL值的行数)、N_DIST(表示这个区中所有数据互不相同的行数)、CPR_FLAG(表示这个区是否压缩)、ENC_FLAG(表示这个区是否加密)、CHKSUM(用来存储标记位)、MAX_VAL(表示这个区中的最大值,精确值)、MIN_VAL(表示这个区中的最小值,精确值)、SUM_VAL(表示这个区中所有值的和,精确值)。前面7列是用来控制数据存取的,根据这些信息就可以知道这个区的具体存储位置、长度及基本信息;后面8列都是用来对这个区进行统计分析的,其中COLID和SEC_ID的组合键为辅助表的聚集关键字。
  10. 非事务型HUGE表在进行增删改时直接对HUGE表进行写操作,每次写操作需要至少对一个区进行IO,导致IO量较大,且并发性能不高。为此DM推出了事务型HUGE表,通过增加RAUX、DAUX和UAUX行辅助表,减少了事务型HUGE表增删改操作的IO,提高效率,同时提高并行性能,事务型HUGE表支持UNDO日志,实现了事务特性。
  11. RAUX行辅助表存放最后一个数据区(不够存满一个数据区)的数据,表名为“HUGE表名$RAUX”,若该HUGE表为分区表,则辅助表名为“子表名$RAUX”,辅助表的表名长度不能大于128个字节。RAUX表与HUGE表结构相同,不论数据在哪个表中,每一行数据的ROWID固定不变。
  12. DAUX行辅助表记录HUGE表数据文件中被删除的数据,表名为“HUGE表名$DAUX”,若该HUGE表为分区表,则辅助表名为“子表名$DAUX”。辅助表的表名长度不能大于128个字节。
  13. UAUX行辅助表记录HUGE表被更新的数据,表名为“HUGE表名$UAUX”,若该HUGE表为分区表,则辅助表名为“子表名$UAUX”。辅助表的表名长度不能大于128个字节。
  14. 创建一个HUGE表时,若不使用默认的表空间,则必须要先创建一个HUGE TABLESPACE,语法:CREATE HUGE TABLESPACE HTS_NAME PATH <表空间路径>;
  15. 在创建HUGE表时,根据WITH|WITHOUT DELTA区分创建事务型HUGE表还是非事务型HUGE表。指定WITH DELTA,创建事务型HUGE表;指定WITHOUT DELTA,则创建非事务型HUGE表,缺省为WITHOUT DELTA。如:CREATE HUGE TABLE TESTH (A INT,B VARCHAR) STORAGE(WITH DELTA);
  16. 在创建HUGE表时,可以指定表的存储属性,包括如下几个方面:区大小(一个区的数据行数,可以通过设置表的存储属性来指定,区的大小必须是2的多少次方,若不是则向上对齐,取值范围1024~1024*1024,默认为65536)如:CREATE HUGE TABLE TESTH(A INT,B VARCHAR) STORAGE(SECTION(1024));;是否记录区统计信息,即在插入时是否记下其最大值和最小值,关于这一点有一个原则,若这个列经常用作查询条件,且数据不是很均匀,或者基本是有序的,那么做统计信息是非常有用的,反之则可以不做统计,缺省为记录统计信息,若不想记录,可以通过设置STAT NONE实现。这个属性可以设置列级或表级。如:CREATE HUGE TABLE TESTH(A INT,B VARCHAR STORAGE(STAT NONE));或CREATE HUGE TABLE TESTH(A INT,B VARCHAR) STORAGE(STAT NONE);;所属表空间:创建HUGE表,可以通过表级存储属性指定其所在的表空间,不指定则默认存储于HMAIN中,如:CRAETE HUGE TABLE TESTH(A INT,B VARCHAR) STORAGE(ON HTS);;文件大小:创建HUGE表时,可以指定单个文件的大小,通过表级存储属性来指定,取值范围为16M~1024*1024M,不指定则默认64M,大小必须为2的N次方,不是则向上对齐,如:CRAETE HUGE TABLE TESTH(A INT,B VARCHAR) STORAGE(FILESIZE(16));;压缩级别:可以为特定列指定压缩级别,取值范围0~10,分别代表不同的算法和级别,由两种压缩级别:SNAPPY和ZIP。10采用SNAPPY算法轻量级方式压缩,2~9采用ZIP算法压缩,2~9代表压缩级别,值越小表示压缩比越低、压缩速率越快;值越大表示压缩比越高、压缩速度越慢。0和1为快捷使用,默认值为0,0等价于LEVEL 2;1等价于LEVEL 9。如:CREATE HUGE TABLE TEST(A INT,B VARCHAR) COMPRESS LEVEL 8;或CREATE HUGE TABLE TEST(A INT,B VARCHAR) COMPRESS LEVEL 9 (A);或CREATE HUGE TABLE TEST(A INT,B VARCHAR) COMPRESS LEVEL 9 FOR ‘QUERY HIGE’ (A);
  17. HUGE表与普通行表一样,可以进行增删改操作,但HUGE表的删除与更新操作的效率会比行表低一些,并发操作性能也会比行表差一些,因此在HUGE中不宜做频繁的删除及更新操作。HUGE表比较适合做分析性表的存储。
  18. HUGE表使用时有如下限制:建HUGE表时仅支持定义NULL、NOT NULL、UNIQUE约束以及PRIMARY KEY,后两种约束也可以通过ALTER TABLE的方式添加,但这两种约束不检查唯一性(?不检查唯一性还叫什么唯一约束?);HUGE不允许建立聚簇索引,允许建立二级索引,不支持建立位图索引,其中UNIQUE索引不检查唯一性;不支持SPACE LIMIT(空间限制);不支持建立全文索引;不支持使用自定义类型;不支持引用约束;不支持IDENTITY自增列;不支持大字段列;不支持建立触发器;不支持游标的修改操作;PK和UNIQUE约束不检查唯一性,对应的索引都为虚索引,UNIQUE索引也不检查唯一性,为实索引,索引标记中不包含唯一性标记,即和普通二级索引相同;不允许对分区子表设置SECTION和WITH/WITHOUT DELTA;当事务型HUGE表进行了较多增删改操作时,应对其进行数据重整操作,以提高性能;
  19. HUGE表不支持INSERT INTO VALUES (),();语法,会报错“不支持的语句类型”?只能一条一条的插入?
  20. 对一个HUGE表,可以通过SP_TABLEDEF(‘SCH_NAME’,’TAB_NAME’);命令获取表定义,也可以通过SELECT TABLEDEF(‘SCH_NAME’,’TAB_NAME’);或DBMS_META.GET_DDL(‘TYPE’,’TAB_NAME’,’SCH_NAME’);获取。
  21. HUGE表有一个很好的特点就是有AUX辅助表,其中用户可以利用的信息很多,因为每一条记录对应一个区,所以可以查看每一个区的存储情况,每一个列的存储情况以及每一个列中具有相同区ID的所有数据的情况等,还包括了很精确的统计信息,用户可以通过观察AUX辅助表中的信息对表进行一些相应的操作。

你可能感兴趣的:(达梦数据库)