1

我有一个关于我在 Oracle 的性能调整中看到的一般性问题。我有一个正在测试的查询。我无法提供一个简单的例子,它太大太复杂了,对不起!(我尝试降低它,但失去了症状)

我第一次运行查询时,是 2 秒。随后的时间是 3、4 甚至 5 秒。这种情况始终如一地发生 - 如果我改变间距,我会再次获得 2 秒,然后它会恢复。

这与我的预期相反——在第一次之后,数据库不需要解析查询,并且应该将块读入缓冲区缓存。我唯一能想到的是它正在某处写入临时数据,以这种方式写入和读取它比读取它更快。但这当然没有意义。

有谁知道为什么会这样?或者执行计划中的任何危险信号会导致这样的事情?

仅供参考,这是一个 SELECT,具有多个连接、聚合和视图。没有内部 PL/SQL。

谢谢

4

1 回答 1

1

由于基数反馈,查询在第一次运行后可能会产生不同的执行计划。在 12c 中,此功能被重命名为统计反馈

优化器使用有关第一次运行的实际和预期行数的信息,并使用该信息来改进第二个执行计划。以我的经验,这通常是一个很好的功能。但是所有优化器功能有时会适得其反。

至少有两种方法可以判断是否使用了基数反馈。解释计划中会有一个注释:

Note
-----
   - cardinality feedback used for this statement

该语句还将显示在此查询中:

select * from v$sql_shared_cursor where use_feedback_stats = 'Y';

您可能需要同时检查两者。当我尝试创建一个示例时,查询use_feedback_stats = 'Y'在解释计划中有但没有注释。

于 2013-09-28T17:10:09.193 回答