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
全体を見て判断しなくてはいけませんね。
もどる