我发现以前的程序员在我们现有的项目中使用cfstoredproc关于将记录插入数据库。
就像他/她那样使用的例子:
<cfstoredproc procedure="myProc" datasource="myDsn">
<cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="ppshein" dbvarname="username">
<cfprocparam type="In" cfsqltype="CF_SQL_CHAR" value="28 yrs" dbvarname="age">
</cfstoredproc>
我无法说服为什么他/她使用上面的代码而不是:
<cfquery datasource="myDsn">
insert usertb
(name, age)
values
(<cfqueryparam cfsqltype="CF_SQL_CHAR" value="ppshein">, <cfqueryparam cfsqltype="CF_SQL_CHAR" value="28 yrs">)
</cfquery>
我觉得使用cfstoredproc和cfquery进行复杂的数据操作会有隐藏的性能。请让我知道在coldfusion中使用cfstoredproc而不是cfquery进行复杂数据操作的性能。我所知道的是可重用。
答案 0 :(得分:4)
CFSTOREDPROC应具有更好的性能,原因与存储过程在数据库级别具有更好性能的原因相同 - 创建时,存储过程由数据库在内部进行优化。
这是否明显取决于您的数据库和查询。在CFQUERY中使用CFQUERYPARAM(如在您的示例中)也可以加快执行速度(在数据库驱动程序级别)。
除非应用程序对性能非常敏感,否则我倾向于首先在分析器中运行我的SQL代码以对其进行优化,然后将其放入我的CFQUERY中使用CFQUERYPARAM标记进行参数化,而不是使用storedproc。这样,所有逻辑都在CF代码中。当然,这是一个品味问题,并且当应用程序成熟时,很容易将SQL移动到存储过程中。
答案 1 :(得分:3)
一些商店更喜欢让数据库控制所有数据逻辑,让CF几乎完全作为前端生成器。有些地方是如此控制,他们不会让你在你的CF代码中写任何SQL。
更新 :存储过程可能比简单的INSERT INTO更多。在另一个表中可能会有一些数据查找。可能有验证。可能存在条件逻辑。可能有多个事务正在进行,例如日志。无法执行插入可能会返回特定的状态代码而不是抛出错误。
老实说,这只是一种风格问题。有任何理由支持和反对,我发现它通常归结为谁拥有更多/更有能力的程序员:CF人员或数据库人员。
答案 2 :(得分:1)
基本上,如果使用存储过程,则存储过程将由数据库预先编译并存储执行计划。这意味着对存储过程的后续调用不会产生该开销。对于大型复杂查询,这可能很大。
因此,作为一条经验法则:查询是......
...非常适合转换为存储过程。
希望有所帮助!