DB2 V9.7 for Linux, UNIX, and Windows

顺序预取

使用单一 I/O 操作将多个连续的页读入缓冲池可以大大降低应用程序开销。

当数据库管理器确定顺序 I/O 合适并且预取操作有助于提高性能时,预取操作就会启动。对于表扫描和表排序这类情况,数据库管理器将自动选择顺序预取。以下示例(可能要求执行表扫描)适合于顺序预取:
   SELECT NAME FROM EMPLOYEE

顺序检测

有时,并不能立即确定顺序预取能否提高性能。在此类情况下,数据库管理器可以监视 I/O 并在顺序页读操作发生时激活预取。这种类型的顺序预取称为顺序检测,并且同时适用于索引页和数据页。您可以使用 seqdetect 数据库配置参数来控制数据库管理器是否执行顺序检测。

例如,如果启用顺序检测,那么顺序预取有可能使以下 SQL 语句受益:
   SELECT NAME FROM EMPLOYEE
   WHERE EMPNO BETWEEN 100 AND 3000
在本示例中,优化器可能已开始使用基于 EMPNO 列的索引来扫描表。如果该表相对于此索引而言高度集群,那么数据页读操作将几乎按顺序进行,并且预取有助于提高性能。同样,如果必须检查许多索引页,并且数据库管理器检测到正在按顺序读取索引页,那么有可能进行索引页预取。

表空间的 PREFETCHSIZE 选项的含义

CREATE TABLESPACE 或 ALTER TABLESPACE 语句的 PREFETCHSIZE 子句允许您指定执行数据预取时将从表空间中读取的预取页数。您指定的值(或者“AUTOMATIC”)将存储在 SYSCAT.TABLESPACES 目录视图的 PREFETCHSIZE 列中。

您最好将 PREFETCHSIZE 值明确设置为表空间容器数、每个容器下的物理磁盘数(如果使用了 RAID 设备的话)与表空间的 EXTENTSIZE 值(数据库管理器在使用另一个容器前写入容器的页数)的乘积。例如,如果扩展数据块大小为 16 页,并且表空间包含两个容器,那么可以将预取大小设置为 32 页。如果每个容器有 5 个物理磁盘,那么可以将预取大小设置为 160 页。

数据库管理器将监视缓冲池的使用情况,以确保预取不会从缓冲池中除去另一个工作单元所需的页。为了避免引起问题,数据库管理器可将预取的页数限制为小于您对表空间指定的数目。

预取大小可能会显著影响性能,对于大型表扫描而言尤其如此。请使用数据库系统监视器和其他系统监视工具来帮助您调整表空间的预取大小。您可以收集有关是否存在下列情况的信息:
  • 查询等待 I/O(通过使用适用于操作系统的监视工具来检查这种情况)
  • 正在进行预取(通过查看数据库系统监视器提供的 pool_async_data_reads(缓冲池异步数据读取)数据元素来检查这种情况)

如果查询预取数据时发生 I/O 等待情况,那么请增大 PREFETCHSIZE 的值。如果预取程序不是这些 I/O 等待情况的原因,那么增大 PREFETCHSIZE 值对提高查询性能没有帮助。

对于所有类型的预取而言,如果预取大小是表空间的扩展数据块大小的倍数,并且这些扩展数据块在多个不同的容器中,那么可以并行地执行多个 I/O 操作。为了提高性能,请将容器配置为使用多个不同的物理设备。