几个初始化后便无法修改的参数
以下参数在DM实例初始化之后便不能再修改:page_size页大小,extent_size簇大小,case_sensitive大小写敏感,charset字符集。其中本人最感兴趣的是page_size这个参数。
1、page_size的设计
page_size表示页大小,在DM数据库中每一条记录的最大占用空间不能超过页大小的一半,那么问题来了为什么这样设计呢,设计成三分之一或者三分之二不行吗?
仔细想来原因并不复杂,将其设计成页大小的一半而不是更大,是因为这样我可以把一个数据页分成两半,存放两条记录,减少了空间浪费(如果页大小为16K,而大量数据仅仅占用了1K,此时如果将记录的大小限制放开,则一条数据独占一页,会使得大量数据页中有15k的空间浪费)。
那为什么不设计更小一点呢,此时我们要思考一个问题,一条记录他并不是不变的,是有可能被后续修改的,后面的操作是有可能将其涨大的,如果不给每条记录预留一部分空间,那么很可能对后续对数据的修改产生影响(比如一条记录经过修改之后超过了原先的限制,此时可能会出现两种情况,要么修改不成功影响业务,要么一条记录跨数据页存储,此类情况会严重影响数据库性能)。所以,我只能说将每条记录的大小限制到数据页的一半,这样设计更多的是一种平衡性的考量,尽量减少空间浪费的同时,又要给记录留够缓冲空间。
2、varchar类型的大小限制
上面我们说了DM设计的一条记录不能超过页大小的一半,那么不同的页大小设计下,varchar类型的大小限制自然不同:
页大小 | varchar最大字节数 | 每行记录(不含大字段)最大字节数 |
4k | 1900左右 | 2000 |
8k | 3900左右 | 4000 |
16k | 8000左右 | 8000 |
32k | 8188 | 16000 |
不知道大家注意到没有,我在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大小限制地疑问,感激不尽>.<
如果还有任何问题,欢迎到达梦云适配中心提问哦!