12.22.3 格納先RDエリアの決定規則
一時表用RDエリアが複数ある場合や,クライアント環境定義PDTMPTBLRDAREAの指定を省略している場合,HiRDBが,データを格納する一時表用RDエリアを決定します。HiRDBは,次の順序で格納先RDエリアを決定します。
- 〈この項の構成〉
(1) 格納先バックエンドサーバの決定(HiRDB/パラレルサーバの場合だけ)
HiRDB/パラレルサーバの場合,まず,データを格納するバックエンドサーバを決定します。このとき,次の規則で格納先候補バックエンドサーバを絞り,その中から,INSERT文で指定した実表の中で一時表以外の実表にアクセスするバックエンドサーバを優先して使用します。
-
クライアント環境定義PDTMPTBLRDAREAにRDエリアを指定している場合
指定したRDエリアがあるバックエンドサーバを格納先候補とします。
指定したRDエリアに特定SQLセッション占有属性とSQLセッション間共有属性の一時表用RDエリアが混在しているときは,特定SQLセッション占有属性の一時表用RDエリアがあるバックエンドサーバを優先して使用します。
-
クライアント環境定義PDTMPTBLRDAREAにRDエリアを指定していない場合
SQLセッション間共有属性の一時表用RDエリアがあるバックエンドサーバを格納先候補とします。
- ポイント
-
HiRDBが格納先バックエンドサーバを決定するとき,INSERT文で指定した実表の中で,一時表以外の実表にアクセスするバックエンドサーバを優先するため,(例)のようにINSERT SELECTを使用すると,バックエンドサーバ間のデータ転送を回避できます。
- (例) INSERT INTO TMP1 SELECT C1,C2,C3 FROM T1
-
一時表TMP1に,表T1から列C1,C2,及びC3を挿入するSQLです。
このSQLを実行する場合の構成を次の図に示します。PDTMPTBLRDAREAには,RDTMP1とRDTMP2を指定しています。
このとき,HiRDBは,表T1があるBES1を格納先バックエンドサーバに決定します。これによって,BES1とBES2間でデータ転送することなく,SQLを実行できます。
(2) 格納先候補RDエリアの決定
クライアント環境定義PDTMPTBLRDAREAの指定によって,格納先候補のRDエリアを決定します。PDTMPTBLRDAREAの指定については,「データを格納する一時表用RDエリアを指定する場合」を参照してください。
(3) 条件に合致するRDエリアの決定
格納先候補RDエリアから,次に示すすべての条件に合致するRDエリアを決定します。
-
一時表の操作に関する排他を取得できる状態である。
一時表の排他については,「一時表の排他制御」を参照してください。
-
UAPがアクセスできる状態である。
-
格納する一時表がFIX表の場合,一時表の行長がRDエリアに格納できるサイズを超えていない。
詳細は,マニュアル「HiRDB SQLリファレンス」の「CREATE TABLE」のFIXオペランドの規則3.を参照してください。
-
格納する一時インデクスを構成する列の長さの合計が,RDエリアに格納できるサイズを超えていない。
詳細は,マニュアル「HiRDB SQLリファレンス」の「CREATE INDEX」の共通規則5.を参照してください。
-
RDエリア内の一時表の利用回数が500未満である。
-
RDエリア内の一時インデクスの利用回数が500未満である。
-
未使用セグメントが存在する。
-
一時表及び一時インデクス数がpd_max_temporary_object_noオペランドの指定値を超えていない。
-
pd_tmp_table_initialize_timingオペランドにACCESSを指定している場合,初期化されていない一時表用RDエリアである。
一時表用RDエリアの初期化については,「一時表用RDエリアの初期化」を参照してください。
(4) 格納先一時表用RDエリアの決定
条件に合致したRDエリアから,次の一時表用RDエリアを優先して使用します。
-
最も多く未使用セグメントが存在する一時表用RDエリア
-
pd_tmp_table_initialize_timingオペランドにACCESSを指定している場合,初期化されていない一時表用RDエリア
一時表用RDエリアの初期化については,「一時表用RDエリアの初期化」を参照してください。