外部表へのアクセス性能に関連する機能について説明します。
外部表へのアクセス性能に関連する機能および設定を,次の表に示します。
表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の実表のときと同じです。
|
外部インデクス | 設定によって,外部表に対するインデクスが存在しているように扱うことができます。外部インデクスを定義することにより,分散ネストループジョインを利用できるようになります。 外部インデクスは,CREATE FOREIGN INDEXで定義します。CREATE FOREIGN INDEXについては,マニュアル「HiRDB Version 8 SQLリファレンス」を参照してください。 |
外部サーバへの配列FETCH | 外部サーバから問合せの中間結果が転送されるとき,複数の行を一括して転送できます。 |
最適化情報パラメタファイル | 外部表に対する最適化情報パラメタファイルを設定できます。 最適化情報パラメタファイルについては,マニュアル「HiRDB Version 8 コマンドリファレンス」を参照してください。 |
外部サーバ実行とは,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最適化情報定義で行います。
外部サーバ実行は,問合せの論理的な意味に基づいて分離した処理ごとに行うことができます。問合せを分離できるのは次の単位です。
外部サーバ実行を行うためには,次の条件が満たされている必要があります。
SELECT * FROM T1, T2 WHERE T1.C1=T2.C1;
SELECT * FROM T1, T2 WHERE T1.C1=T2.C2 AND LENGTH(T2.C1)<10;
表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:{=,<>,<,<=,>,>=}
HiRDBでは,そのままの記述では外部サーバ実行の条件を満たさない条件項を,実行条件を満たす同じ意味の条件項に一部の範囲で書き換える機能を提供しています。これを,探索高速化条件の導出機能といいます。
しかし,探索高速化条件の導出機能を使用しない場合,またはアクセスパスを確認したときに条件を満たすように書き換えられていない条件項がある場合,次に示す例のようにSQLを書き換えると,外部サーバ実行が促進され性能向上に役に立ちます。
SELECT * FROM T1, T2
WHERE T1.C1=T2.C1 AND ((T1.C2=10 AND T2.C2=20) OR T2.C2=30);
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);
SELECT * FROM T1, T2, T3
WHERE T1.C1=T2.C1 AND T1.C1=T3.C1;
SELECT * FROM T1, T2, T3
WHERE T1.C1=T2.C1 AND T2.C1=T3.C1;
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;
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;
分散ネストループジョインとは,外表と外部サーバ上に存在する内表とをネストループ方式で結合処理する機能です。分散ネストループジョインは,外表からの中間結果をパラメタとするSQL文を,内表を持つ外部サーバに対して繰り返し発行します。そのため,外表から取り出される中間結果のデータが小さく,外表の行によって内表の行が大きく絞り込まれる場合は,処理を速くできます。一方,外表の中間結果のデータが大きい場合は,内表を持つ外部サーバへのSQL文の発行回数が多くなり,性能が悪くなります。
分散ネストループジョインは,結合条件の評価に利用できるインデクスが内表側(外部サーバ)にある場合,特に処理を速くできます。このため,外部サーバに結合条件の評価に利用できるインデクスを用意するとともに,外部インデクスを定義するCREATE FOREIGN INDEX文を用いてHiRDBに外部サーバのインデクスの存在を知らせることが,分散ネストループジョインを行う条件となります。外部サーバにインデクスがない場合は,外部インデクスを定義することで条件を満たすことができます。
次に,外部インデクスの定義方法について説明します。
分散ネストループジョインを実行するには,次のことに注意して外部インデクスを定義します。
SELECT * FROM T1, T2 WHERE T1.C1 = 10 AND T1.C2 = T2.C2;
CREATE FOREIGN INDEX IX1 ON T2 (C2);
CREATE FOREIGN INDEX IX2 ON T2(C2, C3, C4);
CREATE FOREIGN INDEX IX3 ON T2(C4, C2, C3);
分散ネストループジョインの使用・不使用を制御する方法としては,次のものがあります。
外部サーバに対する配列FETCHとは,外部サーバから問合せの中間結果が転送されるとき,複数の行を一括して転送する機能のことです。この機能は,外部サーバとして使用しているDBMSが持っている通信を高速にする機能をHiRDBが利用することで実現するため,外部サーバによってはこの機能を利用できません。
外部サーバに対する配列FETCHに関する設定は,外部サーバ情報定義で行います。一括してFETCHする行数を大きく設定すると,一度に転送する行数が増加するため通信回数を少なくすることができます。
最適化情報パラメタファイルでは,外部表に対する最適化情報パラメタファイルを設定できます。HiRDB External Data Access機能を使用する場合,HiRDBでは外部表の行数を10,000,000行と仮定して最適化を行っています。したがって,外部サーバに存在する表の行数の合計が10,000,000行と大きく異なる場合,最適化情報パラメタファイルの行数を設定し,最適化情報収集ユティリティ(pdgetcstコマンド)を実行することで性能が向上する可能性があります。