有一个从Oracle10升级到11G R1的旧数据库。在Oracle 10中,我们禁用了绑定窥视。由于Oracle 11具有自适应游标共享,所以我们希望重新打开绑定窥视。当我们这样做时,我们发现许多查询的速度要快得多。不幸的是,一个关键的查询变得非常慢。一旦我们关闭了绑定查看,一个查询就会再次快速运行,但是其他的一切都会恢复到缓慢状态。
问题是:在Oracle 11中,什么会导致绑定窥视使查询变慢?我认为自适应游标共享应该能解决不好的绑定变量窥视问题。
发布于 2013-11-07 14:47:43
我最终从Oracle支持处得到了答案。总之:统计。
简短的回答:向优化器提供更多信息(通过绑定查看)会导致执行计划不佳,因为它基于过时的统计数据进行估计。
长答案:假设表中包含不同的列,包括日期列。当关闭绑定查看时,我有一个类似于"select * where date >= :d1和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,并且选择了一个糟糕的计划。
发布于 2013-10-31 19:23:57
绑定窥视是分阶段进行的。首先根据直方图将查询标记为“绑定敏感”,然后将其变为“绑定感知”。V$SQL中的IS_BIND_SENSITIVE和IS_BIND_AWARE列将显示查询的状态。如果IS_BIND_AWARE不打开,查询就不会适应。
这个帖子有助于解释这个过程。
https://dba.stackexchange.com/questions/51558
复制相似问题