2.3.2 外部表へのアクセスの性能設計に関連する機能

外部表へのアクセス性能に関連する機能について説明します。

<この項の構成>
(1) 機能一覧
(2) 外部サーバ実行
(3) 分散ネストループジョインの利用
(4) 外部サーバに対する配列FETCH
(5) 最適化情報パラメタファイル

(1) 機能一覧

外部表へのアクセス性能に関連する機能および設定を,次の表に示します。

表2-5 外部表へのアクセス性能に関連する機能および設定

機能説明
外部サーバ実行UAPから入力されたSQL文の処理の一部または全部を,外部サーバで実行する機能です。設定によってその動作の詳細を変更できます。
一つの外部サーバに存在する複数の表の結合処理,集計処理など,外部サーバで実行可能な処理を外部サーバで行うことで,外部サーバへのアクセスを含む問合せを高速に行うことができるようになります。
どのような処理を外部サーバで実行できるかについては,「(2)外部サーバ実行」を参照してください。
なお,この機能を使用するための設定については,Hub最適化情報定義およびSQL拡張最適化オプションで行います。SQL拡張最適化オプションについては「2.3.4(2) SQL拡張最適化オプション」を,それぞれの設定項目の詳細についてはマニュアル「HiRDB Version 8 システム定義」を参照してください。
一つの外部サーバに閉じる探索高速化条件の導出外部サーバ実行を行うためにSQLを自動的に書き換える機能です。探索高速化条件の導出に関する設定は, SQL拡張最適化オプションで行います。
探索高速化条件の動作については,マニュアル「HiRDB Version 8 UAP開発ガイド」を,SQL拡張最適化オプションについては,「2.3.4(2) SQL拡張最適化オプション」を参照してください。
外部表を含む結合処理外部表と外部表,または外部表とHiRDBに存在するデータを結合するための,次の処理を使用できます。ジョインの動作は,HiRDBの実表のときと同じです。
ネストループジョイン
外表の入力となる外部表のデータを外部サーバから取得して,HiRDBに存在する内表とネストループジョインを行います。
分散ネストループジョイン
外表と外部サーバ上に存在する内表とネストループジョインを行います。なお,外表の入力データは,外部表のデータでも,HiRDBのデータでもかまいません。
ハッシュジョイン
入力となる外部表のデータを外部サーバから取得して,ハッシュジョインを行います。
マージジョイン
入力となる外部表のデータを外部サーバから取得して,マージジョインを行います。
外部インデクス設定によって,外部表に対するインデクスが存在しているように扱うことができます。外部インデクスを定義することにより,分散ネストループジョインを利用できるようになります。
外部インデクスは,CREATE FOREIGN INDEXで定義します。CREATE FOREIGN INDEXについては,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
外部サーバへの配列FETCH外部サーバから問合せの中間結果が転送されるとき,複数の行を一括して転送できます。
最適化情報パラメタファイル外部表に対する最適化情報パラメタファイルを設定できます。
最適化情報パラメタファイルについては,マニュアル「HiRDB Version 8 コマンドリファレンス」を参照してください。

(2) 外部サーバ実行

外部サーバ実行とは,SQLで指定された処理の一部または全部を,外部サーバで実行することです。一つの外部サーバに存在する外部表へのアクセスを含む問合せでは,外部サーバで絞り込みを行い,HiRDBと外部サーバ間の中間結果のデータを小さくすることで,処理を速くできます。

例えば,外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1,C2)が,外部サーバYには表T2(C1,C2)と表T3(C1,C2)が存在するときに,次の問合せが発行されたとします。ここで,「表T1(C1,C2)」という記述は,表T1が列C1および列C2を持つこと示します。

SELECT * FROM T1, T2 WHERE T1.C1=10 AND T1.C2=T2.C2 ;

「T1.C1=10」は,外部サーバXにアクセスするだけで評価できる探索条件です。このような場合,この探索条件を外部サーバXに処理(外部サーバ実行)させて中間結果のデータを小さくすることができます。

