【问题标题】:Buffer gets with execution time缓冲区随执行时间而变
【发布时间】:2012-09-13 00:01:34
【问题描述】:

我想问一下缓冲区获取的意义。随着缓冲区的减少,我可以假设我已经减少了所需的 I/O,但我也可以说它也与执行时间有关吗? 大多数情况下,我发现减少缓冲区会影响执行时间,但在少数情况下,即使我的缓冲区增加,我的执行时间也会减少。那可能吗? 提前致谢!

PS:我使用的是 Oracle 11g RDBMS

【问题讨论】:

  • 为什么会迷恋缓冲区?
  • 好吧,我想我只是想证明我的想法是对的 :)

标签: sql oracle buffer execution-time


【解决方案1】:

缓冲区的减少通常但并不总是与更快的运行时间相关。肯定有相关性,但相关性并不完美。

根据数据库是否可以简单地从 SGA 缓存中提取块、是否可以从文件系统缓存中读取、是否可以从 SAN 缓存中读取,或是否真的需要物理读取。进行物理读取所需的时间在很大程度上取决于 SAN 的结构以及它是否将不同的块存储在更快或更慢的磁盘上。在许多现代 SAN 中,您可能有少量固态磁盘用于最常读取的块,一些快速硬盘用于通常读取的块,而较慢的硬盘用于不常读取的块,每个块都有自己的性能特征。

您完全有可能减少查询执行的逻辑 I/O 数量,但更改 I/O 的性质,使其更有可能被缓存。例如,如果您有一个不断进行索引扫描的嵌套循环,则很可能大部分索引将相对较快地缓存在 SGA 中,这意味着您的大部分逻辑 I/O在该索引上执行操作最终会满足相对较快的缓冲区获取,只需从 SGA 中获取块。例如,涉及执行全表扫描的替代计划可能会执行较少的逻辑 I/O,但由于表中可能缓存的块相对较少,因此大部分 I/O 可能需要物理读取。在这种情况下,执行更多逻辑 I/O 的查询计划完全有可能完成得更快。

但在实践中,人类能够准确预测哪些缓冲区可能需要物理读取以及哪些通常会从缓存中获取服务的情况相对较少。您的非生产环境几乎肯定没有与生产环境相同的缓存利用率模式,因为您在这些环境中运行的工作负载类型不同。即使在生产系统上,缓存的块集在一天中也会发生巨大变化,人类开发人员很少有理由知道或理解这些变化。因此,仅仅因为当您测试一个查询时,您发现它比等效查询执行更多的缓冲区获取但运行得更快,这可能并不表明您会在生产中看到类似的模式。由于不同环境中缓冲区获取的数量(或多或少)是相等的(假设数据量或多或少相等),因此在实践中通常更容易专注于减少逻辑 I/O 并让 Oracle 处理其余部分。

此外,查询等待的不仅仅是 I/O。查询在 CPU 上等待,在网络事件上等待,在锁和闩锁以及其他序列化设备上等待。 Buffer 仅测量 I/O,它不会尝试考虑任何其他类型的等待。因此,您还可能遇到这样的情况:一个计划执行的 I/O 大大减少,但在 CPU 或网络或 RAC 缓存融合或其他一些事件上等待的时间大大延长,因此尽管在 I/O 上等待的时间要少得多,但它的执行时间要长得多。

【讨论】:

  • 感谢您的快速回复!所以总而言之,我不能保持这样的心态,即随着缓冲区的增加,执行时间也应该增加。对?然后我可以说,在我遇到这种罕见的情况(缓冲区增加,exe 时间减少)之后,这是有可能的,是吗?
  • @RedFux227 - 一般而言,减少缓冲区获取的数量会减少执行时间是完全合理的。期望缓冲区获取次数每减少一次 都会减少执行时间是不合理的。有很强的相关性,但并不完美。
  • 所以,如果我的主管问我为什么缓冲区增加但执行时间减少,解释这个问题的最佳总结答案是什么?
  • @RedFux227 - 这就是我的回答所讨论的。有许多可能的解释,但我在回答中回顾了最常见的解释。
  • @RedFux227 - 我将其总结为“并非所有缓冲区都需要相同数量的运行时间,而且并非所有等待查询都是由于 I/O”
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-16
  • 2019-07-05
  • 2011-08-14
相关资源
最近更新 更多