3.3.15 共用表
HiRDB/パラレルサーバの場合,複数の表を結合するとき,それぞれの表が配置されたバックエンドサーバから表データを読み込み,別のバックエンドサーバで突き合わせ処理をします。そのため,複数のサーバを接続し,データを転送する処理が発生します。このとき,結合処理のための検索範囲のデータが一つのバックエンドサーバにあれば,そのデータを共用表として作成することで一つのバックエンドサーバで結合処理が完結します。共用表とは,共用RDエリアに格納された表で,すべてのバックエンドサーバから参照できる表のことです。また,共用表に定義するインデクスを,共用インデクスといいます。共用表については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。
共用表及び共用インデクスはHiRDB/シングルサーバにも定義できます。これによって,HiRDB/パラレルサーバとSQL及びUAPの互換性を保てます。共用表及び共用インデクスはHiRDB/パラレルサーバで有効なので,通常はHiRDB/パラレルサーバで使用します。ここでは,HiRDB/パラレルサーバで共用表を使用する場合について説明します。HiRDB/シングルサーバで共用表を使用する場合については,「HiRDB/シングルサーバで共用表を使用する場合の注意事項」を参照してください。
(1) 共用表の効果
一つのバックエンドサーバで結合処理が完結するため,バックエンドサーバ間の接続やデータ転送によるオーバヘッドが削減できます。また,トランザクションごとに使用するバックエンドサーバ数を少なくできるため,多重実行時などに並列処理の効率が上がります。
(2) 適用基準
更新処理が少なく,結合処理など複数のトランザクションから参照されるような表は,共用表として作成することをお勧めします。
(3) 共用表を更新する場合の注意
共用表を更新する場合,共用RDエリアを配置している全バックエンドサーバに排他が掛かります。インデクスキー値を変更しないUPDATE文,PURGE TABLE文の実行以外はLOCK TABLE文でIN EXCLUSIVE MODEを指定し,全バックエンドサーバに排他を掛けなければ実行できません。そのため,排他が掛かっているRDエリアにアクセスする業務があるとデッドロック,又はサーバ間のグローバルデッドロックが発生する可能性があります。
なお,ローカルバッファを使用して共用表を更新する場合は,LOCK文を発行して更新してください。LOCK文を発行しない更新をしていて,サーバプロセスが異常終了すると,アボートコードPhb3008が出力されます(ユニットが異常終了することがあります)。
(4) 定義方法
定義系SQLのCREATE TABLEでSHAREを指定(CREATE SHARE FIX TABLEと指定)します。なお,共用表は次の条件を満たす必要があります。
-
共用表は非分割のFIX表である
-
共用表,及び共用インデクスを格納するRDエリアは共用RDエリア(pdfmkfsコマンドの-kオプションにSDBを指定)である
-
WITHOUT ROLLBACKオプションが指定されていない
-
参照制約が定義された参照表でない
(5) 制限事項
共用表を使用する場合の制限事項を次に示します。
-
IN EXCLUSIVE MODE指定のLOCK TABLE文実行中は共用表を検索できません。
-
共用表に対しては,ASSIGN LIST文でリストを作成できません。
-
レプリケーションの反映先に共用表は指定できません。
(6) HiRDB/シングルサーバで共用表を使用する場合の注意事項
-
HiRDB/シングルサーバでは共用RDエリアを定義できないため,共用表及び共用インデクスは,通常のユーザ用RDエリアに格納してください。このとき,共用表及び共用インデクスを格納するユーザ用RDエリアと,共用表ではない表及び共用インデクスではないインデクスを格納するユーザ用RDエリアは別にしてください。
-
HiRDB/シングルサーバからHiRDB/パラレルサーバに移行するとき,共用表及び共用インデクスが定義されている状態でデータベース構成変更ユティリティ(pdmod)を使用しないでください。移行手順については,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。
HiRDB/パラレルサーバの場合との相違の詳細は,マニュアル「HiRDB Version 9 システム導入・設計ガイド」を参照してください。