请考虑以下事项:
<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标签是专门用于常量和/或空值以及性能再现(如果有的话)。
答案 0 :(得分:6)
是否有潜在的性能提升?
没有。当涉及变量参数时,绑定变量最有用。没有它们,每次查询参数改变时,数据库都会生成一个新的执行计划(这很昂贵)。绑定变量鼓励数据库缓存并重用单个执行计划,即使参数发生变化也是如此。这节省了编译成本,提高了性能。 常量确实没有任何好处。由于值永远不会更改,因此数据库将始终重用执行计划。因此没有太多理由在常量上使用它。
是否有可能损害表现?
我看到一些特殊情况的提及,在常量上使用绑定变量实际上可能会降低性能。但这确实是在个案的基础上。
答案 1 :(得分:0)
我不这么认为,因为你已经有一个<cfqueryparam>
并且会把它变成一个准备好的陈述,但我不确定。
答案 2 :(得分:-2)
使用查询参数将有两种方式帮助。
首先,它将保护您免受SQLI的侵害。它将增加一定程度的保护,以确保参数中的数据符合预期。
其次,您会看到性能提升。但是,增加量取决于数据模式和索引。该参数将允许数据库缓存查询计划。这加速了查询执行的初始开销。查询越复杂,缓存查询计划就越重要。
此外,请确保您对where子句中的所有列都有覆盖索引,并且它们的顺序正确。如果没有,查询优化器可以选择忽略索引并直接进行表扫描。