SQLプール機能では,同じSQLが実行されたときに,保存していた前処理結果を再利用します。そのため,SQLプール機能を効果的に使うには,同じSQLと判定されるようにSQLをコーディングすることがポイントになります。同じSQLを実行する回数が多いほど,SQLの前処理を省略できる回数が多くなり,SQLプール機能の効果が出ます。
ここでは,XDBが行うSQLの判定処理とSQLのコーディングのポイントについて説明します。
SQLを受け付けたときに,そのSQLが以前実行されたSQLと同じかどうかをXDBが判定します。XDBは,SQLのテキストを比較してSQLが同じかどうかを判定しています。SQLの構文が同じで,テキストの長さ,空白の位置や数などがすべて一致した場合に同じSQLと判定し,SQLプールに保存されている前処理結果を再利用します。
同じSQLと判定されるケースと,異なるSQLと判定されるケースの例を示します。なお,例題中の△は一つの空白を意味しています。
SELECT△*△FROM△"T1"
SELECT△*△FROM△"T1"
SELECT△*△FROM△"T1"
SELECT△△*△FROM△"T1"
SQLのテキストの中には比較対象外となる部分があります。比較対象外の部分をうまく利用して,同じSQLと判定されるようにSQLをコーディングしてください。SQLのテキストのうち,比較対象外となる部分を次の表に示します。
表4-1 SQLのテキストのうち比較対象外となる部分
項番 | SQL文の種類 | 比較対象外となる部分 |
---|---|---|
1 | SQL全般 | 埋め込み変数,標識変数 |
2 | DECLARE CURSOR | DECLARE カーソル名 CURSOR FOR |
3 | 1行SELECT文 | INTO :埋め込み変数 [:標識変数] [,:埋め込み変数 [:標識変数]]… |
同じSQLと判定されるケースと,異なるSQLと判定されるケースの例を次に示します。
カーソル名が異なっていても同じSQLと判定されます。例を次に示します。
DECLARE△CR1△CURSOR△FOR△SELECT△*△FROM△"T1"
DECLARE△CR2△CURSOR△FOR△SELECT△*△FROM△"T1"
探索条件に定数を指定し,その定数がSQLによって異なる場合は,異なるSQLと判定されます。この場合,探索条件に埋め込み変数を使用すると,同じSQLと判定されます。例を次に示します。
SELECT * FROM "T1" WHERE "C1"=1
SELECT * FROM "T1" WHERE "C1"=2
X1=1;
SELECT * FROM "T1" WHERE "C1"=:X1
X2=2;
SELECT * FROM "T1" WHERE "C1"=:X2
SQLプール機能の効果が期待できないケースを次に示します。