1

我们正在分析 Oracle 12c 数据库上的 sql 语句。我们注意到以下语句通过运行几次得到了改善。如何解释它通过第二次和第三次执行而得到改善?

SELECT COUNT (*) 
  FROM asset
 WHERE     (    (    (status NOT IN ( 'x1', 'x2', 'x3'))
                 AND ( (siteid = 'xxx')))
            AND (EXISTS
                    (SELECT siteid
                       FROM siteauth a, groupuser b
                      WHERE     a.groupname = b.groupname
                            AND b.userid = 'xxx'
                            AND a.siteid = asset.siteid)))
       AND ( (assetnum LIKE '5%'));
  • 第一次运行:24 秒。
  • 第二轮:17秒。
  • 第三轮:7秒。
  • 第四轮:7秒。
  • 通过使用结果现金调整:0,003 秒。
4

2 回答 2

4

Oracle 默认不缓存查询结果,而是缓存查询使用的数据块。12c 还具有“自适应执行计划”和“基数反馈”等功能,即使未重新计算表统计信息,也可能会在执行之间强制执行计划更改。

于 2016-10-11T14:24:56.817 回答
1

Oracle 将数据从磁盘提取到内存中。第二次运行查询时,数据会在内存中找到,因此无需读取磁盘。导致更快的查询执行。数据库已“预热”。

于 2016-10-11T13:51:13.097 回答