我正在执行一个返回大约 16000 行的查询。在 MS SQL Server Manager 中运行直接 SQL 会在几秒钟内返回记录。在cfquery中运行相同的 SQL会在大约相同的时间返回它。查询由来自函数参数的一些变量组成。让cfquery评估变量也可以快速返回查询。
为什么当我为变量添加cfqueryparam时,只有6个,查询运行了一个多小时然后超时。cfsql 类型是 *cf_sql_integer* 和 *cf_sql_timestamp*。一旦我删除它们,它就完成并工作了。
我正在执行一个返回大约 16000 行的查询。在 MS SQL Server Manager 中运行直接 SQL 会在几秒钟内返回记录。在cfquery中运行相同的 SQL会在大约相同的时间返回它。查询由来自函数参数的一些变量组成。让cfquery评估变量也可以快速返回查询。
为什么当我为变量添加cfqueryparam时,只有6个,查询运行了一个多小时然后超时。cfsql 类型是 *cf_sql_integer* 和 *cf_sql_timestamp*。一旦我删除它们,它就完成并工作了。
通常 cfqueryparam 使用 cfqueryparam 应该做得更好 - 而不是更糟 - 因为它应该会导致更好的缓存命中。但是,如果它没有命中缓存,它将创建一个新计划——结果将是一个稍慢的查询——而不是超时。所以我猜你实际上是从缓存中得到一个执行计划,它只是没有像宣传的那样工作。
作为测试,尝试将 cf_sql_timestamp 的“类型”更改为 cf_sql_char - 这将强制进行隐式转换和不同的计划,但将 cfqueryparam 混合在一起。如果它有效并且您获得了合理的结果,那么您需要清除查询缓存(我的意思是在数据库服务器上)或重新编译您的计划(重新编译)等。
我认为马克走在正确的轨道上。
我的猜测是您在 SQL Server 上遇到了类型转换。这可能导致性能非常糟糕,因为 SQL 将无法使用索引并且转换是在每一行上执行的。
确认这一点的最佳方法是在 SQL Server 上运行跟踪,以准确查看正在执行的查询。您还可以检查列类型并确保它们与正确的数据类型对齐: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=Tags_p- q_18.html