4.1.2 SQLプール機能を効果的に使うには

SQLプール機能では,同じSQLが実行されたときに,保存していた前処理結果を再利用します。そのため,SQLプール機能を効果的に使うには,同じSQLと判定されるようにSQLをコーディングすることがポイントになります。同じSQLを実行する回数が多いほど,SQLの前処理を省略できる回数が多くなり,SQLプール機能の効果が出ます。

ここでは,XDBが行うSQLの判定処理とSQLのコーディングのポイントについて説明します。

<この項の構成>
(1) XDBが行うSQLの判定処理
(2) SQLのコーディングのポイント
(3) SQLプール機能の効果が期待できないケース

(1) XDBが行うSQL判定処理

SQLを受け付けたときに,そのSQLが以前実行されたSQLと同じかどうかをXDBが判定します。XDBは,SQLのテキストを比較してSQLが同じかどうかを判定しています。SQLの構文が同じで,テキストの長さ,空白の位置や数などがすべて一致した場合に同じSQLと判定し,SQLプールに保存されている前処理結果を再利用します。

同じSQLと判定されるケースと,異なるSQLと判定されるケースの例を示します。なお,例題中の△は一つの空白を意味しています。

(例1)同じSQLと判定されるケース

SELECT△*△FROM△"T1"
SELECT△*△FROM△"T1"

(例2)異なるSQLと判定されるケース

SELECT△*△FROM△"T1"
SELECT△△*△FROM△"T1"

空白の数が異なるため,異なるSQLと判定されます。

(2) SQLのコーディングのポイント

SQLのテキストの中には比較対象外となる部分があります。比較対象外の部分をうまく利用して,同じSQLと判定されるようにSQLをコーディングしてください。SQLのテキストのうち,比較対象外となる部分を次の表に示します。

表4-1 SQLのテキストのうち比較対象外となる部分

項番SQL文の種類比較対象外となる部分
1SQL全般埋め込み変数,標識変数
2DECLARE CURSORDECLARE カーソル名 CURSOR FOR
31行SELECT文INTO :埋め込み変数 [:標識変数] [,:埋め込み変数 [:標識変数]]…

同じSQLと判定されるケースと,異なるSQLと判定されるケースの例を次に示します。

(a) カーソル名が異なる場合の例

カーソル名が異なっていても同じSQLと判定されます。例を次に示します。

(例)同じSQLと判定されるケース

DECLARE△CR1△CURSOR△FOR△SELECT△*△FROM△"T1"
DECLARE△CR2△CURSOR△FOR△SELECT△*△FROM△"T1"

△は一つの空白を意味しています。
(b) 探索条件に埋め込み変数を指定する場合の例

探索条件に定数を指定し,その定数がSQLによって異なる場合は,異なるSQLと判定されます。この場合,探索条件に埋め込み変数を使用すると,同じSQLと判定されます。例を次に示します。

(例1)異なるSQLと判定されるケース

SELECT * FROM "T1" WHERE "C1"=1
SELECT * FROM "T1" WHERE "C1"=2

この場合,SQLのテキストが異なるため,異なるSQLと判定され,SQLプール機能が適用されません。
(例2)同じSQLと判定されるケース

X1=1;
SELECT * FROM "T1" WHERE "C1"=:X1
X2=2;
SELECT * FROM "T1" WHERE "C1"=:X2

埋め込み変数は比較対象外のため,同じSQLと判定され,SQLプール機能が適用されます。

(3) SQLプール機能の効果が期待できないケース

SQLプール機能の効果が期待できないケースを次に示します。