【问题标题】:Oracle query is slower the second timeoracle查询第二次比较慢
【发布时间】:2013-10-02 20:28:07
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 这也与我的预期相反。解释计划的输出是否因运行而异?
  • 我认为你不应该是crossposting这个...
  • @mustaccio - 抱歉,我认为它适合 DB 论坛,但后来我看到 Stackoverflow 中还有多少问题与我的标签匹配,并认为我在这里会有更好的运气。再说了,你是唯一回答你的人,你可能会得到分数!
  • @Twelfth 其他人建议我看看谢谢。

标签: sql performance oracle oracle11g query-performance


【解决方案1】:

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

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

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

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

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

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

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

【讨论】:

  • 我无法重现/测试,但您的回答听起来不错 - 谢谢!
猜你喜欢
  • 2020-12-03
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多