6

問題が発生しました。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 つが間違っているように見える理由は明らかではありません。

ファローアップ

不適切な実行計画の原因に関心のある方のために、フォローアップの質問がここに投稿されました。

4

1 に答える 1

4

これはおそらく、先日Railo フォーラムで発生した何かの症状です(奇妙な偶然)。

遅いバージョンのクエリが最初に実行されたときに使用されたパラメーター値の性質により、その特定の値には「便利な」実行計画が作成された可能性がありますが、より一般的な後続の値では、計画は理想。逆に、2 番目のクエリが最初に実行されたとき、パラメーターとして渡された値は、クエリがどのように呼び出されるかにより典型的であったため、実行プランは他のほとんどの値により適しています。

私は個人的にこれが起こるのを見たことはありませんが、十分に読んだことがあります。そして、それはあなたが見ているもののように聞こえます。

可能であれば、SQL Server キャッシュを明確にしてこれをテストし、「不適切な」プランがコンパイルされる原因となった値を使用してクエリを再実行すると、同様の動作が見られるはずです。

これは解決策ではありませんが、それが原因である可能性があることを示し、さまざまな値の計画の不一致の根本的な原因に対処できるようにします。

この実験は明らかに、クエリが最初に呼び出されたときの param 値を知ることに基づいています。つまり、それらを知っていれば幸運です。

于 2013-01-09T23:11:32.457 に答える