使用cfqueryparam和MSSQL Server时CFQUERY超时?

时间:2012-07-10 21:31:32

标签: sql-server coldfusion cfquery cfqueryparam

我正在执行一个返回大约16000行的查询。在MS SQL Server Manager中运行直接SQL会在几秒钟内返回记录。在 cfquery 中运行相同的SQL会在大约相同的时间内返回它。查询由一些来自函数参数的变量组成。让 cfquery 评估变量也会快速返回查询。

为什么当我为变量添加 cfqueryparam 时,它们只有6个,查询运行超过一个小时然后超时。 cfsqltype是* cf_sql_integer *和* cf_sql_timestamp *。一旦我删除它们,它就完成了并且正在工作。

2 个答案:

答案 0 :(得分:2)

一般来说,使用cfqueryparam,cfqueryparam应该做得更好 - 而不是更糟 - 因为它应该会带来更好的缓存命中率。但是,如果它没有达到缓存,它将创建一个新计划 - 结果将是稍微较慢的查询 - 而不是超时。所以我猜你实际上正在从缓存中获取执行计划,而它只是没有像宣传的那样工作。

作为测试尝试将cf_sql_timestamp的“TYPE”更改为cf_sql_char - 这将强制隐式转换和不同的计划,但保持cfqueryparam混合。如果它工作正常,你得到一个合理的结果,那么你需要清除你的查询缓存(我在db服务器上)或重新编译你的计划(重新编译)等。

答案 1 :(得分:0)

我认为马克正走在正确的轨道上。

我的猜测是你在SQL Server上遇到类型转换。这可能导致性能非常差,因为SQL无法使用索引并且每行都会执行转换。

确认这一点的最佳方法是在SQL Server上运行跟踪,以确切了解正在执行的查询。您还可以检查列类型并确保它们与正确的数据类型对齐: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p-q_18.html