只要有cfquery
,cfqueryparam
会成为预备语句吗?还是有其他条件?
ORDER BY
子句或FROM
子句是动态的,会发生什么?每个独特的组合都会成为准备好的声明吗?
当我们使用cfloop
进行INSERT
时,每个值都是cfqueryparam,并且调用不同迭代次数的cfquery会发生什么?
准备好的陈述过多的潜在问题?
DB如何处理准备好的声明?它们会被转换成类似于商店程序的东西吗?
在什么情况下我们不应该使用预备声明?
谢谢!
答案 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 )