Coldfusion 使用带有常量的cfqueryparam

Coldfusion 使用带有常量的cfqueryparam,coldfusion,cfqueryparam,Coldfusion,Cfqueryparam,我们在SQL查询中虔诚地使用cfqueryparam 我的一些前辈在将它与直接值而不是变量一起使用时似乎有点过分热情 不是吗 ? 在这种情况下使用cfqueryparam除了养成使用它的习惯之外,还有什么好处吗?有缺点吗?不,这不是过分的。cfqueryparam的第一个任务是数据绑定。它有助于防止sql注入,这只是附加的好处。通过数据绑定准备的语句执行得更快。您错误地认为它只在sql攻击预防方面提供帮助。 重要提示: 我正在oracle db上添加@Dan Bracuk提供的测试用例 <

我们在SQL查询中虔诚地使用
cfqueryparam

我的一些前辈在将它与直接值而不是变量一起使用时似乎有点过分热情

不是吗

?


在这种情况下使用
cfqueryparam
除了养成使用它的习惯之外,还有什么好处吗?有缺点吗?

不,这不是过分的。cfqueryparam的第一个任务是数据绑定。它有助于防止sql注入,这只是附加的好处。通过数据绑定准备的语句执行得更快。您错误地认为它只在sql攻击预防方面提供帮助。
重要提示: 我正在oracle db上添加@Dan Bracuk提供的测试用例

<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#.">

选择计数(*)
来自烧伤科的病人
其中patientid=1
选择计数(*)
来自烧伤科的病人
其中patientid=
TotalWither=0;
TotalWith=0;
选择计数(*)
来自烧伤科的病人
其中patientid=1
选择计数(*)
来自烧伤科的病人
其中patientid=
TotalWithout+=resultwithout.executiontime;
TotalWith+=resultwith.executiontime;

总范围为700到900毫秒的。无总时间的范围为1800到4500毫秒。“无总计”总是至少是“有总计”的两倍。

我都不知道。在我的一位同事告诉我要改进之前,我曾经是一个过分热心的人。请随意证明使用查询参数而不是常量将提高性能的说法。使用cfqueryparam,将准备执行计划,而使用常量则不会,JDBC将只传递整个查询字符串。我相信带有执行计划的查询会运行得更快。@CFML\u开发者我认为证明自己的立场的责任实际上在你身上。我想你不会这么做的。注:我并不是说我不同意你的观点,但我认为问你问题的人提出的是与你答案质量直接相关的有效问题。你需要证明你所说的是真实的,而不仅仅是你碰巧想到的,但不一定有任何根据(注:我不是投票否决你的ppl之一)。@DanBracuk在另一个答案上加上你自己的答案正常吗?没有查看编辑历史记录,看起来CFML_开发者添加了脚本。好奇。您是在测试通过ColdFusion执行查询的整个时间,还是在使用SQL Profiler或其他工具来测试查询本身的运行速度?这才是真正的问题,对吗?当然,使用cfqueryparam时,ColdFusion的执行会稍微慢一点,因为执行该标记时会有开销。真正的问题应该是,数据库级别的实际查询是更快还是更慢?
record_is_deleted_bt = 0
<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#.">