4

約16000行を返すクエリを実行しています。MS SQL Server ManagerでストレートSQLを実行すると、数秒でレコードが返されます。cfqueryで同じSQLを実行すると、ほぼ同時にそれが返されます。クエリは、関数の引数からのいくつかの変数で構成されています。cfqueryに変数を評価させると、クエリも高速に返されます

変数にcfqueryparamを追加し、変数が6つしかない場合、クエリが1時間以上実行されてから、タイムアウトになるのはなぜですか。cfsqltypeは、*cf_sql_integer*および*cf_sql_timestamp*です。それらを削除するとすぐに、それは完了し、機能しています。

4

2 に答える 2

2

通常、cfqueryparam は cfqueryparam よりも優れたパフォーマンスを発揮するはずです (悪化するのではなく)。ただし、キャッシュにヒットしていない場合は、新しいプランが作成されます。その結果、タイムアウトではなく、クエリが少し遅くなります。したがって、実際にはキャッシュから実行計画を取得していると思いますが、宣伝どおりに機能していません。

テストとして、cf_sql_timestamp の「TYPE」を cf_sql_char に変更してみてください。これにより、暗黙的な変換と別の計画が強制されますが、cfqueryparam は混在したままになります。それが機能し、妥当な結果が得られた場合は、クエリキャッシュをクリアする (つまり、db サーバー上で) か、プランを再コンパイルする (再コンパイルして) ​​などを行う必要があります。

于 2012-07-10T23:16:57.637 に答える
0

マークは正しい軌道に乗っていると思います。

私の推測では、SQL Server で型変換を実行していると思われます。これは、SQL がインデックスを使用できず、すべての行に対して変換が実行されるため、パフォーマンスが非常に悪くなる可能性があります。

これを確認する最善の方法は、SQL Server でトレースを実行して、実行されているクエリを正確に確認することです。列の型をチェックして、適切なデータ型に配置されていることを確認することもできます: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_18.html

于 2012-07-11T14:12:44.533 に答える