以降,外部サーバ実行について説明します。なお,外部サーバ実行に関する設定は,Hub最適化情報定義で行います。

(a) 外部サーバ実行の可能な処理の単位

外部サーバ実行は,問合せの論理的な意味に基づいて分離した処理ごとに行うことができます。問合せを分離できるのは次の単位です。

注※
探索条件をいちばん外側のAND演算子で区切った条件項を意味します。例えば,「C1=10 AND (C2=20 OR C3=30)」という探索条件は,二つのAND条件項「C1=10」と「(C2=20 OR C3=30)」から構成されています。また,「(C1=10 AND C2=20) OR C3=30」という探索条件は,一つのAND条件項で構成されています(探索条件のいちばん外側にAND演算子がないためです)。
(b) 外部サーバ実行の条件

外部サーバ実行を行うためには,次の条件が満たされている必要があります。

  1. 外部サーバ実行対象のデータが一つの外部サーバに存在する
  2. 外部サーバ実行対象の処理が実行できるように,Hub最適化情報定義で定義されている
  3. 外部サーバ実行を行う場合と行わない場合で同じ結果が得られる

 

外部サーバ実行対象のデータが一つの外部サーバに存在する
外部サーバ実行の対象になっている処理で参照するデータは,すべて一つの外部サーバに存在している必要があります。
この条件が満たされない例を説明します。外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1,C2)が,外部サーバYには表T2(C1,C2)が存在するときに,次の問合せが発行されたとします。

SELECT * FROM T1, T2 WHERE T1.C1=T2.C1;

このとき,下線部は外部サーバXと外部サーバYへの参照を含んでいるため,一つの外部サーバで実行できません。

 

外部サーバ実行対象の処理が,Hub最適化情報定義で実行できるように定義されている
外部サーバ実行の対象になっている処理が,Hub最適化情報定義で実行できるように定義されている必要があります。
この条件が満たされない例を説明します。外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1,C2)が,外部サーバYには表T2(C1,C2)が存在するとします。このとき,外部サーバYでLENGTH関数を使用しないように設定している(pd_hub_opt_length=2)と,次の問合せの下線部は外部サーバ実行されません。

SELECT * FROM T1, T2 WHERE T1.C1=T2.C2 AND LENGTH(T2.C1)<10;

外部サーバ実行を行う場合と行わない場合で同じ結果が得られる
外部サーバ実行は,行っても行わなくても同じ結果が得られる場合にだけ実行されます。したがって,外部サーバに使用するDBMSによって動作が異なる処理の場合,実行できません。例えば,文字列データの比較の際は注意が必要です。文字列データの比較で考慮が必要な点を次に示します。
  • パディング比較パディングなし比較
    文字列比較の動作には,パディング比較とパディングなし比較とがあります。文字列比較でパディング比較を使用するかパディングなし比較を使用するかは,DBMSによって異なります。HiRDBで異なる比較が使用される場合は外部サーバ実行できません。外部サーバ実行による性能向上を考える場合は,SQLを修正することで比較動作の異なる列同士の比較を避けるかどうかを検討する必要があります。
    表2-6表2-7,および表2-8にHiRDB,ORACLE,およびDB2の文字列比較の動作を示します。動作で太字になっている部分がHiRDBと動作が異なる処理です。

 

表2-6 HiRDB Version 5.0以降の文字列比較の動作

比較処理動作
VARCHAR op VARCHARパディングなし比較
CHAR op VARCHAR または
VARCHAR op CHAR
パディング比較
CHAR op CHARパディング比較

(凡例)

   op:{=,<>,<,<=,>,>=}


 

表2-7 ORACLEの文字列比較の動作

比較処理動作
VARCHAR op VARCHARパディングなし比較
CHAR op VARCHAR または
VARCHAR op CHAR
パディングなし比較
CHAR op CHARパディング比較

(凡例)

   op:{=,<>,<,<=,>,>=}


 

表2-8 DB2の文字列比較の動作

