Symfoware Create Tableの考察(SEQUENTIAL)



Symfowareでデータベーススペースの見積もりがよくわからなかったので、
まずスペース自体がどのように使用されるか調べてみました。

サンプルとしてこんなテーブル構成を考えます。

--DB作成定義
--DB作成
CREATE DATABASE DB_TEST;

--DBスペース作成
CREATE DBSPACE DB_TEST ALLOCATE FILE C:\db_test\db_test.db ATTRIBUTE SPACE(112K);

--スキーマ作成
CREATE SCHEMA SC_TEST Comment 'SC_TEST';

--テーブル作成
CREATE TABLE SC_TEST.M_USER(
番号 CHAR(10) DEFAULT '0000000000' NOT NULL,
名前 NCHAR(20) DEFAULT N' ' NOT NULL,
PRIMARY KEY(番号)) COMMENT '社員コード';

--M_USERテーブルのDSOを作成
CREATE DSO DSO_M_USER
FROM SC_TEST.M_USER
TYPE SEQUENTIAL(PAGESIZE(16),ORDER(1)) ;

--M_USERテーブルのDSIを作成
CREATE DSI DSI_M_USER DSO DSO_M_USER
ALLOCATE DATA ON DB_TEST SIZE 48K ;

-- インデックスのDSOを作成
CREATE DSO DSO_IDX_M_USER
INDEX ON SC_TEST.M_USER(番号)
TYPE BTREE(PAGESIZE1(16),PAGESIZE2(8),REALIGNMENT)
BY ADDRESS ;

-- インデックスのDSIを作成
CREATE DSI DSI_IDX_M_USER INDEX DSO DSO_IDX_M_USER
OPTION (DEGENERATE)
ALLOCATE INDEX ON DB_TEST SIZE 16K,
BASE ON DB_TEST SIZE 48K;


1レコードのバイト数は50バイトとなります。

このテーブルに対し、

"0000000001","名前1"
"0000000002","名前2"
"0000000003","名前3"
・・・


というテキストファイルを

rdbsloader -mi -i DB_TEST.DSI_M_USER -t C:\data.txt


というコマンドを使用して最大何件登録可能か調べました。
結果、440件。

次に、領域を48Kから33Kという微妙な値に変更しました。
使用する領域は33+16+33=82Kで、データベーススペースも
82Kでよいだろうと思ったのですが、112K要求されます。

実行した定義体は以下のとおり。

--DB作成定義
--DB作成
CREATE DATABASE DB_TEST;

--DBスペース作成
CREATE DBSPACE DB_TEST ALLOCATE FILE C:\db_test\db_test.db ATTRIBUTE SPACE(112K);

--スキーマ作成
CREATE SCHEMA SC_TEST Comment 'SC_TEST';

--テーブル作成
CREATE TABLE SC_TEST.M_USER(
番号 CHAR(10) DEFAULT '0000000000' NOT NULL,
名前 NCHAR(20) DEFAULT N' ' NOT NULL,
PRIMARY KEY(番号)) COMMENT '社員コード';

--M_USERテーブルのDSOを作成
CREATE DSO DSO_M_USER
FROM SC_TEST.M_USER
TYPE SEQUENTIAL(PAGESIZE(16),ORDER(1)) ;

--M_USERテーブルのDSIを作成
CREATE DSI DSI_M_USER DSO DSO_M_USER
ALLOCATE DATA ON DB_TEST SIZE 33K ;

-- インデックスのDSOを作成
CREATE DSO DSO_IDX_M_USER
INDEX ON SC_TEST.M_USER(番号)
TYPE BTREE(PAGESIZE1(16),PAGESIZE2(8),REALIGNMENT)
BY ADDRESS ;

-- インデックスのDSIを作成
CREATE DSI DSI_IDX_M_USER INDEX DSO DSO_IDX_M_USER
OPTION (DEGENERATE)
ALLOCATE INDEX ON DB_TEST SIZE 16K,
BASE ON DB_TEST SIZE 33K;



登録可能なデータ数は440件と、容量変更前と変更なし。
ALLOCATEで指定した値がPAGESIZEで指定した値で割り切れない
場合、自動的に切り上げて容量確保されます。
・・・まあ、考えてみれば当然ですね。


次に試したのは、

--DB作成定義
--DB作成
CREATE DATABASE DB_TEST;

--DBスペース作成
CREATE DBSPACE DB_TEST ALLOCATE FILE C:\db_test\db_test.db ATTRIBUTE SPACE(80K);

--スキーマ作成
CREATE SCHEMA SC_TEST Comment 'SC_TEST';

--テーブル作成
CREATE TABLE SC_TEST.M_USER(
番号 CHAR(10) DEFAULT '0000000000' NOT NULL,
名前 NCHAR(20) DEFAULT N' ' NOT NULL,
PRIMARY KEY(番号)) COMMENT '社員コード';

