在WHERE条件中使用绑定变量对于性能方面的劣势是,在某些条件下会对查询优化器隐藏重要的信息。事实上,对于查询优化器而言,获取字面值比使用绑定变量更好。使用字面值时,查询优化器总能够做出最接近的估算。
当涉及范围比较谓词(例如基于BETWEEN、大于或小于的比较条件),检查一个值是否在可用值范围之外时(即小于列中存储的最小值或大于列中存储的最大值),或者使用直方图时,情况尤其如此。例如,拿一个1000行数据的表来说,在id列上,所有的整型值都在1(最小值)和1000(最大值)之间。
SELECT count(id),count(DISTINCT
id),min(id),max(id)FROM t;
当一个用户选择id小于990的所有记录时,查询优化器就知道(归功于对象统计信息)表中大约99%的数据被选中了。因此,它会选择使用全表扫描的执行计划。同时还要注意估算的基数(执行计划中的Rows列)几乎准确对应查询应返回的行数。
SELECT count(pad) FROM t WHERE idØ is_bind_sensitive 不仅表明绑定变量扫视是否用于生成执行计划,同时也表示自适应游标共享可能会被考虑。如果是这样,此列值设置为Y,否则就设置为N。Ø is_bind_aware 表明游标是否使用自适应游标共享。如果是,列值为Y;如果不是,则设置为N。Ø is_shareable 表明游标是否可共享。如果可以,列设置为Y;否则,值为N。如果值为N,则游标不再被重用。