同じSQLを実行する回数が多いほど,SQLプール機能によってSQLの前処理が省略できる回数が多くなるため,性能が向上します。
SQLプール機能については,マニュアル「TP1/EE/Extended Data Cache 使用の手引」を参照してください。
SQLを受け付けたときに,そのSQLが以前実行されたSQLと同じかどうかをXDBが比較します。比較した結果,SQLのテキストが一致した場合,同じSQLと判定し,SQLプールに保存されている前処理結果を再利用します。
XDBは,SQLのテキストを比較してSQLが同じかどうかを判定しています。SQLの構文が同じで,テキストの長さ,空白の位置や数などがすべて一致した場合に同じSQLと判定しています。
同じSQLと判定されるケースと,異なるSQLと判定されるケースの例を示します。なお,例題中の△は一つの空白を意味しています。
SELECT△*△FROM△"T1"
SELECT△*△FROM△"T1"
SELECT△*△FROM△"T1"
SELECT△△*△FROM△"T1"
XDBがSQLを比較する際,SQLのテキストの一部は比較対象とされません。比較対象されない部分をうまく利用して,同じSQLと判定されるようにSQLをコーディングすることをお勧めします。SQLのテキストの比較対象外部分を次の表に示します。
表6-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