在 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 中,“缓冲区获取”实际上指的是啥?的主要内容,如果未能解决你的问题,请参考以下文章