Oracle是否缓存了SQL脚本结果或输出

时间:2013-01-16 22:57:29

标签: sql oracle oracle10g

我正在使用Oracle 10G和Oracle SQL开发人员版本3.我想知道Oracle是否在某处存储/缓存查询结果,以便接下来使用相同的参数执行相同的查询,以便检索数据小于第一次执行脚本时的数据。

如果确实缓存了那些结果多久了?

我试图执行一个选择的SQL脚本,并在重复3x后,它检索数据和显示所需的时间减少了近一半。但有些时候,如果我在另一个数据库上执行相同的脚本,即使我重复几次,它似乎也没有任何改变。

2 个答案:

答案 0 :(得分:3)

Oracle在库缓存中缓存SQL语句。当您多次执行语句时(无论是否使用相同的绑定变量值),Oracle使用库高速缓存中的数据来避免重新解析SQL语句并生成新的查询计划。但是,当您考虑调整单个查询时,此缓存不太可能对性能产生重大影响。解析SQL语句并生成查询计划通常是一个非常快速的过程。

Oracle还会在缓冲区缓存中缓存数据块。因此,当您执行查询并读取特定数据块以获取表中特定行的数据时,将缓存该块。这经常允许后续执行具有相同绑定变量集的相同SQL语句,以执行更少的物理读取,因为查询需要读取的更多块被缓存。通常,这些块存储在LRU(最近最少使用)的缓存中,因此它们将被缓存,直到它老化,因为其他块更受欢迎(有一些例外使缓冲区缓存除了纯LRU缓存之外的其他块 - 块通过全表扫描读取的内容通常放在缓存的末尾而不是开头,例如 - 但将它想象为LRU缓存通常是合理的。)

然后您拥有Oracle之外的所有缓存。例如,您的操作系统通常会被配置为缓存部分已读取的文件,因此即使块的时间超出了Oracle的缓冲区缓存,它也可能位于文件系统缓存中,这仍然比从磁盘读取块快得多。大多数SAN还将缓存最近使用的数据,这些数据将允许检索数据而无需从磁盘读取数据。通常,如果数据在Oracle中缓存,则效率更高,但从文件系统缓存或SAN缓存中检索块而不是从物理驱动器读取块仍然更有效。

连续多次运行查询通常会变得更快,因为您正在强制将更多您感兴趣的块缓存到某个地方并大大减少系统需要执行的物理I / O量。当然,如果您的查询不受I / O限制,或者您的查询针对已经缓存的数据,则差异会小得多。但是,完全可能的是,相同的查询将从一天多次运行而不是第二天运行中获益很大,因为有一天它没有感兴趣的块已经被缓存而其他会话和另一天所有的它感兴趣的块已经被缓存了。

在11g中,您可以选择配置结果缓存,以便您可以缓存特定查询的结果,而不仅仅是为了产生这些结果而读取的块。

答案 1 :(得分:1)

Oracle通常会缓存从磁盘读取的每个页面,并会尽可能长时间地保存该信息(它基本上是一个MRU缓存)。在尝试衡量数据库操作的性能时,这是一个非常重要的考虑因素;通常后续执行查询会比第一次快得多。

如果查询只需要很少的I / O,或者超出缓存范围,或者其他用户大量使用缓存,则缓存可能不明显。

请注意,查询计划也会被缓存,这也会影响观察到的查询性能。