Sql 在Oracle中,什么是';缓冲区获取';究竟指什么?
我现在正在和一位Oracle DBA打交道,他给我发了一些他所做的分析。他的报告中的一个术语是“缓冲区获取”,你知道这实际上意味着什么吗?我猜是从缓冲区中检索字节,但我真的不知道。以下是一些示例输出:Sql 在Oracle中,什么是';缓冲区获取';究竟指什么?,sql,oracle,Sql,Oracle,我现在正在和一位Oracle DBA打交道,他给我发了一些他所做的分析。他的报告中的一个术语是“缓冲区获取”,你知道这实际上意味着什么吗?我猜是从缓冲区中检索字节,但我真的不知道。以下是一些示例输出: Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value --------------- ------------ -------------- ------ -------- --------
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'
知道“每个执行者获得”是什么意思也很方便,因为我想它们是相关的?我是程序员,但不是DBA。Oracle存储被安排成给定大小的块(例如8k)。表和索引由磁盘上的一系列块组成。当这些块在内存中时,它们会占用一个缓冲区 当Oracle需要一个块时,它会执行一个缓冲区get。首先,它检查内存中是否已经有了所需的块。如果是,则使用内存中的版本。如果内存中没有该块,则它将从磁盘将其读入内存 因此,buffer get表示Oracle必须访问一个块的次数。读操作可以从内存(缓冲区)中得到满足,也可以导致物理IO
由于物理IO非常昂贵(与内存或CPU相比),调整的一种方法是集中精力减少缓冲区GET,假定缓冲区GET将继续减少物理IO。仅回答WW没有回答的问题的一部分:
“Gets per Exec”只是Gets除以语句的执行次数。您可能有一个非常高效但执行多次的语句;这将有大量的总缓冲区get,但每个执行的get比率很低。我只想考虑一下 首先,Dave Costa是对的,exec获得的缓冲区才是真正重要的 对于这些数据,我们不能说它们是否太多,因为您不能说您的查询提取了多少条记录 如果您提取4000条记录,那么4380条就可以了 如果你只提取一条记录,它们可能太多了 那么,有多少张唱片 还有,您有sql计划要看吗? 你有fieldOne的索引吗 正确的索引是优化查询的第一个“秘密”
仅我的2美分是-除此之外,许多查询成本模型几乎完全集中在磁盘I/O上,缓冲区得到的数据正在建模(不是完美的,但尽可能接近)。所以,这意味着一个简单的成本函数——“忽略CPU,这个查询有多贵(这基本上可以忽略)?”感谢这个非常好的答案,我脑海中唯一剩下的问题是,对于上面的数据是137948100,对于一个调用31495次的select查询,可以获得大量的缓冲区?这个数字能表示像表扫描和索引之类的事情吗?对我来说这似乎是一个很大的数字,但我不能不知道你在做多少工作。让您的DBA对查询执行“解释计划”,看看它是否对您有意义。这可能是一个注释,而不是答案。