love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

达梦数据库学习笔记 — 表与分区表

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 达梦数据库学习笔记 — 表与分区表

这里达梦数据库学习系列的第四篇;今天主要来学习一下达梦数据库中的表相关知识。

从表结构来看,似乎跟Oracle 普通表差别很大,主要在于stroage 字句中有一个clusterbtr关键字。 这说明是一个普通表。关于创建的表

是普通表还是堆表,通过list_Table参数来进行控制,默认参数是0,表示普通表。这里我修改成1,即堆表。

我们再来创建一个测试表看看情况:

获取对象定义,还可以使用达梦提供的包来进行:

我们可以看到,对于堆表而言,这里storage 子句中是NOBRANCH关键字。 通过查询达梦官方手册发现,堆表的情况下,有如下几种情况:

BRANCH、NOBRANCH 是堆表创建关键字,堆表为“扁平 B 树表”。这两个参数用 来指定堆表并发分支 BRANCH 和非并发分支 NOBRANCH 的数目。<BRANCH 数>取 值范围为 1~64,<NOBRANCH 数>取值范围为 1~64。

1) NOBRANCH:指定创建的表为堆表,并发分支个数为 0,非并发分支个数为 1;

2) BRANCH(<BRANCH 数>, <NOBRANCH 数>):指定创建的表为堆表,并发分支个数为<BRANCH 数>,非并发个数为<NOBRANCH 数>;

3) BRANCH <BRANCH 数>:指定创建的表为堆表,并发分支个数为<BRANCH数>,非并发分支个数为 0。

而普通clusterbtr属性,则为非堆表,即普通 B树表。

这里我们多准备一点数据进行观察:

从测试来看,无论是普通表还是堆表,都存在ROWID的概念,我之前的理解有些不对。只不过达梦数据库中的ROWID结构看上去非常简单,似乎就是一个递增序列。

我们继续来探索一下达梦数据库的表相关参数属性;dm虽然没有Oracle pctfree,pctused等相关参数,不过也提供类似功能等参数;如FILLFACTOR。

FILLFACTOR参数是DM数据库提供的一个与性能有关的数据页级存储参数,它指定一个数据页初始化后插入数据时最大可以使用空间的百分比(100),该值在创建表/索引时可以指定。设置FILLFACTOR参数的值,是为了指定数据页中的可用空间百分比(FILLFACTOR)和可扩展空间百分比(100-FILLFACTOR)。

虽然FILLFACTOR参数取值范围从0到100;实际上0和100是没任何区别的。表示完全填充。该参数跟Oracle 功能类似oracle pctused和pctfree。从功能上来看,既要满足insert还要满足update,那么该参数不能过小;否则数据页分裂可能会比较严重。

接下来我们看看达梦数据库中对于分区表的支持情况。 查询官方手册,提供DM8种支持如下5种分区类型:

范围分区、哈希分区、列表分区、组合分区、间隔分区

看上去跟Oracle类似,Oracle也支持range,list,hash分区;同时支持3种分区类型的组合分区,其中组合有多种。

从操作上来看,跟Oracle别无两样;不过这里看上去兼容Oracle的dbms_stats 包,用来收集统计信息,似乎并没有起到应用的作用。

我们接续看下针对分区的访问的执行计划是如何的。

测试到这里让我有点疑惑了。 ID列我定义了主键,创建索引是理所当然的;对于分区键insertime也自动创建了非唯一性索引;而且也是分区索引。

当时该索引在dba_ind_columns 中却有查询不到。这是为什么 ?

对于list分区和hash分区,这里不进行测试了。再测一下组合分区。

hash的3种组合分区这里不再测试了;另外达梦不仅仅支持2级组合分区;还支持最多8层的多级分区,这一点比较赞。

不过分区真要做到4 5层,那管理估计也是一件头大的事儿。看文档说dm还支持间隔分区,类似Oracle 11g 的interval 分区,这个蛮有意思,测试一下看看。

居然查不到? 而且同样的SQL,不久多了查询一个interval列吗?居然报错。 这里来看应该是Bug 无疑了。。。。

最后简单总结一下:

1、默认情况下表为普通表;需要修改list_table参数为1,创建后的table则默认为堆表;或者在创建表时指定相关stroage选项。

2、dm有类似Oracle pctfree/pctused的参数即FILLFACTOR,该参数取值范围为【0,100】,只能是整数,参数越小,数据页可用空间就越少;

