6.1.2 同じSQLを記述する

同じSQLを実行する回数が多いほど,SQLプール機能によってSQLの前処理が省略できる回数が多くなるため,性能が向上します。

SQLプール機能については,マニュアル「TP1/EE/Extended Data Cache 使用の手引」を参照してください。

<この項の構成>
(1) XDBが行うSQLの比較判定処理
(2) SQLのコーディングポイント

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

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

XDBは,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のコーディングポイント

XDBがSQLを比較する際,SQLのテキストの一部は比較対象とされません。比較対象されない部分をうまく利用して,同じSQLと判定されるようにSQLをコーディングすることをお勧めします。SQLのテキストの比較対象外部分を次の表に示します。

表6-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プール機能が適用されます。