解释Oracle中的计划和计算缓存命中率

Explain plan and computing cache hit ratio in Oracle

假设 oracle db 40M 字节的缓存 memory.I 是数据库的唯一用户,我想了解如何执行查询以便计算查询的缓存命中率。

假设我们有这个查询:

SELECT column1, count(*) 
FROM table1
GROUP BY column1
ORDER BY column1 desc

假设table1小于40M大小,现在解释计划说:

TABLE ACESS(FULL) 的成本为 1330(I/O?),然后 SORT(GROUP BY) 的成本为 1340,SELECT STATEMENT 的成本也为 1340。

有点不明白,为什么SORTSELECT STATEMENT每个要1340I/O?

因为我们有一个大于 table 大小的缓存,当我们进行 table 访问时,我们将磁盘内容加载到缓存中,然后当我们想要排序和 select 时,我们只需要检索缓存的内容,所以在我看来它应该是零 I/O 排序和 select.

另外,如何计算该查询的缓存命中率?

成本是操作的预期时间,以花费该时间量的等效单块读取次数表示。

因此,对于一个单块读取需要 0.5 毫秒的系统,一个 100 毫秒的操作将花费 200。

您描述的数字听起来像是累积的,因此 select 的 1340 包括分组依据的 1340,它本身包括 table 访问的 1330。因此分组成本为 10.

查询的缓存命中率将取决于执行查询之前 SGA 中有多少 table——如果有 none,则 BCHR 将是0%。如果全部是,BCHR 将是 100%。

请注意,作为系统调优工具,BCHR 已被广泛弃用,因为高 BCHR 与高效查询计划之间的相关性非常弱。事实上,您可以通过降低查询计划的效率来提高 BCHR。