<cfqueryparam>如何影响常量和空值的性能?</cfqueryparam>

时间:2013-07-10 15:09:08

标签: coldfusion null oracle11g coldfusion-9 cfqueryparam

请考虑以下事项:

<cfquery name="aQuery" datasource="#aSource#">
    SELECT aColumn
      FROM aTable
     WHERE bColumn = <cfqueryparam value="#aVariable#" cfsqltype="#aSqlType#" />
       AND cColumn = 'someConstant'
       AND dColumn is null
</cfquery>

如果我改变

AND cColumn = 'someConstant'

AND cColumn = <cfqueryparam value="someConstant" cfsqltype="#aSqlType#" />

是否有潜在的性能提升?是否有可能伤害表现?

如果我对AND dColumn is null执行相同的操作(使用cfqueryparam),该怎么办?

我的发现尚无定论。

如果重要,请假设为ColdFusion9和Oracle db 11g。

编辑:

我想重申一下,我要问的是cfqueryparam标签是专门用于常量和/或空值以及性能再现(如果有的话)。

3 个答案:

答案 0 :(得分:6)

  

是否有潜在的性能提升?

没有。当涉及变量参数时,绑定变量最有用。没有它们,每次查询参数改变时,数据库都会生成一个新的执行计划(这很昂贵)。绑定变量鼓励数据库缓存并重用单个执行计划,即使参数发生变化也是如此。这节省了编译成本,提高了性能。 常量确实没有任何好处。由于值永远不会更改,因此数据库将始终重用执行计划。因此没有太多理由在常量上使用它。

  

是否有可能损害表现?

我看到一些特殊情况的提及,在常量上使用绑定变量实际上可能会降低性能。但这确实是在个案的基础上。

答案 1 :(得分:0)

我不这么认为,因为你已经有一个<cfqueryparam>并且会把它变成一个准备好的陈述,但我不确定。

答案 2 :(得分:-2)

使用查询参数将有两种方式帮助。

首先,它将保护您免受SQLI的侵害。它将增加一定程度的保护,以确保参数中的数据符合预期。

其次,您会看到性能提升。但是,增加量取决于数据模式和索引。该参数将允许数据库缓存查询计划。这加速了查询执行的初始开销。查询越复杂,缓存查询计划就越重要。

此外,请确保您对where子句中的所有列都有覆盖索引,并且它们的顺序正确。如果没有,查询优化器可以选择忽略索引并直接进行表扫描。