你的浏览器禁用了JavaScript, 请开启后刷新浏览器获得更好的体验!
输入关键字进行搜索
搜索:
没有找到相关结果
nccloud
在DM数据库中,页大小可以为 4KB、 8KB、 16KB 或者 32KB,用户在创建数据库时可以根据实际情况选择需要的页大小, 默认大小为 8KB,该参数值在数据库初始化完成后,是 无法进行更改的,只能重新初始化数据库进行更改。
初始化页大小的选择不仅影响表空间数据文件的大小选择,也会对表中每个字段及每条记录产生限制,页大小对字符数据类型实际最大长度及每行记录、表空间数据文件大小的影响如下表所示( 此表数据仅供参考,因部署环境、数据库版本、字符选择等因素,表中数据会存在一定的差异):
数据库页大小
每个字符类型字段实际最大长度(字节)
每行记录除大字段外其他字段总长度(字节)
表空间单个数据文件的最小(MB)/最大大小(MB)
4K
1938
2047
16/ 8388608
8K
3878
4095
32/ 16777216
16K
8000
8195
64/ 33554432
32K
8188
16176
128/ 67108864
在进行表设计的时候,每条记录总长度不能大于页面大小的一半,所以当表中出现的字段值较大时,就会压缩其他字段占用的空间。如果系统中存在或者以后可能存在含有较长的字符串类型的表或者列的数量比较多(叠加的字符串长度较长),建议该参数设置为 16 或者 32。
达梦数据库是以簇为最小的物理单元,为数据库分配物理存储空间,簇大小可以设置为16或者32,默认为16,每个簇的大小=页大小x页数(簇大小参数设置的值),所以页大小设置越大,数据文件的物理大小就会越大,在系统运行时,每次从磁盘调入内存的数据单位也就越大,磁盘的IO量也就越大,所以在规划数据库前期,需要慎重考虑数据库页大小及簇大小的选择。
以下为测试过程(测试环境为Linux7 DM7环境32KB初始页大小):
SQL>
select
*
from
v$version;
LINEID BANNER
---------- ---------------------------------------------------------------
1 DM
Database
Server x64 V7.6.0.199-Build(2019.09.16-112854)ENT
2 DB Version: 0x7000a
used
time
: 4.269(ms).
Execute
id
is
3.
para_name,para_value
v$dm_ini
where
para_name =
'GLOBAL_PAGE_SIZE'
;
LINEID para_name para_value
---------- ---------------- ----------
1 GLOBAL_PAGE_SIZE 32768
: 9.836(ms).
4.
'GLOBAL_EXTENT_SIZE'
---------- ------------------ ----------
1 GLOBAL_EXTENT_SIZE 32
: 8.067(ms).
5.
1、 页大小对表空间的影响测试
页大小为32KB,表空间的最小大小为128MB,小于128MB将无法成功创建表空间,测试过程如下。
create
tablespace test datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf'
size
127;
[-2410]:Error
in
line: 1
Data file [/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf]
invalid.
: 0.633(ms).
0.
128;
executed successfully
: 77.732(ms).
11.
如测试过程所示,当表空间的大小小于128MB时,无法完成表空间创建,并打印出size is invalid错误提示,其实页大小限制的是单个数据文件的最小大小,因为每个表空间至少需要包含一个数据文件,所以也就对表空间的大小形成了限制,如下测试过程,我们给test表空间添加数据文件。
alter
tablespace test
add
datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf'
Data file [/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf]
: 0.737(ms).
: 61.880(ms).
12.
2、 页大小对表的字段大小的影响测试
table
t1(a varchar2(8189));
[-6121]:Error
Precision
out
of
range.
: 0.757(ms).
t1(a varchar2(8188));
: 7.876(ms).
21.
declare
2 v_a varchar2(8188);
3 v_sql varchar2(8188);
4
begin
5 v_a:=
'a'
6
for
i
1..8187
7 loop
8 v_a:=v_a||
9
end
loop;
10 v_sql:=
'insert into t1(a) values ('
''
||v_a||
')'
11 print(v_sql);
12
execute
immediate v_sql;
13
commit
14
15 /
DMSQL executed successfully
: 46.135(ms).
22.
set
SERVEROUT
on
1..8189
v_a varchar2(8188);
v_sql varchar2(8188);
v_a:=
loop
v_a:=v_a||
v_sql:=
print(v_sql);
[-6169]:
Column
[a]
length.
: 43.767(ms).
以上测试过程基于的是32KB页大小的环境,所以对比结果不是太明显,即便在创建表时声明的列最大长度为8188,如果是8KB的初始页大小,插入列值大于3878个字节,依然会提示记录超长错误提示信息。
3、 页大小对表的单条记录最大长度的影响测试
t2(a varchar2(8188),b varchar2(8188));
: 5.060(ms).
28.
1..8087 loop
7 v_a:=v_a||
8
9 v_sql:=
10
11
13 /
: 42.331(ms).
29.
1..8088 loop
'insert into t2(a,b) values ('
','
: 43.480(ms).
要回复问题请先登录或注册
1 个回复
nccloud
在DM数据库中,页大小可以为 4KB、 8KB、 16KB 或者 32KB,用户在创建数据库时可以根据实际情况选择需要的页大小, 默认大小为 8KB,该参数值在数据库初始化完成后,是 无法进行更改的,只能重新初始化数据库进行更改。
初始化页大小的选择不仅影响表空间数据文件的大小选择,也会对表中每个字段及每条记录产生限制,页大小对字符数据类型实际最大长度及每行记录、表空间数据文件大小的影响如下表所示( 此表数据仅供参考,因部署环境、数据库版本、字符选择等因素,表中数据会存在一定的差异):
数据库页大小
每个字符类型字段实际最大长度(字节)
每行记录除大字段外其他字段总长度(字节)
表空间单个数据文件的最小(MB)/最大大小(MB)
4K
1938
2047
16/ 8388608
8K
3878
4095
32/ 16777216
16K
8000
8195
64/ 33554432
32K
8188
16176
128/ 67108864
在进行表设计的时候,每条记录总长度不能大于页面大小的一半,所以当表中出现的字段值较大时,就会压缩其他字段占用的空间。如果系统中存在或者以后可能存在含有较长的字符串类型的表或者列的数量比较多(叠加的字符串长度较长),建议该参数设置为 16 或者 32。
达梦数据库是以簇为最小的物理单元,为数据库分配物理存储空间,簇大小可以设置为16或者32,默认为16,每个簇的大小=页大小x页数(簇大小参数设置的值),所以页大小设置越大,数据文件的物理大小就会越大,在系统运行时,每次从磁盘调入内存的数据单位也就越大,磁盘的IO量也就越大,所以在规划数据库前期,需要慎重考虑数据库页大小及簇大小的选择。
以下为测试过程(测试环境为Linux7 DM7环境32KB初始页大小):
SQL>
select
*
from
v$version;
LINEID BANNER
---------- ---------------------------------------------------------------
1 DM
Database
Server x64 V7.6.0.199-Build(2019.09.16-112854)ENT
2 DB Version: 0x7000a
used
time
: 4.269(ms).
Execute
id
is
3.
SQL>
select
para_name,para_value
from
v$dm_ini
where
para_name =
'GLOBAL_PAGE_SIZE'
;
LINEID para_name para_value
---------- ---------------- ----------
1 GLOBAL_PAGE_SIZE 32768
used
time
: 9.836(ms).
Execute
id
is
4.
SQL>
select
para_name,para_value
from
v$dm_ini
where
para_name =
'GLOBAL_EXTENT_SIZE'
;
LINEID para_name para_value
---------- ------------------ ----------
1 GLOBAL_EXTENT_SIZE 32
used
time
: 8.067(ms).
Execute
id
is
5.
SQL>
1、 页大小对表空间的影响测试
页大小为32KB,表空间的最小大小为128MB,小于128MB将无法成功创建表空间,测试过程如下。
SQL>
create
tablespace test datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf'
size
127;
create
tablespace test datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf'
size
127;
[-2410]:Error
in
line: 1
Data file [/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf]
size
is
invalid.
used
time
: 0.633(ms).
Execute
id
is
0.
SQL>
SQL>
create
tablespace test datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test01.dbf'
size
128;
executed successfully
used
time
: 77.732(ms).
Execute
id
is
11.
SQL>
如测试过程所示,当表空间的大小小于128MB时,无法完成表空间创建,并打印出size is invalid错误提示,其实页大小限制的是单个数据文件的最小大小,因为每个表空间至少需要包含一个数据文件,所以也就对表空间的大小形成了限制,如下测试过程,我们给test表空间添加数据文件。
SQL>
alter
tablespace test
add
datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf'
size
127;
alter
tablespace test
add
datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf'
size
127;
[-2410]:Error
in
line: 1
Data file [/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf]
size
is
invalid.
used
time
: 0.737(ms).
Execute
id
is
0.
SQL>
alter
tablespace test
add
datafile
'/opt/dmdbms/data/db_test_standby/dbteststan/test02.dbf'
size
128;
executed successfully
used
time
: 61.880(ms).
Execute
id
is
12.
SQL>
2、 页大小对表的字段大小的影响测试
SQL>
create
table
t1(a varchar2(8189));
create
table
t1(a varchar2(8189));
[-6121]:Error
in
line: 1
Precision
is
out
of
range.
used
time
: 0.757(ms).
Execute
id
is
0.
SQL>
SQL>
create
table
t1(a varchar2(8188));
executed successfully
used
time
: 7.876(ms).
Execute
id
is
21.
SQL>
SQL>
SQL>
declare
2 v_a varchar2(8188);
3 v_sql varchar2(8188);
4
begin
5 v_a:=
'a'
;
6
for
i
in
1..8187
7 loop
8 v_a:=v_a||
'a'
;
9
end
loop;
10 v_sql:=
'insert into t1(a) values ('
''
||v_a||
''
')'
;
11 print(v_sql);
12
execute
immediate v_sql;
13
commit
;
14
end
15 /
DMSQL executed successfully
used
time
: 46.135(ms).
Execute
id
is
22.
SQL>
SQL>
set
SERVEROUT
on
SQL>
declare
2 v_a varchar2(8188);
3 v_sql varchar2(8188);
4
begin
5 v_a:=
'a'
;
6
for
i
in
1..8189
7 loop
8 v_a:=v_a||
'a'
;
9
end
loop;
10 v_sql:=
'insert into t1(a) values ('
''
||v_a||
''
')'
;
11 print(v_sql);
12
execute
immediate v_sql;
13
commit
;
14
end
15 /
declare
v_a varchar2(8188);
v_sql varchar2(8188);
begin
v_a:=
'a'
;
for
i
in
1..8189
loop
v_a:=v_a||
'a'
;
end
loop;
v_sql:=
'insert into t1(a) values ('
''
||v_a||
''
')'
;
print(v_sql);
execute
immediate v_sql;
commit
;
end
[-6169]:
Column
[a]
out
of
length.
used
time
: 43.767(ms).
Execute
id
is
0.
SQL>
以上测试过程基于的是32KB页大小的环境,所以对比结果不是太明显,即便在创建表时声明的列最大长度为8188,如果是8KB的初始页大小,插入列值大于3878个字节,依然会提示记录超长错误提示信息。
3、 页大小对表的单条记录最大长度的影响测试
SQL>
create
table
t2(a varchar2(8188),b varchar2(8188));
executed successfully
used
time
: 5.060(ms).
Execute
id
is
28.
SQL>
SQL>
declare
2 v_a varchar2(8188);
3 v_sql varchar2(8188);
4
begin
5 v_a:=
'a'
;
6
for
i
in
1..8087 loop
7 v_a:=v_a||
'a'
;
8
end
loop;
9 v_sql:=
'insert into t1(a) values ('
''
||v_a||
''
')'
;
10
execute
immediate v_sql;
11
commit
;
12
end
;
13 /
DMSQL executed successfully
used
time
: 42.331(ms).
Execute
id
is
29.
SQL>
SQL>
SQL>
declare
2 v_a varchar2(8188);
3 v_sql varchar2(8188);
4
begin
5 v_a:=
'a'
;
6
for
i
in
1..8088 loop
7 v_a:=v_a||
'a'
;
8
end
loop;
9 v_sql:=
'insert into t2(a,b) values ('
''
||v_a||
''
','
''
||v_a||
''
')'
;
10
execute
immediate v_sql;
11
commit
;
12
end
;
13 /
declare
v_a varchar2(8188);
v_sql varchar2(8188);
begin
v_a:=
'a'
;
for
i
in
1..8088 loop
v_a:=v_a||
'a'
;
end
loop;
v_sql:=
'insert into t2(a,b) values ('
''
||v_a||
''
','
''
||v_a||
''
')'
;
execute
immediate v_sql;
commit
;
end
;
[-6169]:
Column
[a]
out
of
length.
used
time
: 43.480(ms).
Execute
id
is
0.
SQL>