--M_USERテーブルのDSOを作成
CREATE DSO DSO_M_USER
FROM SC_TEST.M_USER
TYPE SEQUENTIAL(PAGESIZE(16),ORDER(1)) ;

--M_USERテーブルのDSIを作成
CREATE DSI DSI_M_USER DSO DSO_M_USER
ALLOCATE DATA ON DB_TEST SIZE 32K ;

-- インデックスのDSOを作成
CREATE DSO DSO_IDX_M_USER
INDEX ON SC_TEST.M_USER(番号)
TYPE BTREE(PAGESIZE1(16),PAGESIZE2(8),REALIGNMENT)
BY ADDRESS ;

-- インデックスのDSIを作成
CREATE DSI DSI_IDX_M_USER INDEX DSO DSO_IDX_M_USER
OPTION (DEGENERATE)
ALLOCATE INDEX ON DB_TEST SIZE 16K,
BASE ON DB_TEST SIZE 32K;


これだと220件登録できました。


じゃあ、これは?

--DB作成定義
--DB作成
CREATE DATABASE DB_TEST;

--DBスペース作成
CREATE DBSPACE DB_TEST ALLOCATE FILE E:\db_test\db_test.db ATTRIBUTE SPACE(144K);

--スキーマ作成
CREATE SCHEMA SC_TEST Comment 'SC_TEST';

--テーブル作成
CREATE TABLE SC_TEST.M_USER(
番号 CHAR(10) DEFAULT '0000000000' NOT NULL,
名前 NCHAR(20) DEFAULT N' ' NOT NULL,
PRIMARY KEY(番号)) COMMENT '社員コード';

--M_USERテーブルのDSOを作成
CREATE DSO DSO_M_USER
FROM SC_TEST.M_USER
TYPE SEQUENTIAL(PAGESIZE(16),ORDER(1)) ;

--M_USERテーブルのDSIを作成
CREATE DSI DSI_M_USER DSO DSO_M_USER
ALLOCATE DATA ON DB_TEST SIZE 64K ;

-- インデックスのDSOを作成
CREATE DSO DSO_IDX_M_USER
INDEX ON SC_TEST.M_USER(番号)
TYPE BTREE(PAGESIZE1(16),PAGESIZE2(8),REALIGNMENT)
BY ADDRESS ;

-- インデックスのDSIを作成
CREATE DSI DSI_IDX_M_USER INDEX DSO DSO_IDX_M_USER
OPTION (DEGENERATE)
ALLOCATE INDEX ON DB_TEST SIZE 16K,
BASE ON DB_TEST SIZE 64K;


登録可能件数は660件でした。

もっと色々な事例を調査する必要がありますが、
なんとなく自分なりの見積もり式が作れそうな気がします。


ちなみに、データの使用量を調べるコマンドは、

rdbudsi -i DB_TEST.DSI_M_USER -f


最後に示した定義で、データを440件登録している状態でコマンドを実行してみると、

C:\>rdbudsi -i DB_TEST.DSI_M_USER -f
DSI(DB_TEST.DSI_M_USER),TYPE(SEQUENTIAL),DATA(440,50%,75%,4,100%)
qdg12074i:rdbudsiが正常終了しました 復帰コード 00


データを441件登録している状態でコマンドを実行してみると、

C:\>rdbudsi -i DB_TEST.DSI_M_USER -f
DSI(DB_TEST.DSI_M_USER),TYPE(SEQUENTIAL),DATA(441,75%,100%,4,67%)
qdg12074i:rdbudsiが正常終了しました 復帰コード 00


DATA()の中に示される値は
1:登録されているデータ件数
2:データがみっちり登録されているページの割合
3:使いかけも含めたデータの登録されているページの割合
4:ページ数
5:3(使用中の領域)に対する使用率

・・・と解釈しました。
それなので、実際の使用率は3*5の割合になるかと思います。

例として、55件、110件、220件を登録したときのコマンドの
出力を試してみました。


C:\>rdbudsi -i DB_TEST.DSI_M_USER -f
DSI(DB_TEST.DSI_M_USER),TYPE(SEQUENTIAL),DATA(55,25%,50%,4,25%)
qdg12074i:rdbudsiが正常終了しました 復帰コード 00

C:\>rdbudsi -i DB_TEST.DSI_M_USER -f
DSI(DB_TEST.DSI_M_USER),TYPE(SEQUENTIAL),DATA(110,25%,50%,4,50%)
qdg12074i:rdbudsiが正常終了しました 復帰コード 00

C:\>rdbudsi -i DB_TEST.DSI_M_USER -f
DSI(DB_TEST.DSI_M_USER),TYPE(SEQUENTIAL),DATA(220,25%,50%,4,100%)
qdg12074i:rdbudsiが正常終了しました 復帰コード 00


全体を見て判断しなくてはいけませんね。





もどる