質問: SELECT文のWHERE句の条件でインデックスが張られているカラムに対して、LIKEを用いた場合、前方一致であればインデックスは有効になる認識ですが、C#のプログラムでODP.NETを用いて、LIKEの条件をパラメータバインドにより前方一致指定した場合でもインデックスは有効でしょうか? 試してみればよいのですが、C#のプログラム上でSQL文を実行した際にインデックスが効いているかどうか確認する方法もわからないため、そちらも含めてご教示いただけると幸いです。
回答: パラメータを含むSQLを実行する場合もパラメータを含まないSQLを実行する場合も「パラメータが具体的にセットされた状態」で実行計画を作成するので、本質的にはどちらも変わりません。 実際に実行計画を取得すればインデックスが有効に作用しているか確認することができます。 * Oracle databaseであればSQLDeveloperを使って開発することが多いかと思います。 SQLDeveloperであれば、ツールバーに「実行計画の取得」ボタンがあると思いますので、実行したいSQLにキャレットを当てて実行計画の取得ボタンを押せば実行結果欄に実行計画の詳細が出力されます。 * A5:M2を使用されいている現場もあると思います。その場合も右クリックメニューより「SQLの実行計画」を選択すれば同様に実行計画を取得できます。 * その他のデータベースツールでも実行計画を取得する方法は何かしらあるかと思います。マニュアルで確認してください。 * いずれのツールも使用されていない場合は、CI(sql*plus)で実行計画を取得することも可能です。前出のツールほど簡単に実行できないので、以下の記事を参考に実行計画を取得してください。 EXPLAIN PLAN を使って実行計画を取得する | shift-the-oracle.com 注1: パラメータを記載しているSQLでは正しい実行計画を取得できない可能性があります。パラメータを具体的な値に書き直したSQLで実行計画を取得したほうが確実です(特に `LIKE` 句が絡むSQLであれば)。 注2: 実行ユーザーの権限によってはEXPLAINの実行ができない場合があります。SYSで実行するか、管理者にお願いして動的パフォーマンスビューを閲覧する権限をもらってください。前出のリンクに関連する情報が記載されていますのでご覧ください。