1 生产环境推荐配置参数
在之前的博客中,我们了解了达梦实例的创建:
DM7 达梦数据库 通过dminit 创建 并 注册 数据库实例
https://www.cndba.cn/dave/article/3580
在dminit命令中可以看到达梦数据库实例有很多的配置参数,官方对这些参数也有说明,如果是测试环境,那么可以直接默认值来创建实例。 如果是生产环境使用,建议对参数进行相应的调整,以保证最佳性能。
这里先看推荐的实例创建参数:
./dminit PATH=/dm/data DB_NAME=CNDBA INSTANCE_NAME=DAVE page_size=32 extent_size=32 length_in_char=1 LOG_SIZE=2048 CASE_SENSITIVE=Y CHARSET=1 PORT_NUM=5236
这里指定的几个参数,有特别的作用,并且不是默认值,除此之外,还因为这些参数只能在实例创建的时候指定,一定创建成功,无法在进行修改。 如果环境已经按默认值创建,只能重新创建实例,然后使用DM DTS 工具,将数据迁移过来。
这里有个小细节,也是达梦与Oracle的不同,达梦库的DB_NAME和INSTANCE_NAME 在使用时并没有太多的实际意义。因为达梦是通过IP和端口直接连接的,不需要实例名的信息。
2 相关参数说明
2.1 LOG_SIZE=2048
该参数控制日志文件使用的簇大小,以 M为单位, 默认每个日志文件大小为 256M,可以配置为64和 2048之间的整数。 如果设置过小,可能会导致redo log 的频繁切换,从而影响性能。 所以推荐直接设置成最大值:2048。
2.2 CHARSET=1
控制实例的字符集。0代表 GB18030,1代表UTF-8,2代表韩文字符集 EUC-KR。默认值为 0,可以取值 0、1或 2之一。 这里推荐使用UTF-8,即设置为1。
2.3 CASE_SENSITIVE=Y
该参数控制标识符大小写敏感,默认值为 Y。当大小写敏感时,小写的标识符应用双引号括起,否则被转换为大写;当大小写不敏感时,系统不自动转换标识符的大小写,在标识符比较时也不区分大小写。
具体是否启用大小写敏感看具体业务,大多数还是启用大小写敏感的。
2.4 PAGE_SIZE=32
数据文件使用的页大小,可以为 4K、8K、 16K或 32K之一,选择的页大小越大,则 DM支持的元组长度也越大,但同时空间利用率可能下降,该参数默认是8K。只能是 4K、8K、16K或32K之一。
DM 达梦数据库 记录超长 错误解决方法
https://www.cndba.cn/dave/article/108596
实际生产环境,推荐是32k的页,达梦对32k做了一些优化,虽然大页会导致IO的增加,但优化后性能并没有太大影响。
2.5 EXTENT_SIZE =32
该参数控制数据文件使用的簇大小,即每次分配新的段空间时连续的页数,默认是16页,只能配置16页、32页、64页之一,生产环境推荐使用32页。即每次扩容 32*PAGE_SIZE。
2.6 LENGTH_IN_CHAR=1
该参数控制VARCHAR类型对象的长度是否以字符为单位。 取值 0或 1。默认值为0。
1:是,设置为以字符为单位时,定义长度并非真正按照字符长度调整,而是将存储长度值按照理论字符长度进行放大。所以会出现实际可插入字符数超过定义长度的情况,这种情况也是允许的。
同时,存储的字节长度 8188上限仍然不变,也就是说,即使定义列长度为8188字符,其实际能插入的字符串占用总字节长度仍然不能超过 8188;
0:否,所有 VARCHAR类型对象的长度以字节为单位。
通俗一点理解,在同样varchar长度的情况,使用字符(1)来计算长度,可以存储更多的内容,但总的上线还是8188字符。
以下测试都是基于该大小:
create table cndba(c1 varchar(10));
2.6.1 CHARSET=0,LENGTH_IN_CHAR=0
这是初始化数据库时的默认配置,字符集为gb18030,varchar长度以字节为单位,汉字一般需要占用两个字节。
插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
插入11个英文,错误
insert into cndba(c1) values('ABCDEFGHIJA');
--插入5个中文,正常
插入5个中文,正常
insert into cndba(c1) values('测试一下测');
--插入6个中文,错误
插入6个中文,错误
insert into cndba(c1) values('测试一下测试');
2.6.2 CHARSET=0,LENGTH_IN_CHAR=1
字符集为GB18030,在length_in_char=1的情况下,varchar按字符来计数,varchar的实际可存储字节数会按2倍的比例放大。
例如定义varchar(10),那么就可以存储10 * 2 = 20个字节的数据。
插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
插入11个英文,正常
insert into cndba(c1) values('ABCDEFGHIJA');
插入20个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJ');
插入21个英文,错误
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJA');
插入10个中文,正常
insert into cndba(c1) values('测试一下测试一下测试');
插入11个中文,错误
insert into cndba(c1) values('测试一下测试一下测试一');
插入10个中文1个英文,错误
insert into cndba(c1) values('测试一下测试一下测试A');
GB18030字符集下,一个汉字字符占2个字节。
2.6.3 CHARSET=1,LENGTH_IN_CHAR=0
字符集为UTF-8,varchar长度以字节为单位,一个汉字字符占据三个字节。
--插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入11个英文,错误
insert into cndba(c1) values('ABCDEFGHIJA');
--插入3个中文,正常
insert into cndba(c1) values('测试一');
--插入3个中文1个英文,正常
insert into cndba(c1) values('测试一A');
--插入4个中文,错误
insert into cndba(c1) values('测试一下');
--插入3个中文2个英文,错误
insert into cndba(c1) values('测试一AB');
2.6.4 CHARSET=1,LENGTH_IN_CHAR=1
字符集为UTF-8,varchar长度以字符为单位,varchar的实际存储字节数会按4倍的比例放大。
例如定义varchar(10),那么就可以存储10 * 4 = 40个字节的数据
--插入10个英文,正常
insert into cndba(c1) values('ABCDEFGHIJ');
--插入20个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJ');
--插入40个英文,正常
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJ');
--插入41个英文,错误
insert into cndba(c1) values('ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJA');
--插入10个中文,正常
insert into cndba(c1) values('测试一下测试一下测试');
--插入13个中文,正常
insert into cndba(c1) values('测试一下测试一下测试一下测');
--插入14个中文,错误
insert into cndba(c1) values('测试一下测试一下测试一下测试');
--插入13个中文1个英文,正常
insert into cndba(c1) values('测试一下测试一下测试一下测A');
--插入13个中文2个英文,错误
insert into cndba(c1) values('测试一下测试一下测试一下测AB');
版权声明:本文为博主原创文章,未经博主允许不得转载。