有一个从 Oracle 10 升级到 11G R1 的旧数据库。在 Oracle 10 中,我们禁用了绑定窥视。由于 Oracle 11 具有自适应游标共享,我们希望重新启用绑定窥视。当我们这样做时,我们发现许多查询要快得多。不幸的是,一个关键查询变得非常慢。一旦我们关闭绑定窥视,一个查询就会再次变快,但其他一切都会变慢。
问题是:在 Oracle 11 中,什么会导致绑定窥视使查询变慢?我认为自适应游标共享应该解决糟糕的绑定变量窥视问题。
有一个从 Oracle 10 升级到 11G R1 的旧数据库。在 Oracle 10 中,我们禁用了绑定窥视。由于 Oracle 11 具有自适应游标共享,我们希望重新启用绑定窥视。当我们这样做时,我们发现许多查询要快得多。不幸的是,一个关键查询变得非常慢。一旦我们关闭绑定窥视,一个查询就会再次变快,但其他一切都会变慢。
问题是:在 Oracle 11 中,什么会导致绑定窥视使查询变慢?我认为自适应游标共享应该解决糟糕的绑定变量窥视问题。
绑定偷看是分阶段完成的。首先,查询基于直方图被标记为“绑定敏感”,然后它可能变为“绑定感知”。V$SQL 中的 IS_BIND_SENSITIVE 和 IS_BIND_AWARE 列将显示查询的状态。如果 IS_BIND_AWARE 未打开,则查询未适应。
这篇文章有助于解释这个过程。
我最终得到了 Oracle 支持的答案。一句话:统计。
简短的回答:为优化器提供更多信息(通过绑定窥视)导致执行计划不佳,因为它的估计基于过时的统计信息。
长答案:假设一个包含各种列的表,包括日期列。当绑定偷看被关闭并且我有一个类似“select * where date >= :d1 and date <:d2”的查询时,Oracle 不会偷看 :d1 和 :d2 的值。它只是做出最好的猜测并估计行数。在我们的例子中,这导致了“足够好”的估计。
如果打开绑定窥视,Oracle 会查看 :d1 和 d:2 的值,然后检查统计信息,包括日期列索引的低/高值。如果 :d1 和 :d2 的值超出了低/高值给出的范围,则它估计行数为 1。换句话说,过时的统计信息报告该列的低值可能是“1/1/2010”,高值是“10/1/2013”,但查询的日期范围是“10/20/2013-10/25/2013”。Oracle 估计返回 1 行而不是实际的 50000,因此选择了一个糟糕的计划。