【SQL】SELECT文でバインド変数を使って検索する方法


ここでは、ORACLE SQLでバインド変素を使って検索する方法を紹介します。

SELECT文のサンプルは↓で多数紹介していますので参考にしてください。
>>【SQL】SELECT文の書き方:サンプル多数あり

SELECT文でバインド変数を使って検索する方法

バインド変数とは、SQLを実行するときなどに、動的にパラメータを渡せます。

バインド変数を使うことで、条件値の違う同じSQLについては実行速度を向上させることが出来ます。

バインド変数を使っていないSQLの例

次のSQLでは、where句の抽出条件にcol1を指定しています。

100,200,300という文字リテラルを使って、抽出条件を変えて実行していきます。

select a.* from table 1 where a.col1 = '100';
select a.* from table 1 where a.col1 = '200';
select a.* from table 1 where a.col1 = '300';

この3つのSQLは、条件に指定した値以外は全く同じSQLですが、オプティマイザによって、全く別のSQLとして実行されます。

このように文字リテラルを使うと、100,200,300を指定した3つのSQLは、そのため、実行の都度、ハードパースが発生し、性能を悪化させる要因となります。

バインド変数を使った場合のSQLの例

先ほどのSQLにバインド変数を使ってみます。

バインド変数を使うことで3種類だったSQLを、1種類のSQLに出来ます。


この1種類のSQLに対して、実行の都度、プログラムからパラメータの値として、100,200,300を渡します。

select a.* from table 1 where a.col1 = :cond;

上記の例の場合、SQLの実行回数は3回になりますが、ハードパースの発生を抑制することで性能の向上を狙うことが出来ます。

特に実行回数の多いSQLでは、如実にパフォーマンスに差が出てくるので、ぜひバインド変数を使うことをオススメします

最後に

バインド変数を使うことで、複数の種類のSQLを1つのSQLとして、ORACLEオプティマイザに認識させることが出来ます。

これにより、無駄なハードパースを抑制し、性能悪化を防ぐことが出来ます。

もちろん、汎用的なSQLにすることが出来るので、複数のアプリやシステムで利用することが出来るといったメリットもあります。

この他にもSELECT文には様々な機能や使い方があります。
詳しくは「【SQL】SELECT文の書き方:サンプル多数あり」で解説していますのでぜひ参考にしてください。