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