缓冲区获得执行时间

时间:2012-09-13 00:01:34

标签: sql oracle buffer execution-time

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

PS:我正在使用Oracle 11g RDBMS

1 个答案:

答案 0 :(得分:4)

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

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

完全有可能减少查询所执行的逻辑I / O数量,但会改变I / O的性质,以便更有可能进行缓存。例如,如果你有一个嵌套循环,你经常进行索引扫描,那么很可能相对快速地将大部分索引缓存在SGA中意味着大多数逻辑I / O你在那个索引上最终得到满足的相对快速的缓冲区获取只需要从SGA中获取块。例如,执行全表扫描的替代计划可能会执行较少的逻辑I / O,但由于可能会缓存表中相对较少的块,因此大多数I / O可能需要物理读取。完全可能的是,在这种情况下,执行更多逻辑I / O的查询计划可以更快地完成。

然而,在实践中,人类能够准确地预测哪些缓冲区可能需要物理读取并且通常将从缓存中提供服务是相对罕见的。您的非生产环境几乎肯定不具有与生产环境相同的缓存利用率模式,因为您在这些环境中没有运行相同类型的工作负载。即使在生产系统上,缓存的一组块在一天中变化很大,人类开发人员很少有理由知道或理解这些变化。因此,只是因为当您测试查询时,您发现它执行的缓冲区更多但运行速度比同等查询更快,这可能并不表示您将在生产中看到类似的模式。由于缓冲区的获取数量(或多或少)相当于环境(假设或多或少等效的数据量),因此在实践中通常更容易集中精力减少逻辑I / O并让Oracle负责其余的工作。 / p>

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