3、支持常规所有的分区表如range,list,hash;同时支持3种随意组合的9种组合分区;

4、支持interval 间隔分区;从文档来看,粒度可以非常细,支持月,天等。

5、无论是普通表还是堆表都存在rowid,至于rowid的格式化,这里没有研究,没有太多资料。看上去像是一个递增序列。

 

附录:另外看文档关于分区表也一些限制,如下内容拷贝至官方手册:

DM水平分区表有如下限制条件:

分区列类型必须是数值型、字符型或日期型,不支持BLOB、CLOB、IMAGE、TEXT、LONGVARCHAR、BIT、BINARY、VARBINARY、LONGVARBINARY、时间间隔类型和用户自定义类型为分区列;

范围分区和哈希分区的分区键可以多个,最多不超过16列;LIST分区的分区键必须唯一;

水平分区表指定主键和唯一约束时,分区键必须都包含在主键和唯一约束中;

水平分区表不支持临时表;

不能在水平分区表上建立自引用约束;

普通环境中,水平分区表的各级分区数的总和上限是65535;MPP环境下,水平分区表的各级分区总数上限取决于INI参数MAX_EP_SITES,上限为2^( 16 – log2MAX_EP_SITES)。比如:当MAX_EP_SITES为默认值64时,分区总数上限为1024;

不允许对分区子表执行任何DDL操作;

哈希分区支持重命名、删除约束、设置触发器是否启用的修改操作;

范围分区支持分区合并、拆分、增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;

LIST分区支持分区合并、拆分、增加、删除、交换、重命名、删除约束、设置触发器是否生效操作;

LIST分区范围值不能为NULL;

LIST分区子表范围值个数与数据页大小和相关系统表列长度相关,存在以下限制:

4K页,单个子表最多支持120个范围值;

8K页,单个子表最多支持254个范围值;

16K\32K页,单个子表最多支持270个范围值;

对范围分区增加分区值必须是递增的,即只能在最后一个分区后添加分区。LIST分区增加分区值不能存在于其他已存在分区;

当分区数仅剩一个时,不允许删除分区;

仅能对相邻的范围分区进行合并,合并后的分区名可为高分区名或新分区名;

拆分分区的分区值必须在原分区范围中,并且分区名不能跟已有分区名相同;

与分区进行分区交换的普通表,必须与分区表拥有相同的列及索引,但交换分区并不会对数据进行校验,即交换后的数据并不能保证数据完整性,如CHECK约束;分区表与普通表创建的索引顺序要求一致;

不能对水平分区表建立全局聚集索引、局部唯一函数索引或全文索引;

不能对分区子表单独建立索引;

在未指定ENABLE ROW MOVEMENT的分区表上执行更新分区键,不允许更新后数据发生跨分区的移动,即不能有行迁移;

不能在分区语句的STORAGE子句中指定BRANCH选项;

不允许引用水平分区子表作为外键约束;

多级分区表最多支持八层;

多级分区表支持下列修改表操作:新增分区、新增列、删除列、删除表级约束、修改表名、设置与删除列的默认值、设置列NULL属性、设置列可见性、设置行迁移属性、启用超长记录、with delta、新增子分区、删除子分区、修改二级分区模板信息;

水平分区表支持的列修改操作除了多级分区表支持的操作外,还支持:设置触发器生效/失效、修改除分区列以外的列名、修改列属性、增加表级主键约束、删除分区、SPLIT/MERGE分区和交换分区;

水平分区表中包含大字段、自定义字段列,则定义时指定 ENABLE ROW MOVEMENT参数无效,即不允许更新后数据发生跨分区的移动;

间隔分区表的限制说明:

仅支持一级范围分区创建间隔分区;

只能有一个分区列,且分区列类型为日期或数值;

对间隔分区进行SPLIT,只能在间隔范围内进行操作;

被SPLIT/MERGE的分区,其左侧分区不再进行自动创建;

不相邻的间隔的分区,不能MERGE;

表定义不能包含MAXVALUE分区;

不允许新增分区;

不能删除起始间隔分区;

间隔分区表定义语句显示到起始间隔分区为止;

自动生成的间隔分区,均不包含边界值;

间隔表达式只能为常量或日期间隔函数。日期间隔函数为:NUMTOYMINTERVAL、 NUMTODSINTERVAL;数值常量可以为整型、DEC类型;

MPP下不支持间隔分区表。

Leave a Reply

You must be logged in to post a comment.