sql-server – 奇怪的Coldfusion cfqueryparam

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的问题,还是我做错了什么?

最佳答案 使用IN子句中的长列表,SQL性能会急剧下降.如果您可以减少列表的长度,您的查询性能可能会提高.

使用cfqueryparam时,值将作为参数/参数/变量列表传递给SQL.如果不使用cfqueryparam,则会将值列表硬编码到查询字符串中.这允许SQL的“查询执行计划”针对该特定值列表进行预优化.它还允许将计划从一个执行缓存到下一个执行.这可能导致后续相同的查询执行速度非常快,如在调试和测试期间.

如果这是一个动态查询,如果每次运行查询时值列表都会更改,那么您需要确保使用cfqueryparam,以便SQL Server不会为每个一次性硬编码查询缓存执行计划.

此外,cfqueryparam为您提供了很多针对SQL Injection attacks的保护.从安全方面来说,我建议传递给查询的所有值都应该使用cfqueryparam.

最后,尝试在SQL Server Management Studio中运行查询,然后单击“显示实际执行计划”按钮.它可以帮助您确定在表上添加一个或多个索引是否有助于执行时间.
‘Missing Index’ feature of SQL Server Management Studio

点赞