DM数据库页大小设计与varchar大小的思考

几个初始化后便无法修改的参数

      以下参数在DM实例初始化之后便不能再修改:page_size页大小,extent_size簇大小,case_sensitive大小写敏感,charset字符集。其中本人最感兴趣的是page_size这个参数。

1、page_size的设计

       page_size表示页大小,在DM数据库中每一条记录的最大占用空间不能超过页大小的一半,那么问题来了为什么这样设计呢,设计成三分之一或者三分之二不行吗?

       仔细想来原因并不复杂,将其设计成页大小的一半而不是更大,是因为这样我可以把一个数据页分成两半,存放两条记录,减少了空间浪费(如果页大小为16K,而大量数据仅仅占用了1K,此时如果将记录的大小限制放开,则一条数据独占一页,会使得大量数据页中有15k的空间浪费)。

        那为什么不设计更小一点呢,此时我们要思考一个问题,一条记录他并不是不变的,是有可能被后续修改的,后面的操作是有可能将其涨大的,如果不给每条记录预留一部分空间,那么很可能对后续对数据的修改产生影响(比如一条记录经过修改之后超过了原先的限制,此时可能会出现两种情况,要么修改不成功影响业务,要么一条记录跨数据页存储,此类情况会严重影响数据库性能)。所以,我只能说将每条记录的大小限制到数据页的一半,这样设计更多的是一种平衡性的考量,尽量减少空间浪费的同时,又要给记录留够缓冲空间。

2、varchar类型的大小限制

        上面我们说了DM设计的一条记录不能超过页大小的一半,那么不同的页大小设计下,varchar类型的大小限制自然不同:

页大小​varchar最大字节数每行记录(不含大字段)最大字节数
4k1900左右2000
8k3900左右4000
16k8000左右8000
32k818816000

        不知道大家注意到没有,我在1900、3900、8000后面都写了左右,而8188后面没有,下面我来讲一下我的猜想,仅供参考。

        首先,前三种页大小设计下的varchar限制都是一个模糊的界限,毕竟还有一些头文件的信息需要存储,而这些头文件大小,我们无法确定,所以这些都是大概数字。

举例说明:

1、创建数据库(以页大小设为8K为例)

2、建两张表t1、t2,表定义如下,:

这两张表的区别在哪里呢? t2表比t1多一列!

3、往表t1中插数据,验证t1中varchar的大小限制:

 我们可以看到,t1表中varchar的最大长度为3879。

 4、往表t2中插数据,验证t2中varchar的大小限制:

  我们可以看到,t2表中varchar的最大长度为3877。这个上限值比t1表小了两个字节。

 5、总结来说,一个数据库中varchar的大小限制不是固定值,而是由表的定义、页大小二者决定的。

3、页大小为32K时,varchar类型最大长度8188

        按照上面的结论,页大小设为32K时,varchar的最大长度应该在16000左右,为什么是一个确定值8188呢?首先我们来验证这个8188的准确性:

建表:

         我们可以看到,在建表时会校验varchar的长度,最大长度8188。

          那么问题来了,为什么是8188,不是16000左右或者8192呢,这里我只能给出猜想,有两个方面的原因,首先,不是8192而是小四个字节的8188或许是因为文件头的关系,由于涉及底层结构,我无法轻易验证自己的猜想。第二点,为什么不是更大的数值,我的想法是,参考oracle,为什么Oracle设置的最大值是4000呢,(oracle与DM在存储过程中varchar的最大容量都是32767),这个可能是由于实际需求设计的,可能在DM看来,超过8k比较多的数据应当直接当作大字段来处理,而超过8188但是超过部分很小的这种情况非常少,这类也之间按照大字段来处理。不同的厂商按照自己的需求情况设计了不同的varchar上限,当然这只是我的个人猜想仅供参考,无法验证。

       

最后如果哪位大佬,能够确切地解答我对varchar大小限制地疑问,感激不尽>.<

如果还有任何问题,欢迎到达梦云适配中心提问哦!

社区 | 达梦云适配中心 (dameng.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值