比較処理動作
VARCHAR op VARCHARパディング比較
CHAR op VARCHAR または
VARCHAR op CHAR
パディング比較
CHAR op CHARパディング比較

(凡例)

   op:{=,<>,<,<=,>,>=}


(c) 外部サーバ実行を行うためのSQLの書き方

HiRDBでは,そのままの記述では外部サーバ実行の条件を満たさない条件項を,実行条件を満たす同じ意味の条件項に一部の範囲で書き換える機能を提供しています。これを,探索高速化条件の導出機能といいます。

しかし,探索高速化条件の導出機能を使用しない場合,またはアクセスパスを確認したときに条件を満たすように書き換えられていない条件項がある場合,次に示す例のようにSQLを書き換えると,外部サーバ実行が促進され性能向上に役に立ちます。

(例1)選択処理の外部サーバ実行
外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1,C2)が,外部サーバYには表T2(C1,C2)が存在するとします。このとき,下線部のAND条件項は,外部サーバXおよび外部サーバYを参照するため外部サーバ実行を行えません。

SELECT * FROM T1, T2
WHERE T1.C1=T2.C1 AND ((T1.C2=10 AND T2.C2=20) OR T2.C2=30);

しかし,この問合せを次のように書き換えると,下線部の条件項「(T2.C2=20 OR T2.C1=30)」は,外部サーバYで外部サーバ実行を行えるようになります。

SELECT * FROM T1, T2
WHERE T1.C1=T2.C1 AND (T1.C2=10 OR T2.C2=30) AND (T2.C2=20 OR T2.C2=30);

(例2)結合処理の外部サーバ実行
外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1)が,外部サーバYには表T2(C1)および表T3(C1)が存在するとします。このとき,下線部のAND条件項群は,外部サーバXおよび外部サーバYを参照するため外部サーバ実行を行えません。

SELECT * FROM T1, T2, T3
WHERE T1.C1=T2.C1 AND T1.C1=T3.C1;

しかし,この問合せを次のように書き換えると,下線部の条件項「T2.C1=T3.C1」は,外部サーバYで外部サーバ実行を行えるようになります。

SELECT * FROM T1, T2, T3
WHERE T1.C1=T2.C1 AND T2.C1=T3.C1;

(例3)一つの外部サーバだけを参照する結合表
外部サーバXと外部サーバYがあり,外部サーバXには表T1(C1,C2)が,外部サーバYには表T2(C1,C2)および表T3(C1,C2)が存在するとします。このとき,連続するLEFT OUTER JOINが複数の外部サーバのデータを参照しているため外部サーバ実行を行えません。

SELECT T2.C1, T2.C2
FROM T2 LEFT OUTER JOIN T1 ON T2.C1=T1.C1
        LEFT OUTER JOIN T3 ON T2.C2=T3.C2;

しかし,この問合せを次のように書き換えると,結合表「T2 LEFT OUTER JOIN T3 ON T2.C2=T3.C2」は,外部サーバYで外部サーバ実行を行えるようになります。

SELECT T2.C1, T2.C2
FROM T2 LEFT OUTER JOIN T3 ON T2.C2=T3.C2
        LEFT OUTER JOIN T1 ON T2.C1=T1.C1;

(3) 分散ネストループジョインの利用

分散ネストループジョインとは,外表と外部サーバ上に存在する内表とをネストループ方式で結合処理する機能です。分散ネストループジョインは,外表からの中間結果をパラメタとするSQL文を,内表を持つ外部サーバに対して繰り返し発行します。そのため,外表から取り出される中間結果のデータが小さく,外表の行によって内表の行が大きく絞り込まれる場合は,処理を速くできます。一方,外表の中間結果のデータが大きい場合は,内表を持つ外部サーバへのSQL文の発行回数が多くなり,性能が悪くなります。

(a) 分散ネストループジョインを行う条件

