使用cfqueryparam与常量

5

我们在SQL查询中一贯地使用cfqueryparam

我的前任似乎有些过于热衷于将其与直接值一起使用,而不是变量。

不是吗?

record_is_deleted_bt = <cfqueryparam cfsqltype="cf_sql_bit" value="0">

过度了吗?我的意思是,这里没有SQL注入的机会,我不认为在这里使用绑定变量对于提高数据库性能有任何帮助。那么像这样做不是同样合理吗?

record_is_deleted_bt = 0

在这种情况下,使用cfqueryparam有什么优势,除了养成使用它的习惯外?有没有缺点?


1
我不知道其中任何一项。我曾经是那些过于热衷的人之一,直到我的一个同事告诉我要聪明点。 - Dan Bracuk
1个回答

4
不,这不是过度防范。cfqueryparam的首要职责是数据绑定。它有助于防止sql注入攻击,这只是额外的加分项。通过数据绑定的预处理语句执行速度更快。你错了,认为它只有在防止sql攻击方面才有帮助。
重要提示: 我正在添加由@Dan Bracuk提供的在Oracle数据库上的测试用例。
<cfquery name="without" datasource="burns">
select count(*)
from burns_patient
where patientid = 1
</cfquery>

<cfquery name="with" datasource="burns">
select count(*)
from burns_patient
where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
</cfquery>

<cfscript>
TotalWithout = 0;
TotalWith = 0;
</cfscript>

<cfloop from="1" to="1000" index="i" step="1">

  <cfquery name="without" datasource="burns" result="resultwithout">
    select count(*)
    from burns_patient
    where patientid = 1
  </cfquery>

  <cfquery name="with" datasource="burns" result="resultwith">
    select count(*)
    from burns_patient
    where patientid = <cfqueryparam cfsqltype="cf_sql_integer" value="1">
  </cfquery>

  <cfscript>
    TotalWithout += resultwithout.executiontime;
    TotalWith += resultwith.executiontime;
  </cfscript>

</cfloop>

<cfdump var="With total is #TotalWith# and without total is #TotalWithout#.">

不使用缓存的情况下,总时间范围在1800至4500毫秒之间,而使用缓存的情况下,总时间范围在700至900毫秒之间。不使用缓存的总时间始终是使用缓存的总时间的两倍以上。


2
请随意证明使用查询参数而不是常量将提高性能的说法。 - Dan Bracuk
1
使用 cfqueryparam,将会准备一个执行计划,而使用常量则不会,JDBC 将仅传递整个查询字符串。我相信带有执行计划的查询将运行得更快。 - CFML_Developer
1
@CFML_Developer 我认为,实际上需要证明你的立场。我不认为你正在这样做。注意:我并不是要表达我不同意你的观点,但我认为人们问你问题是在询问与你的答案质量直接相关的有效问题。你需要证明你所说的是真实的,而不仅仅是你碰巧认为的,但可能没有任何依据(注意:我不是其中一个对你进行了投票的人)。 - Adam Cameron
1
@DanBracuk,将自己的答案添加到另一个答案中是正常的吗?如果不查看编辑历史记录,看起来像CFML_Developer添加了脚本。 - Twillen
3
好奇。您是一直通过ColdFusion执行查询来进行测试,还是使用SQL Profiler或其他工具来测试查询本身的运行速度?这才是真正的问题,对吧?当然,由于执行该标记存在开销,因此使用cfqueryparam时,ColdFusion的执行速度会稍微慢一些。真正的问题应该是,数据库级别上的实际查询速度是更快还是更慢? - Sean Coyne
显示剩余12条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接