• 达梦管理分区表和分区索引


    1. 为了提高数据在大数据量读写操作和查询时的效率,DM提供了对表和索引进行分区的技术。把表和索引等数据库对象中的数据分割成小的单位,分别存放在一个个单独的段中,用户对表的访问转化为对较小段的访问,以改善大型应用系统的性能。
    2. DM提供了水平分区方式和垂直分区方式(开发版好像不支持垂直分区表,语法:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY COLUMN(“A” AS P1,”B” AS P2);)。水平分区包括范围、哈希和列表三种方式。
    3. 分区是指将表、索引等数据库对象划分为较小的可管理片段的技术,每一个片段称为分区子表或分区索引。一个表被分区后,对表的查询操作可以局限于某个分区进行分区,而不是整个表,这个可以大大提高查询速度。
    4. DM采用子表方式创建分区表,分区表作为分区主表,而每一个分区以一个子表实体存在,即每一个分区都是一个完整的表,一般命名为主表名_分区名。对于水平分区,子表跟主表具有相同的逻辑结构,即分区子表与分区主表有相同的列定义和约束定义。在DM分区表中,分区主表本身不存储数据,所有数据只存储在子表中,从而实现不同分区的完全独立性。水平分区子表删除后,会将子表上的数据一起删除。
    5. 由于每一个分区都以一个子表作为实体,那么不同分区可以存储在相同表空间,也可以位于不同的表空间中。也可以设置自己单独的存储属性。
    6. DM还支持多级分区表,可以将列表、哈希、范围三种分区方式进行任意组合,将表进行多次分区。
    7. 水平分区表的ROWID与其主表属性一致:LIST表(堆表)的水平分区表的ROWID是物理的;普通表的水平分区表的ROWID是逻辑的,且每个子表的ROWID都是从1开始增长,但是最终返回前,ROWID的高字节会补充上子表序号。
    8. 范围分区是按照某个列或某几个列的值的范围来创建分区,当用户向表中写入数据时,数据库服务器将按照这些列上的值进行判断,将数据写入相应的分区中。在创建范围分区时,首先要指定分区列,即按照哪些列进行分区,然后为每个分区指定数据范围。范围分区支持MAXVALUE范围值的使用,MAXVALUE相当于一个比任何都大的值。值得注意的是,MAXVALUE之间无法比较大小。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY RANGE(A)(PARTITION P1 VALUES LESS THAN (10),PARTITION P2 VALUES EQU OR LESS THAN (MAXVALUE));
    9. 创建范围分区,需要注意的是,LIST分区的分区键必须唯一。示例:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY LIST(B)(PARTITION P1 VALUES (‘HAHA’),PARTITION P2 VALUES (DEFAULT));  //这里的DEFAULT指的是除以上取值外的其它任意值。
    10. 在很多情况下,用户无法预测某个列上的数据变化范围,因而无法实现创建固定数量的范围分区或LIST分区。在这种情况下,DM哈希分区提供了一种在指定数量的分区中均等的划分数据的方法,基于分区键的散列值将行映射到分区中。当用户向表中写入数据时,数据服务器将根据一个哈希函数对数据进行计算,把数据均匀的分布在各个分区中。在哈希分区中,用户无法预测数据将被写入哪个分区。示例:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY HASH(B)(PARTITION P1,PARTITION P2);或者:CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY HASH(B) PARTITIONS 2;
    11. 在很多情况下,经过一次分区并不能精确地对数据进行分类,这时需要多级分区。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY RANGE(A)SUBPARTITION BY LIST(B) SUBPARTITION TEMPLATE( SUBPARTITION P1 VALUES (‘HAHA’), SUBPARTITION P2 VALUES (DEFAULT))(PARTITION P11 VALUES LESS THAN (10) (SUBPARTITION P11_1 VALUES (‘HAHA’), SUBPARTITION P11_2 VALUES (‘HEHE’), SUBPARTITION P11_3 VALUES (DEFAULT)),PARTITION P22 VALUES EQU OR LESS THAN(MAXVALUE));
    12. DM支持最多八层多级分区。
    13. 当执行SELECT命令时,可以指定查询某个分区上的数据,如:SELECT * FROM TEST PARTITION(P1);
    14. DM支持对水平分区表建立普通索引、唯一索引、聚集索引和函数索引。创建索引时若未指定GLOBAL关键字则建立的索引是局部索引,即每一个表分区都有一个索引分区,并且只索引该分区上的数据。若指定了GLOBAL关键字,则建立的索引是全局索引,即每个表分区的数据都被索引在同一个B树中。目前,只有堆表的水平分区表支持GLOBAL全局索引。堆表上的primary key会自动变为全局索引。如:CREATE INDEX IDX ON TEST(A) GLOBAL; (TEST为堆分区表)
    15. 对于非全局索引而言,建立分区索引后,每一个分区子表都会建立一个分区索引,负责索引分区子表的数据。由于每个索引分区只负责索引本分区上的数据,其它分区上的数据无法维护,因此当对水平分区表建立非全局唯一索引时,只能建立分区键索引,即分区键必须全都包含在索引键中。只有当分区键都包含在索引键中,才能对分区主表保证索引键唯一。全局唯一索引不受此约束。另外,不能在水平分区表上建立局部唯一函数索引。
    16. DM提供了对水平分区表的修改,功能包括:增加分区(只能对范围分区和LIST分区增加分区)、删除分区(只能对范围分区和LIST分区进行删除分区)、合并分区(只能在范围分区上进行合并分区)、拆分分区(只能在范围分区上进行拆分分区)、交换分区(普通表必须和分区表同构,拥有相同的列和索引,不支持含有加密列的分区表交换分区)。
    17. 增加分区:DM支持用ALTER TABLE ADD PARTITION语句将新增分区增加到最后一个现存分区的后面。对于范围分区,增加分区必须在最后一个分区范围值的后面增加,要想在表的开始范围或中间范围增加,应使用SPLIT PARTITION语句。当已经存在MAXVALUE分区时,不允许增加分区。如:ALTER TABLE TEST ADD PARTITION P3 VALUES LESS THAN (30);;对于LIST分区,增加分区包含的离散值不能已存在与某个分区中,当已经存在DEFAULT分区时,不允许增加分区。如:ALTER TABLE TEST ADD PARTITION P3 VALUES (‘HEHE’); 只能对范围分区和LIST分区增加分区,不能对哈希分区增加分区,并且增加分区不会影响分区索引,因为分区索引只是局部索引,新增分区仅仅是新增分区子表,并更新分区主表的分区信息,其它分区并不发生改变。
    18. 删除分区:DM支持用ALTER TABLE DROP PARTITION语句将分区删除。如:ALTER TABLE TEST DROP PARTITION P3; 只能对范围分区和LIST分区进行删除分区,哈希分区不支持删除分区。跟增加分区一样,删除分区不会影响分区索引。
    19. 交换分区:ALTER TABLE EXCHANGE PARTITION WITH TABLE;仅范围分区和LIST分区支持交换分区,哈希分区不支持。并且分区交换要求分区表跟交换表具有相同的结构(相同的表类型、相同的BRANCH选项、相同的列结构、相同的索引、相同的分布方式),分区交换并不会校验数据,如交换表的数据是否符合分区范围等,即不能保证分区交换后的分区上的数据符合分区范围。交换分区采用数据字典信息交换的技术,几乎不涉及IO操作,因此效率非常高。进行交换的两张表,若包含加密列,对应的加密列要求加密信息完全一致(前面不是说不支持含有加密列的分区表进行分区交换吗?试了,报错交换对象不匹配)如:ALTER TABLE TEST EXCHANGE PARTITION P1 WITH TABLE TEST_A;
    20. 合并分区:要想将两个范围分区的内容合并到一个分区,就要使用ALTER TABLE MERGE PARTITIONS语句。若分区的数据很少,或相对其他分区某些分区的数据量较少,导致IO不均衡,可以考虑使用合并分区。如:ALTER TABLE TAB_NAME MERGE PARTITIONS P1,P2 INTO PARTITION P3; 仅范围分区支持合并分区,并且合并的分区必须是范围相邻的两分区。另外,合并的分区会导致数据的重组和分区索引的重建,因此合并分区可能会比较耗时,所需时间取决于分区数据量的大小。
    21. 拆分分区:ALTER TABLE TAB_NAME SPLIT PARTITION P3 AT () INTO (PARTITION P3_1,PARTITION P3_2); 用于将一分区中的内容重新划分成两个新的分区,当一个分区变得太大以至于要用很长时间才能完成备份、恢复或维护操作时,就应考虑做分割分区的工作,还可以用SPLIT PARTITION子句来重新划分IO负载。仅范围分区表支持拆分分区,拆分分区会导致数据的重组和分区索引的重建,因此拆分分区可能会比较耗时,所需时间取决于分区数据量的大小。
    22. 间隔分区表:仅支持一级范围分区创建间隔分区,且只能有一个分区列,分区列类型为日期或数值。示例:CREATE TABLE TEST(A INT,B VARCHAR) PARTITION BY (A) INTERVAL (10)(PARTITION P1 VALUES LESS THAN(10)); //使用INTERVAL之后,就不用手工增加分区,来适应数据的增长。
    23. DM水平分区表有如下限制:分区列类型必须是数值型、字符型或日期型;范围分区和哈希分区的分区键可以多个,最多不超过16个,LIST分区的分区键必须唯一;水平分区表指定主键和唯一约束时,分区键都必须包含在主键和唯一约束中;水平分区表不支持临时表;不能在水平分区表上建立自引用约束;普通环境中,水平分区表的各级分区的总和上限是65535,MPP环境下,水平分区表的各级分区总数上限取决于INI参数MAX_EP_SITES,上限为2^(16-log2MAX_EP_SITES);不允许对分区子表执行任何DDL操作;哈希分区支持重命名(ALTER TABLE TEST RENAME PARTITION P1 TO P3;)、删除约束、设置触发器是否启用的操作;范围分区支持分区合并、拆分、增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;LIST分区支持分区增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;LIST分区范围值不能为NULL;LIST分区子表范围值个数与数据页大小和相关系统表列长度相关,4K页,单个子表最多支持120个范围值,8K页,单个子表最多支持254个范围值,16/32K页,单个子表最多支持270个范围值;对范围分区增加分区值必须是递增的,即只能在最后一个分区后添加分区,LIST分区增加分区值不能存在于其它已存在分区;当分区数仅剩一个时,不允许删除分区;仅能对相邻的范围分区进行合并,合并后的分区名可以为高分区名或新分区名;拆分分区的分区值必须在原分区范围中,并且分区名不能跟已有分区名相同;与分区进行分区交换的普通表,必须与分区表拥有相同的列及索引,但交换分区并不会对数据进行校验,即交换后的数据并不能保证数据完整性,如CHECK约束,分区表与普通表创建的索引顺序要求一致;水平分区表仅支持建立局部索引,不支持建立全局索引,即在分区表上建立索引,每一个表分区都有一个索引分区,并且只索引该分区上的数据,而分区主表上的索引并不索引数据;不能对水平分区表建立唯一函数索引和全文索引;不能对分区子表单独建立索引;在未指定ENABLE ROW MOVEMENT的分区表上(CREATE TABLE TEST (A INT,B VARCHAR) PARTITION BY RANGE(A) (PARTITION P1 VALUES LESS THAN(10),PATITION P2 VALUES EQU OR LESS THAN (MAXVALUE)) ENABLE ROW MOVEMENT;)执行更新分区键,不允许更新后数据发生跨分区的移动,即不能有行迁移(这里的更新分区键指的是UPDATE);不能在分区语句的STORAGE子句中指定BRANCH选项;不允许引用水平分区子表作为外键约束;多级分区最多支持八层;多级分区表支持以下修改操作:新增分区、新增列、删除列、删除表级约束、修改表名、设置与删除列的默认值、设置列NULL属性、设置列可见性、设置行迁移属性、启用超长记录、with delta(没用过,不知道啥意思,sql手册里有介绍,该选择专门针对huge表)、新增子分区、删除子分区、修改二级分区模板信息;水平分区表支持的列修改操作除了多级分区表支持的操作外,还支持:设置触发器生效/失效、修改列名、修改列属性、增加表级约束、删除分区、SPLIT/MERGE分区和交换分区;水平分区表中包含大字段、自定义字段列、则定义时指定ENABLE ROW MOVEMENT参数无效,即不允许更新后数据发生跨分区的移动;
    24. 间隔分区表的限制说明:仅支持一级范围分区创建间隔分区;只能有一个分区列,且分区列类型为日期或数值;对间隔分区进行SPLIT,只能在间隔分区范围内进行操作;被SPLIT/MERGE的分区,其左侧分区不再自动进行创建;不相邻的间隔的分区,不能MERGE;表定义不能包含MAXVALUE分区;不允许新增分区;不能删除起始间隔分区;间隔分区表定义语句显示到起始间隔分区为止;自动生成的间隔分区,均不包含边界值;间隔表达式只能为常量或日期间隔函数,日期间隔函数为NUMTOYMINTERVAL、NUMTODSINTERVAL,数值常量可以为整性、DEC
  • 相关阅读:
    JMeter结构体系及运行原理
    maven pom配置文件样本
    django踩坑
    spring踩坑
    蓝牙连上电脑没声音
    XML 解析 & 特殊字符报错
    IDEA下maven工程的classpath
    mysql踩坑
    工作日记-9 远程接口调用注意点
    工作日记-8 ajax缓存
  • 原文地址:https://www.cnblogs.com/adamgq/p/13693764.html
Copyright © 2020-2023  润新知