我想问一下缓冲区的意义。随着缓冲区的减少,我可以假设我已经减少了所需的 I/O,但我也可以说它也与执行时间有关吗?大多数情况下,我发现减少缓冲区会减少执行时间,但在少数情况下,即使我的缓冲区增加,我的执行时间也会减少。那可能吗?提前致谢!
PS:我正在使用 Oracle 11g RDBMS
我想问一下缓冲区的意义。随着缓冲区的减少,我可以假设我已经减少了所需的 I/O,但我也可以说它也与执行时间有关吗?大多数情况下,我发现减少缓冲区会减少执行时间,但在少数情况下,即使我的缓冲区增加,我的执行时间也会减少。那可能吗?提前致谢!
PS:我正在使用 Oracle 11g RDBMS
缓冲区的减少通常会但并不总是与更快的运行时间相关。肯定存在相关性,但相关性并不完美。
根据数据库是否可以简单地从 SGA 缓存中提取块、是否可以从文件系统缓存中读取、是否可以从 SAN 缓存中读取,或者是否真的可以需要物理读取。进行物理读取所需的时间在很大程度上取决于 SAN 的结构以及它是否将不同的块存储在更快或更慢的磁盘上。在许多现代 SAN 中,您可能有少量固态磁盘用于最常读取的块,一些快速硬盘驱动器用于通常读取的块,而较慢的硬盘驱动器用于不常读取的块,每个块都有自己的性能特征。
您完全有可能减少查询所执行的逻辑 I/O 数量,但更改 I/O 的性质,使其更有可能被缓存。例如,如果您有一个不断进行索引扫描的嵌套循环,则很可能大部分索引将相对较快地缓存在 SGA 中,这意味着您的大部分逻辑 I/O在该索引上执行操作最终会满足相对较快的缓冲区获取,只需从 SGA 中获取块。例如,涉及执行全表扫描的替代计划可能会执行较少的逻辑 I/O,但由于表中可能缓存的块相对较少,因此大部分 I/O 可能需要物理读取。完全有可能,在这种情况下,
然而,在实践中,人类能够准确预测哪些缓冲区可能需要物理读取以及哪些通常会从缓存中获得服务的情况相对较少。您的非生产环境几乎肯定没有与生产环境相同的缓存利用率模式,因为您在这些环境中运行的工作负载类型不同。即使在生产系统上,缓存的块集在一天中也会发生巨大变化,人类开发人员很少有理由知道或理解这些变化。因此,仅仅因为当您测试一个查询时,您发现它比等效查询获得更多缓冲区但运行得更快,这可能并不表明您会在生产中看到类似的模式。
此外,查询等待的不仅仅是 I/O。查询在 CPU 上等待,在网络事件上等待,在锁和闩锁以及其他序列化设备上等待。Buffer 仅测量 I/O,它不会尝试考虑任何其他类型的等待。因此,您还可能遇到以下情况:一个计划执行的 I/O 大大减少,但在 CPU 或网络或 RAC 缓存融合或其他一些事件上等待的时间大大延长,因此尽管在 I/O 上等待的时间要少得多,但它的执行时间要长得多。