分散ネストループジョインは,結合条件の評価に利用できるインデクスが内表側(外部サーバ)にある場合,特に処理を速くできます。このため,外部サーバに結合条件の評価に利用できるインデクスを用意するとともに,外部インデクスを定義するCREATE FOREIGN INDEX文を用いてHiRDBに外部サーバのインデクスの存在を知らせることが,分散ネストループジョインを行う条件となります。外部サーバにインデクスがない場合は,外部インデクスを定義することで条件を満たすことができます。

次に,外部インデクスの定義方法について説明します。

外部インデクスの定義方法

分散ネストループジョインを実行するには,次のことに注意して外部インデクスを定義します。

  1. 内表側に外部インデクスを定義する
  2. 結合条件の評価に利用できる外部インデクスを定義する
内表側に外部インデクスを定義する
例えば,外部サーバXと外部サーバYがあり,外部サーバXには外表となる表T1(C1,C2)が,外部サーバYには内表となる表T2(C1,C2)が存在するときに,次の問合せが発行されたとします。

SELECT * FROM T1, T2 WHERE T1.C1 = 10 AND T1.C2 = T2.C2;

このような問合せで,下線部分を分散ネストループジョインで実行するためには,次のように内表側の外部インデクスを定義します。なお,外部インデクスを定義する場合,対応する外部インデクスの実体を用意しておくことをお勧めします。

CREATE FOREIGN INDEX IX1 ON T2 (C2);

結合条件の評価に利用できる外部インデクスを定義する
外部インデクスは,結合条件の評価に利用できる必要があります。例えば,「T1.C2 = T2.C2」の結合条件を評価するには,T2.C2を先頭に持つ外部インデクスを定義します。すなわち,

CREATE FOREIGN INDEX IX2 ON T2(C2, C3, C4);
CREATE FOREIGN INDEX IX3 ON T2(C4, C2, C3);

のような外部インデクスが存在する場合,IX2は「T1.C2 = T2.C2」の評価に利用できますが,IX3は利用できません。
(b) 分散ネストループジョインの使用に関する制御

分散ネストループジョインの使用・不使用を制御する方法としては,次のものがあります。

  1. 外部インデクス定義
    外部インデクス定義の詳細については,「2.3.2(3) 分散ネストループジョインの利用」,またはマニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。
  2. 最適化情報の設定
    最適化情報の設定については,「2.3.4(1)最適化情報パラメタファイル」を参照してください。
  3. SQL最適化指定
    SQL最適化指定の詳細については,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。

(4) 外部サーバに対する配列FETCH

外部サーバに対する配列FETCHとは,外部サーバから問合せの中間結果が転送されるとき,複数の行を一括して転送する機能のことです。この機能は,外部サーバとして使用しているDBMSが持っている通信を高速にする機能をHiRDBが利用することで実現するため,外部サーバによってはこの機能を利用できません。

外部サーバに対する配列FETCHに関する設定は,外部サーバ情報定義で行います。一括してFETCHする行数を大きく設定すると,一度に転送する行数が増加するため通信回数を少なくすることができます。

注意
配列FETCHでは,複数のSQLの結果を一括して転送することはできません。したがって,データ量が少ない,多数の中間結果の通信には有効ではありません。例えば,分散ネストループジョインによる結合処理の結果取得での外部サーバに対する配列FETCHでは,外表からの中間結果は通常どおり配列FETCHが効果を発揮しますが,内表からの中間結果は,外表の各行に対応する中間結果の単位でだけ配列FETCHが効果を発揮します。

(5) 最適化情報パラメタファイル

最適化情報パラメタファイルでは,外部表に対する最適化情報パラメタファイルを設定できます。HiRDB External Data Access機能を使用する場合,HiRDBでは外部表の行数を10,000,000行と仮定して最適化を行っています。したがって,外部サーバに存在する表の行数の合計が10,000,000行と大きく異なる場合,最適化情報パラメタファイルの行数を設定し,最適化情報収集ユティリティ(pdgetcstコマンド)を実行することで性能が向上する可能性があります。

注意
最適化情報パラメタファイルの設定は,最適化情報を設定した表を使用するすべての問合せに影響します。したがって,最適化情報パラメタファイルの設定後は,システム全体の性能を検証してください。