2016-12-08 43 views
0

假设oracle数据库有40M字节的缓存内存。我是数据库的唯一用户,我想了解如何执行查询以计算缓存命中率一个问题。在Oracle中解释计划和计算缓存命中率

比方说,我们有这个疑问:

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

假设table1不到40M大小,现在解释计划说:(?I/O)

TABLE ACESS(FULL)有1330的成本,那么成本1340和SELECT STATEMENT成本1340也SORT(GROUP BY)

我不明白,为什么SORTSELECT STATEMENT每个都花费1340个I/O?

由于当我们进行表访问时我们的缓存大于表的大小,所以我们在缓存中加载磁盘内容,然后当我们想要排序和选择时,我们只需要检索缓存的内容,所以在我的头脑应该是零排序和选择的I/O。

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

+0

你可以发布执行计划吗? –

回答

1

成本是操作的预期时间,用等量的单个块读取来表示,这将花费该时间量。

因此,对于哪一个单块读取0.5ms的花费将有200

成本你描述听起来像他们是累积的数字为选择一个系统,所以1340在100ms的操作包括1340 group by,它本身包含1330个表访问。因此,该组按成本计算10.

查询的高速缓存命中率取决于执行查询之前SGA中该表的有多少 - 如果没有它,BCHR将为0% 。如果全部是,BCHR将是100%。

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

+0

谢谢,但不排序和选择计数块读取?那么这会使缓存命中率达到66.6%,或者是在运行中完成排序和选择,因此它们不会被视为I/O? – user2241915

+0

不是真的 - 如果排序太大而无法在内存中执行(PGA,而不是SGA),那么它会溢出到磁盘,但涉及的I/O不会影响BCHR(BCHR不是BCHR的另一个原因)系统效率的一个很好的衡量标准)。 –