磁盘 I/O 效率和表空间设计

表空间的类型和设计决定了对该表空间执行的 I/O 的效率。

在考虑其他关于表空间设计和使用的问题之前,您应该了解下列概念:

大块读取
在单个请求中检索多页(通常为一个扩展数据块)的一种读取。 一次读取几页比分别读取每页更有效。
预取
在一个查询引用页之前对那些页的读取。 总的目的是为缩短响应时间。 如果页的 预取可以与查询的执行异步发生,就能够达到此目的。 当 CPU 或 I/O 子系统以最大能力运行时达到最佳响应时间。
页清除
当读取和修改页时,它们会累积在数据库缓冲池中。 当读入一页时,便将其读入到缓冲池页中。 如果该缓冲池已充满修改的页,那么必须将修改的这些页的其中一页写出至磁盘,然后才能再读入新的页。 为避免缓冲池变满,页清除程序代理程序的任务就是写出修改的页,以保证缓冲池页可用于将来的读取请求。

无论何时,只要有利,数据库管理器就会执行大块读取。 当检索顺序排列或本质上是部分顺序排列的数据时,通常会发生这种情况。 在一个读操作中读取的数据量取决于扩展数据块大小 - 扩展数据块大小越大,一次可以读取的页就越多。

如果可以将页从磁盘读入缓冲池内的连续页中,那么可以进一步提高顺序预取的性能。 因为缺省情况下缓冲池是基于页的,所以从磁盘的连续页中读取时,不能保证会找到一组连续页。 基于块的缓冲池可以用于此目的,因为它们不仅包含页区域,还包含可用于几组连续页的块区域。 每一组连续页都命名为一个块,并且每个块都包含称为块大小的若干页。 页和块区域的大小以及每个块中的页的数目都是可配置的。

扩展数据块存储在磁盘上的方式影响 I/O 效率。 在使用设备容器的 DMS 表空间中,数据往往在 磁盘上是连续的,且可以在最短的搜索时间和磁盘等待时间内进行读取。 如果使用的是文件,那么为了供 DMS 表空间使用而预分配的大文件在磁盘上也往往是连续的,尤其当该文件分配在一个干净的文件空间中时更是这样。 但是,数据可能被系统文件分散,并存储在磁盘上的多个位置中。 当使用一次将文件扩展一页的 SMS 表空间时(这使产生碎片的概率更高),最可能发生此情况。

可以通过更改 CREATE TABLESPACE 或 ALTER TABLESPACE 语句中的 PREFETCHSIZE 选项来控制预取的程度,或者可以将预取大小设置为 AUTOMATIC 以让数据库管理器自动选择最适合的大小来使用。 (该数据库中所有表空间的缺省值由 dft_prefetch_sz 数据库配置参数设置。) PREFETCHSIZE 参数告诉数据库管理器在触发预取时要读取的页数。 通过在 CREATE TABLESPACE 语句上将 PREFETCHSIZE 设置为 EXTENTSIZE 参数的倍数,可以并行读取多个扩展数据块。 (该数据库中所有表空间的缺省值由 dft_extent_sz 数据库配置参数设置。) EXTENTSIZE 参数指定在跳至下一个容器之前将写入一个容器的 4 KB 大小的页数。

例如,假定有一个表空间使用三个设备。 如果将 PREFETCHSIZE 设置为 EXTENTSIZE 的三倍,那么数据库管理器可以用并行方式从每个设备中执行大块读取,从而显著增大 I/O 吞吐量。 此情况假定每个设备是一个单独的物理设备,且控制器具有足够的带宽来处理来自每个设备的数据流。 请注意,数据库管理器可能需要根据查询速度、缓冲池利用率和其他因素在运行时动态调整预取参数。

某些文件系统使用自己的预取方法 (例如 AIX®上的日志文件系统)。 在某些情况下,文件系统预取设置为比数据库管理器预取更激进。 这可能导致使用文件容器的 SMS 和 DMS 表空间的预取似乎比使用设备的 DMS 表空间的预取执行效率更高。 但这是误导,因为它可能是在文件系统中发生的 其他级别的预取的结果。 DMS 表空间应该能够比任何等价配置的执行效率高。

为提高预取效率(甚至读取效率),必须存在足够数量的干净缓冲池页。 例如,可能有一个并行预取请求要从一个表空间读取三个扩展数据块,对于正在读取的每一页,从缓冲池写出经过修改的一页。 该预取请求可能被拖慢,导致它跟不上查询 的进展。 应配置足够数量的页清除程序,以满足预取请求。