zoukankan      html  css  js  c++  java
  • 达梦管理分区表和分区索引

    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
  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/adamgq/p/13693764.html
Copyright © 2011-2022 走看看