5

考虑以下:

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

是否有潜在的性能改进?是否有可能损害性能?

如果我做同样的事情(使用 cfqueryparam)AND dColumn is null怎么办?

我的发现没有定论。

如果它很重要,假设 ColdFusion9 和 Oracle db 11g。

编辑:

我想重申一下,我询问的是 cfqueryparam 标记专门用于常量和/或空值以及性能改进(如果有)。

4

3 回答 3

7

是否有潜在的性能改进?

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

是否有可能损害性能?

我见过一些特殊情况的提及,其中在常量上使用绑定变量实际上可能会降低性能。但这实际上是根据具体情况而定的。

于 2013-07-10T23:51:38.223 回答
0

我不这么认为,因为你已经有了一个<cfqueryparam>,这会将它变成一个准备好的声明,但我不确定。

于 2013-07-10T16:48:13.593 回答
-2

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

首先,它将保护您免受 SQLI 的侵害。它将增加一个保护级别,以确保参数中的数据是预期的。

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

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

于 2013-07-10T17:20:04.740 回答