使用cfqueryparam创建预准备语句的条件?

时间:2011-08-03 22:26:43

标签: sql-server jdbc coldfusion prepared-statement

只要有cfquerycfqueryparam会成为预备语句吗?还是有其他条件?

ORDER BY子句或FROM子句是动态的,会发生什么?每个独特的组合都会成为准备好的声明吗?

当我们使用cfloop进行INSERT时,每个值都是cfqueryparam,并且调用不同迭代次数的cfquery会发生什么?

准备好的陈述过多的潜在问题?

DB如何处理准备好的声明?它们会被转换成类似于商店程序的东西吗?

在什么情况下我们不应该使用预备声明?

谢谢!

2 个答案:

答案 0 :(得分:5)

我可以回答你问题的某些部分:

只要有<queryparam个查询,查询就会成为prepareStatement。我过去加了一个     where 1 = <cfqueryparam value="1"查询没有任何动态参数的查询,以便将它们作为preparedStatements运行

大多数数据库处理preparedStarements与存储过程类似,只是暂时保留,而不是长期保存,但细节可能是特定于数据库的。

假设您正在使用ColdFusion提供的驱动程序,如果您打开DataSource设置的高级面板中的“日志活动”复选框,那么您将获得有关CF如何与数据库交互的非常详细的信息以及何时它正在创建一个新的preparedStatement,并在重新使用它们时。我建议你自己尝试一下,因为涉及很多因素(数据库设置,驱动程序,CF版本等)。如果您确实使用了数据库日志记录,请在运行测试代码之前重新启动CF,这样您就可以看到它创建预准备语句,否则您只会看到它按ID重用语句,而不会看到这些语句是什么。< / p>

答案 1 :(得分:2)

此外,如果您询问执行计划,那么涉及的内容多于PreparedStatement生成的数字。它是巨大的主题,并且非常依赖于数据库。我没有DBA对它的掌握,但我可以回答一些关于MS SQL的问题。

  

ORDER BY子句或FROM子句是动态的时候会发生什么?将   每一个独特的组合都成为准备好的陈述?

基本sql是不同的。因此,您将最终为每个唯一 ORDER BY子句分别执行计划。

  

当我们使用INSERT对每个值进行cfloop时会发生什么   cfqueryparam'ed,并调用不同数量的cfquery   迭代?

MS SQL应该为所有迭代重用相同的计划,因为只有参数会发生变化。

sys.dm_exec_cached_plans视图对于查看缓存的计划以及重复使用的频率非常有用。

SELECT  p.usecounts, p.cacheobjtype, p.objtype, t.text 
FROM    sys.dm_exec_cached_plans p
        CROSS APPLY sys.dm_exec_sql_text( p.plan_handle) t
ORDER BY p.usecounts DESC

要先清除缓存,请使用DBCC FLUSHPROCINDB。显然在生产服务器上使用它。

DECLARE @ID int
SET @ID = DB_ID(N'YourTestDatabaseName')
DBCC FLUSHPROCINDB( @ID )