1.DM数据库参数说明
Posted cqdba
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.DM数据库参数说明相关的知识,希望对你有一定的参考价值。
达梦数据库初始化实例后初始化参数无法修改,如果要调整必须重新初始化库,所以为了移植、开发、维护的方便,根据应用特征合理规划初始化参数尤为重要,确定后形成安装规范项目组成员保持一致,如果初始化参数不一致的数据库实例间的物理备份、逻辑备份等将不能互用,切记!下面对一些重要的初始化参数进行详细说明:
初始化参数 | 对数据库使用的影响 |
页大小(page size) | 字符串字段的最大长度及每行记录的总长度 |
日志文件大小(rlog) | 高并发事务下的刷盘速度 |
时区(time zone) | 时区不同时造成的时间不一致 |
字符串比较大小写敏感(string case sensitive) | SQL 语句及应用是否兼容 |
字符集(charset) | 字符的存储空间及可识别字符的数量 |
VARCHAR 类型以字符为单位(lengthin char) | dm 字符类型默认以字节来存储,影响应用对字符长度的判断 |
改进字符串 HASH 算法 | 改进字符串 HASH 算法 |
1 页大小
在 DM 数据库中,页大小可以为 4KB、8KB、16KB 或者 32KB,用户在创建数据库时可以指定,默认大小为 8KB,一旦创建好了数据库,在该库的整个生命周期内,页大小都不能够改变。
页大小对字符数据类型实际最大长度及每行记录的影响如下表所示(不同的数据库版本略有差异):
数据库页大小 | 每个字符类型字段实际最大长度(字节) | 每行记录除大字段外其他字段总长度(字节) |
4K | 1900 | 2000 |
8K | 3900 | 4000 |
16K | 8000 | 8000 |
32K | 8188 | 16000 |
除了每个字段的最大长度限制外,每条记录总长度不能大于页面大小的一半。如果系统中存在或者以后可能存在含有较长的字符串类型的表,建议该参数设置为 16 或者 32。
示例:采用默认的 8K 进行初始化数据库,下面的例子可以看出即使创建表时字段长度为 8188,实际插入长度及每行记录的总长度依然受到页大小的限制。
--建表 create table t1 (c1 varchar2(8188,c2 varchar2(8188); --测试单个字段插入长度 --插入数据 declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘a‘; for i in 1..3800 loop v:=v||‘a‘; end loop; v_sql:=‘insert into t1(c1) VALUES (‘‘‘||v||‘‘‘)‘; print(v_sql); execute immediate v_sql; commit; end
执行结果:
--插入数据 declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘a‘; for i in 1..4000 loop v:=v||‘a‘; end loop; v_sql:=‘insert into t1(c1) VALUES (‘‘‘||v||‘‘‘)‘; print(v_sql); execute immediate v_sql; commit; end
执行结果:
--测试每行记录总长度
--插入数据 declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘a‘; for i in 1..1900 loop v:=v||‘a‘; end loop; v_sql:=‘insert into t1(c1,c2) VALUES (‘‘‘||v||‘‘‘,‘‘‘||v||‘‘‘)‘; print(v_sql); execute immediate v_sql; commit; end
执行结果:
--插入数据
declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘a‘; for i in 1..2000 loop v:=v||‘a‘; end loop;
执行结果:
2 日志文件大小
每个 DM 数据库实例必须至少有 2 个重做日志文件,默认两个日志文件为DAMENG01.log、DAMENG02.log,这两个文件循环使用,日志文件在初始化实例后可以增加和扩大,小型 OA 系统建议设置为 2*256M,在线大型交易系统建议设置为 4*2048M。
3 时区
选择时区前,需要确认操作系统时区和数据库时区一致,以避免操作系统上看到的时间,和数据库中的时间存在差异。建议使用北京时间+8:00。
4 字符串比较大小写敏感
为了兼容不同的数据库,达梦在初始化数据库的时候有一个参数,用来设置字符串比较是否大小写敏感,用于确定数据库对象及数据是否区分大小写,默认为区分,不可更改。建议 mysql 和 SQLSERVER 迁移过来的系统,使用大小写不敏感, ORACLE 迁移过来的系统,使用大小写敏感,以便和原来系统匹配。
示例一:对于表名或字段名,如果初始化数据库采用默认的大小写敏感,之后使用 DTS从 MYSQL 迁移到达梦数据库,由于 MYSQL 的不区分大小写,迁移到达梦时对象名会变成小写,例如查询表 t1 :
会报错“无效的表或视图名[T1]”,这是因为在大小写敏感的情况下达梦客户端会把 SQL 中的对象名默认转为大写导致,这时需要将 SQL 改写为:
Select * from t1;
才能正常运行,如果应用已经开发完成,修改应用工作量将很大,所以初始化数据库 时一定要确认该参数。
Select * from "t1";
示例二:对于字段的值,如果 t1 表中有如下数据 a ,A
Select * from t1 where c1=’a’; 在大小写敏感的库中只会出现一条记录: a 在大小写不敏感的库中会出现两条记录: a A 需要根据自己的需求合理选择该参数。
5 字符集
建议采用默认值 GB18030,如果需要国际字符可以采用 Unicode,GB18030 数字字母占 1 个字节,普通汉字占 2 个字节,部分繁体及少数民族文字占 4 字节,Unicode 在达梦中采用 UTF-8 编码格式,欧洲的字母字符占 1 到 2 个字节,亚洲的大部分字符占 3 个字节,附加字符为 4 个字节。如果只存储中文和字母数字,一般来说 GB18030 更节省空间些
实例一:下图为 GB18030 字符集下,不同字符所占的字节长度
--建表 create table t2(c1 varchar2(10) --插入数据 insert into t2 values(‘a‘); insert into t2 values(‘啊‘); insert into t2 values(‘?‘); commit; --查看所占字节长度 select c1,lengthb(c1),(ascii(c1)) from t2;
执行结果:
实例二:下图为 Unicode 字符集下,不同字符所占的字节长度
--建表 create table t3(c1 varchar2(10)) --插入数据 insert into t3 values(‘a‘); insert into t3 values(‘啊‘); insert into t3 values(‘?‘); commit; --查看所占字节长度 select c1,lengthb(c1),(ascii(c1)) from t3;
6 VARCHAR 类型以字符为单位
该参数的作用是建表时 VARCHAR 的长度是按照字符计算还是字节计算,默认以字节为单位,即字段的长度单位按照字节计算,如果采用字符为单位,字段的长度单位按照字符来计算,不同的字符集会导致字段长度不一样,实际最大长度受到页大小的限制。建议采用默认以字节为单位,如果从 MYSQL 迁移的同时又不方便扩大表结构的长度,需要设置为以字符为单位。
示例:页大小 16K,Unicode 字符集,以字符为单位,VARCHAR2(4100)理论上可以存放 4100 个汉字,但由于一个汉字占 3 字节,实际受到 16K 页大小字节上限 8000 的限制。
--建表 create table t4(c1 varchar2(4100) --插入 declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘啊‘; for i in 1..2000 loop v:=v||‘啊‘; end loop; v_sql:=‘insert into t4(c1) VALUES (‘‘‘||v||‘‘‘)‘; print(v_sql); execute immediate v_sql; commit; end --查询字符长度和字节长度 select c1,length(c1),lengthb(c1) from t4;
执行结果:
--超过页大小限制则插入失败 declare v varchar2(8188); v_sql varchar2(8188); begin v:=‘啊‘; for i in 1..3000 loop v:=v||‘啊‘; end loop; v_sql:=‘insert into t4(c1) VALUES (‘‘‘||v||‘‘‘)‘; print(v_sql); execute immediate v_sql; commit; end
执行结果:
7 改进字符串 HASH 算法
在之前的达梦版本上用的旧的 HASH 算法(大概 2014 年 10 月前后,具体时间未知),之后的版本默认使用新 HASH 算法,如果是从之前旧版本数据还原到新版本上使用,不能使用改进字符串 HASH 算法,其他情况使用改进字符串 HASH 算法。
示例一:从 ORACLE 迁移一个 24 小时在线交易型系统,数据量 300G 以上,表数量 500张以上,表含有少量 VARCHAR2(4000)字段,日增数据量 10 万条以上,建议:
簇大小:16 #每次申请的页数,表存满了以后会一次性连续申请16个页 页大小:16K 日志文件大小:4*2048M 时区:+8:00 字符串比较大小写敏感:是 字符集:GB18030 VARCHAR 类型以字符为单位:否 改进字符串HASH算法:是
示例二:从 MYSQL 迁移一个电子政务系统,含大量 VARCHAR2(4000)字段,日增数据量 100 条,建议:
簇大小:16 页大小:32K 日志文件大小:2*256M 时区:+8:00 字符串比较大小写敏感:否 字符集:GB18030 (如果涉及非中英文字符选择 Unicode,VARCHAR 类型以字符为单位:如 果采用达梦 DTS 迁移选否,采用 SQL 脚本迁移选是) 改进字符串HASH算法:是
以上是关于1.DM数据库参数说明的主要内容,如果未能解决你的问题,请参考以下文章