我对Oracle在性能调优中看到的一些问题有一个普遍的疑问。我有一个我正在测试的查询。对我来说,提供一个简单的例子太大而且太复杂了,对不起! (我尝试降低它,但失去了症状)
我第一次运行查询时,它是2秒。随后的时间是3,4或甚至5秒。这种情况一直发生 - 如果我改变间距,我再次得到2秒,然后它又回来了。
这与我期望的相反 - 在第一次之后,数据库不需要解析查询,并且块应该被读入缓冲区缓存。我唯一能想到的是它正在某处编写临时数据,这样写入和读取它比读取它更快。但那当然没有意义。
有谁知道为什么会这样?或执行计划中的任何红旗会导致这样的事情?
仅供参考,这是一个SELECT,具有多个连接,聚合和视图。没有内部PL / SQL。
谢谢
答案 0 :(得分: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'
但在解释计划中没有注释。