達夢資料庫之初始化頁大小對於表及表空間的影響分析

始於腳下發表於2020-04-20

在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>


 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31403259/viewspace-2687231/,如需轉載,請註明出處,否則將追究法律責任。

相關文章