Oracle SQL 查询提高了第二次和第三次执行的性能

Oracle SQL query improves performance on second and third execution

我们正在分析 Oracle 12c 数据库上的 sql 语句。我们注意到 运行ning 多次改进了以下语句。怎么解释第二次第三次就提高了?

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%'));

Oracle 从磁盘中提取数据到内存中。第二次 运行 查询时,数据已在内存中找到,因此无需读取磁盘。导致更快的查询执行。 数据库是 "warmed up".

Oracle默认不缓存查询结果,而是缓存查询使用的数据块。 12c 还具有 "Adaptive execution plans" 和 "Cardinality feedback" 等功能,即使未重新计算 table 统计信息,也可能会在执行之间强制执行计划更改。