使用单一 I/O 操作将多个连续的页读入缓冲池可以大大降低应用程序开销。
SELECT NAME FROM EMPLOYEE
有时,并不能立即确定顺序预取能否提高性能。在此类情况下,数据库管理器可以监视 I/O 并在顺序页读操作发生时激活预取。这种类型的顺序预取称为顺序检测,并且同时适用于索引页和数据页。您可以使用 seqdetect 数据库配置参数来控制数据库管理器是否执行顺序检测。
SELECT NAME FROM EMPLOYEE
WHERE EMPNO BETWEEN 100 AND 3000
在本示例中,优化器可能已开始使用基于
EMPNO 列的索引来扫描表。如果该表相对于此索引而言高度集群,那么数据页读操作将几乎按顺序进行,并且预取有助于提高性能。同样,如果必须检查许多索引页,并且数据库管理器检测到正在按顺序读取索引页,那么有可能进行索引页预取。CREATE TABLESPACE 或 ALTER TABLESPACE 语句的 PREFETCHSIZE 子句允许您指定执行数据预取时将从表空间中读取的预取页数。您指定的值(或者“AUTOMATIC”)将存储在 SYSCAT.TABLESPACES 目录视图的 PREFETCHSIZE 列中。
您最好将 PREFETCHSIZE 值明确设置为表空间容器数、每个容器下的物理磁盘数(如果使用了 RAID 设备的话)与表空间的 EXTENTSIZE 值(数据库管理器在使用另一个容器前写入容器的页数)的乘积。例如,如果扩展数据块大小为 16 页,并且表空间包含两个容器,那么可以将预取大小设置为 32 页。如果每个容器有 5 个物理磁盘,那么可以将预取大小设置为 160 页。
数据库管理器将监视缓冲池的使用情况,以确保预取不会从缓冲池中除去另一个工作单元所需的页。为了避免引起问题,数据库管理器可将预取的页数限制为小于您对表空间指定的数目。
如果查询预取数据时发生 I/O 等待情况,那么请增大 PREFETCHSIZE 的值。如果预取程序不是这些 I/O 等待情况的原因,那么增大 PREFETCHSIZE 值对提高查询性能没有帮助。
对于所有类型的预取而言,如果预取大小是表空间的扩展数据块大小的倍数,并且这些扩展数据块在多个不同的容器中,那么可以并行地执行多个 I/O 操作。为了提高性能,请将容器配置为使用多个不同的物理设备。