SELECT DISTINCT Table3.ID
FROM Table1
INNER JOIN Table2 ON Table1.thisID = Table2.thisID
INNER JOIN Table3 ON Table2.ID = Table3.ID
WHERE ( Table1.ID IN
(
<cfqueryparam cfsqltype="cf_sql_integer"
value="#idlist#" list="yes">
)
)
AND Table2.ID IN
(
<cfqueryparam cfsqltype="cf_sql_integer"
value="#idlist2#" list="yes">
)
AND Table3.active=1
ORDER BY Table3.ID
当我运行上面的代码时需要11到15秒。如果我删除了cfqueryparam,并且只使用idlist2
变量,则查询只需要32毫秒。
这是cfqueryparam的问题,还是我做错了什么?
答案 0 :(得分:2)
IN
子句中的长列表,SQL性能会急剧下降。如果您可以减少列表的长度,那么您的查询性能可能会提高。
使用cfqueryparam
时,值将作为参数/参数/变量列表传递给SQL。如果不使用cfqueryparam
,则会将值列表硬编码到查询字符串中。这允许SQL&#34;查询执行计划&#34;为该特定值列表进行预优化。它还允许将计划从一个执行缓存到下一个执行。这可能导致后续相同的查询执行速度非常快,如在调试和测试期间。
如果这是一个动态查询,如果每次运行查询时值列表都会更改,那么您需要确保使用cfqueryparam
,以便SQL Server不会缓存执行计划每次一次性硬编码查询。
此外,cfqueryparam
为您提供了很多针对SQL Injection attacks的保护。从安全方面来说,我建议传递给查询的所有值应使用cfqueryparam
。
最后,尝试在SQL Server Management Studio中运行查询,然后单击Show Actual Execution Plan
按钮。它可以帮助您确定在表上添加一个或多个索引是否有助于执行时间
'Missing Index' feature of SQL Server Management Studio