11.1.12 シングルチャンク表の再編成が必要かどうかを確認する方法
シングルチャンク表の再編成が必要かどうかを確認する方法について説明します。
- メモ
-
マルチチャンク表の再編成が必要かどうかを確認する方法については,「11.4.13 マルチチャンク表の再編成が必要かどうかを確認する方法」を参照してください。
(1) 表の再編成が必要な理由
シングルチャンク表に対して,SQL文による行の挿入,更新,削除を繰り返し実行すると,表の検索性能やデータの格納効率が低下します。この場合,表を再編成すると,データ用DBエリア内のむだな空き領域が解放されて,表の検索性能やデータの格納効率が向上します。
シングルチャンク表の検索性能やデータの格納効率が低下する理由を次に示します。
- シングルチャンク表がローストア表の場合
-
DELETE文による行の削除を実行すると,削除対象の行データは無効となります。また,UPDATE文による行の更新を実行すると,更新後の行データが新たな行として追加されて,更新前の行データは無効となります。無効となった行データは,ディスクからは削除されません。
行の削除および行の更新を繰り返し実行した場合,表内に無効な行データが増加します。無効な行データが増加すると,次のような影響があります。
-
無効な行データが増加した影響で,データの格納効率が悪くなる
-
検索時に参照するページ数が増えるため,検索性能が低下する
-
- シングルチャンク表がカラムストア表の場合
-
-
INSERT文による行の挿入,またはUPDATE文による行の更新を実行すると,データがローストア形式で格納されます。行の挿入および行の更新を繰り返し実行した場合,ローストア形式で格納されるデータが増加します。ローストア形式で格納されるデータが増加すると,カラムストア表に適した検索(特定の列データ全体に対する検索や,特定の年や月などの範囲内の,特定の列データに対する検索など)の性能が低下します。
-
DELETE文による行の削除を実行すると,削除対象の行に関する情報が無効情報管理用ページに格納されます。また,UPDATE文による行の更新を実行すると,更新前の行に関する情報が無効情報管理用ページに格納されます。
行の削除および行の更新を繰り返し実行した場合,無効情報管理用ページが増加し,検索時に参照するページ数が増えるため,検索性能が低下します。
-
シングルチャンク表がローストア表の場合は,「(2) シングルチャンク表がローストア表の場合」を参照して,表の再編成が必要かどうかを確認してください。
シングルチャンク表がカラムストア表の場合は,「(3) シングルチャンク表がカラムストア表の場合」を参照して,表の再編成が必要かどうかを確認してください。
(2) シングルチャンク表がローストア表の場合
データの格納効率を計算し,データの格納効率が悪い場合は,表の再編成を実行してください。データの格納効率は,次の計算式で求めてください。
計算式
- 変数の説明
-
A:表の行数
B:無効行数
計算式で求めた結果が1に近いほど,データの格納効率が良いと判断できます。逆に,0に近いほど,データの格納効率が悪いと判断できます。0に近い場合は,「11.1.13 シングルチャンク表を再編成する方法」を参照して,表のデータを再編成してください。
変数AおよびBについては,次に示す手順で求めてください。
■手順(変数AおよびBの求め方)
-
SQLトレース情報が出力される設定になっていることを確認する
SQLトレース情報のアクセスパスの統計情報が出力されていることを確認してください。アクセスパスの統計情報が出力されているかどうかは,SQLトレース機能に関するサーバ定義の指定で確認できます。詳細については,「10.11.5 SQLトレース情報を出力するための準備」の「(2) サーバ定義を指定する」を参照してください。
-
次のSELECT文を実行する
SELECT COUNT(*) FROM "表名" /*>> WITHOUT INDEX <<*/
上記のSELECT文の実行結果が,表の行数(変数Aの値)になります。
-
アクセスパスの統計情報を確認する
手順2.で実行したSELECT文に対するアクセスパスの統計情報を確認してください。アクセスパスの統計情報の「Data_deleted_rows_cnt」の値を確認します。この値が,無効行数(変数Bの値)になります。
なお,無効行数(変数Bの値)がわからない場合は,次の手順で,データの格納効率を求めてください。
■手順(変数Bの値がわからない場合)
-
表の使用中セグメント数を確認する
adbdbstatusコマンドで,表のサマリ情報を出力してください。そして,Used_segments(表の使用中セグメント数)の出力内容を確認してください。adbdbstatusコマンドについては,マニュアルHADB コマンドリファレンスのadbdbstatus(データベースの状態解析)を参照してください。
-
表の行数を基に,データ用DBエリアのセグメント数を求める
表の行数を求めたあとで,データ用DBエリアのセグメント数を求めてください。表の行数を求める場合は,上記にある変数Aの説明を参照してください。
データ用DBエリアのセグメント数を求める場合は,「5.8.1 データ用DBエリアの総ページ数の求め方」の「(2) 変数の説明」の「(a) 変数SGROWTBLおよびPGROWTBLの求め方(シングルチャンク表の場合)」を参照してください。
なお,変数SGROWTBLは,データ用DBエリアに格納されているすべての表の合計を求める計算式となっています。ここでは,対象表だけを求めてください。また,表の行数は,変数SGROWTBLにある変数BP(i)および変数VP(i)で使用します。
-
求めた結果を基に,データの格納効率を求める
手順1.および手順2.で求めた結果を基に,データの格納効率を求めてください。計算式を次に示します。
計算式
上記の計算結果が0に近い場合,「11.1.13 シングルチャンク表を再編成する方法」を参照して,表の再編成を実行してください。
(3) シングルチャンク表がカラムストア表の場合
adbdbstatusコマンドを実行して再編成要否の情報を確認し,シングルチャンク表の再編成を実行するかどうかを決めてください。確認手順を次に示します。
手順
-
-d reorginfoオプションを指定したadbdbstatusコマンドを実行して,再編成要否の情報を出力する
-
再編成要否の情報のReorganization_necessity(再編成要否)の出力内容を確認する
-
Recommendedが出力されている場合
シングルチャンク表の再編成を実行してください。再編成手順については,「11.1.13 シングルチャンク表を再編成する方法」を参照してください。
-
Not_recommendedが出力されている場合
シングルチャンク表の再編成を実行する必要はありません。
-
adbdbstatusコマンドについては,マニュアルHADB コマンドリファレンスのadbdbstatus(データベースの状態解析)を参照してください。