問題が発生しました。ColdFusion 9 から SQL Server 2005 を呼び出しています。元のクエリを投稿することはできませんが、それは問題の焦点ではありません。問題の原因となっている関連する組み合わせを投稿しました。
something
列が主キーである、次のサンプル クエリのより複雑なバージョンのクエリがあります。値パラメーターは変更されていません。このクエリは、理解できない奇妙な理由により、実行に約 20 秒かかります....
<cfquery result="q" datasource="dsn">
SELECT something
FROM somewhere
WHERE something = <cfqueryparam cfsqltype="cf_sql_integer" value="#value#"/>
</cfquery>
上記のソース コードの最後の行を強調表示すると、cfqueryparam タグの後にスペースがあることに注意してください。
次のクエリは、ご自身の目でお分かりいただけると思いますが、完全に異なりますが、実行に 15 ミリ秒かかります。
<cfquery result="q" datasource="dsn">
SELECT something
FROM somewhere
WHERE something = <cfqueryparam cfsqltype="cf_sql_integer" value="#value#"/>
</cfquery>
cfqueryparam の後にスペースはありません。ただし、最後に 2 つのスペースを追加すると、15 ミリ秒になります。その後、最後の 1 つのスペースに戻ると、約 20 秒で結果が得られます。
Java と SQL Server の間の DB ドライバーのログを調べましたが、異常はないようです。ここで何が起こっているのでしょうか?
編集
SQL Server でプロファイリングを実行したところ、スペースが 1 つだけのクエリでは、0 または複数のスペースを含むものとは異なるキャッシュされた実行プランが使用されていることがわかりました。SQL Server は、クエリの実行プランをキャッシュします。また、完全なリテラル クエリを識別子として使用します。そのため、他のクエリを送信したときに、別の実行プランが使用されています。
さらに遠く
実行計画の 1 つは、サブ選択の 1 つで不適切なインデックスを検索しているように見えます。SQL Server がこの代替実行計画を決定した理由、またはインデックスの 1 つが間違っているように見える理由は明らかではありません。
ファローアップ
不適切な実行計画の原因に関心のある方のために、フォローアップの質問がここに投稿されました。