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

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

达梦数据库学习笔记 — 字符集与数据存储

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

本文链接地址: 达梦数据库学习笔记 — 字符集与数据存储

有很久没写国产数据库达梦方面的技术文章了,近2年达梦数据库发展十分迅猛,不得不再研究研究。这里围绕字符集相关进行简单测试。

这里的查询结果 0 代表 gb18030;1 代表 UTF-8。

LENGTH_IN_CHAR参数决定了达梦数据库中varchar数据类型存储长度是byte还是char,默认为0表示byte,为1则表现为字符。

从上面的测试来看,默认varchar存储长度为byte的情况下,一个汉字占2个字节。在UTF8字符集情况下,是占3个字节。

我们看到达梦数据库也有object_id的概念,但无data_object_id。那么既然无data_object_id,那么对于列存表来说,
如果发生truncate操作,其object_id会变化吗?

从测试来看跟预期看法是一致的,truncate操作不影响object_id,drop操作会增加object_id。达梦无法重用object_id。

最后我们来看下表的实际存储情况:

由于达梦数据库没有提供类似Oracle BBED之类可以直接map查看block结构的工具,因此只能通过上面dd + od 的方式来进行猜测判断。

从信息判断来看,达梦的数据块存储结构跟Oracle类似,block头部也会存放类似oracle block rdba一样的地址。

从前面几点小的测试可以得到如下几个结论:

1、达梦数据库相关视图跟Oracle几乎一致,兼容性确实很好,不过似乎只是为了兼容而兼容;
比如我们看到存在object_id,没有data_object_id的概念。truncate操作不影响object_id,且无法重用。

2、对于列存表来讲,达梦数据库page 存储结构跟Oracle block类似,也存在类似rdba地址的内容在page(block)头部。

3、普通列存表存在rowid的,而且是实际存储,但对于业务来讲实际上是个伪列,业务不可见,但可查询。

其中达梦数据库中的ROWID跟Oracle 的ROWID完全不同,Oracle中的ROWID可以分解为rdba+object_id+row_number;

对于普通表来讲,达梦的ROWID就是一个单纯递增的序列。

4、对于对象空间分配,其最小IO单元是page(block),默认是8k,但最小分配单元为簇,类似Oracle extent,一个extent 包含多个page(block);

对于簇大小,有16,32,64 几种选择,假设默认为8k block size,那么最大extent为8个block。

对于这一点,后续进行一次更深入的测试分析,目前来看跟Oracle差距非常大,Oracle支持auto和uniform 2种方式,extent尺寸可变且比较大,一定程度上

对于大数据量的插入场景来讲,有很大的优势。

5、达梦数据库的字符集仅支持3种,gb18030,utf8以及韩文模式。

 

Leave a Reply

You must be logged in to post a comment.