Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中,什么是';缓冲区获取';究竟指什么?_Sql_Oracle - Fatal编程技术网

Sql 在Oracle中,什么是';缓冲区获取';究竟指什么?

Sql 在Oracle中,什么是';缓冲区获取';究竟指什么?,sql,oracle,Sql,Oracle,我现在正在和一位Oracle DBA打交道,他给我发了一些他所做的分析。他的报告中的一个术语是“缓冲区获取”,你知道这实际上意味着什么吗?我猜是从缓冲区中检索字节,但我真的不知道。以下是一些示例输出: Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value --------------- ------------ -------------- ------ -------- --------

我现在正在和一位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'

知道“每个执行者获得”是什么意思也很方便,因为我想它们是相关的?我是程序员,但不是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对查询执行“解释计划”,看看它是否对您有意义。这可能是一个注释,而不是答案。