在 Oracle 中,“缓冲区获取”实际上指的是啥?

Posted

技术标签:

【中文标题】在 Oracle 中,“缓冲区获取”实际上指的是啥?【英文标题】:In Oracle what does 'Buffer Gets' actually refer to?在 Oracle 中,“缓冲区获取”实际上指的是什么? 【发布时间】:2008-11-17 06:35:10 【问题描述】:

我目前正在与 Oracle DBA 打交道,他已向我发送了一些他已完成的分析。他报告中的一个术语是“缓冲区获取”,知道这实际上意味着什么吗?我的猜测是从缓冲区中检索到的字节,但我真的不知道。这是一些示例输出:

  Buffer Gets    Executions  Gets per Exec  %Total Time (s)  Time (s) Hash Value
--------------- ------------ -------------- ------ -------- --------- ----------
    137,948,100       31,495        4,380.0   98.4  6980.57   6873.46 4212400674
Module: JDBC Thin Client
SELECT fieldOne, fieldTwo, fieldThree, fieldFour, fieldFive FROM TableExample
WHERE fieldOne = 'example'

知道“Gets per Exec”是什么意思也很方便,因为我猜它们是相关的?我是程序员,但不是 DBA。

【问题讨论】:

【参考方案1】:

Oracle 存储被排列成给定大小(例如 8k)的块。表和索引由磁盘上的一系列块组成。当这些块在内存中时,它们会占用一个缓冲区。

当 Oracle 需要一个块时,它会执行 缓冲区获取。首先,它检查它是否已经在内存中拥有它需要的块。如果是这样,则使用内存版本。如果它在内存中没有该块,则它将它从磁盘读取到内存中。

因此,一个缓冲区 get 表示 Oracle 必须访问一个块的次数。读取可能已从内存(缓冲区)或已导致物理 IO 得到满足。

由于物理 IO 非常昂贵(与内存或 CPU 相比),一种调优方法是专注于减少缓冲区获取,假设将继续减少物理 IO。

【讨论】:

是的 - 除此之外,许多查询成本模型几乎完全集中在磁盘 I/O 上,缓冲区得到的是建模(不完美,但尽可能接近)。所以,它是一个简单的成本函数——“这个查询有多贵,忽略 CPU(无论如何这几乎可以忽略不计)?” 感谢您提供了非常好的答案,我脑海中唯一留下的问题是,对于上面的数据是 137,948,100,对于被调用 31,495 次的选择查询,大量缓冲区获得了?这个数字可以表示诸如表扫描与索引之类的东西吗? 这对我来说似乎是一个很大的数字,但如果不知道您正在做多少工作,我不能说。让您的 DBA 对查询执行“解释计划”,看看它是否对您有意义。【参考方案2】:

只是回答你的一部分问题,WW 没有:

“Gets per Exec”只是获取数除以语句的执行次数。您可能有一个非常有效但执行多次的语句;这将有大量的总缓冲区获取,但每次执行的获取率较低。

【讨论】:

【参考方案3】:

我只是想稍微考虑一下。

首先,Dave Costa 是对的,Buffer 获取 exec 才是真正重要的。

有了这些数据,我们不能说它们是否太多,因为你没有说你的查询提取了多少条记录

如果您提取 4000 条记录,可能 4,380 条就可以了 如果你只提取 1 条记录,它们可能太多了

那么,有多少条记录?

还有,你有sql计划看看吗? 你有 fieldOne 的索引吗?

正确的索引是调优查询的第一个“秘密”。

只要我的 2 美分

【讨论】:

这应该是评论而不是答案。

以上是关于在 Oracle 中,“缓冲区获取”实际上指的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

数据库中id指的是啥?

ES6 中的箭头函数中的“this”指的是啥?

SQL Server中“实例”指的是啥?

aix中的paging space指的是啥?

编程中VB跟VC指的是啥 请详细说清楚...

TCP数据段中的紧急指的是啥