读取操作和预取I/O

Db2 在几乎所有情况下都使用预取I/O读取数据,但在某些情况下使用同步I/O。

使用同步读取时,一次只能读取一页。 同步读取的传输单位为每次I/O操作一页。 Db2 尽可能使用预取机制,如动态预取、顺序预取和列表预取,以避免同步I/O带来的昂贵等待时间。

预取是一种将一组页面(通常为32个)读入缓冲池的机制,只需进行一次异步I/O操作。 预取功能可大幅节省CPU和I/O成本。 单个预取操作读取的最大页数取决于用于该操作的缓冲池的大小。

Db2 使用以下类型的预取来避免使用昂贵的同步读取来访问数据、索引和LOB:
顺序预取
Db2 在索引访问不可用时,对表扫描和多表分段表空间中的数据顺序访问使用顺序预取
动态预取
动态预取中Db2 使用顺序检测算法来检测页面是否正在按顺序读取。 Db2 试图区分集群页面、顺序页面和随机页面。 Db2 对顺序页面使用多页异步预取I/O,对随机页面使用同步I/O。

例如,如果索引的簇比为100%,并且根据该索引以键顺序读取表,则所有数据页都会按簇顺序读取。 然而,如果集群比率略低于100%,那么某些页面是随机的,只有这些页面使用同步I/O读取。 动态预取功能适用于向前和向后扫描。

由于动态预取使用顺序检测,因此与顺序预取相比,它更能适应动态变化的访问模式。 Db2 几乎在所有情况下都使用动态预取,主要例外是表空间扫描。 索引扫描始终使用动态预取。

列表预取
Db2 使用列表预取功能 读取由索引或 日志中的记录标识符(RID)列表确定的一组数据页。 Db2 Db2 还使用列表预取来读取非连续索引叶页(由非叶页确定)和LOB页(由LOB映射确定)。 与其他类型的预取不同,列表预取不使用任何形式的顺序检测。 相反, Db2 在某些情况下会使用列表预取,例如以下示例:
  • 阅读杂乱无章的索引中的页码。
  • 优化程序选择列表预取访问路径。
  • 快速记录应用操作。
  • 图像增量复制。
  • 访问零散的LOB数据。
  • 运行统计表抽样。

Db2 使用RID池处理RID列表,以进行列表预取。 RID池的大小由MAXRBLK子系统参数的值控制。 如果RID池太小,无法容纳列表预取操作所需的RID列表处理,则可能改为使用表空间扫描。Db2 如果RID池太小,可以使用工作文件继续处理RID列表。 RID列表处理工作文件的使用由MAXTEMPS_RID子系统参数值控制。

您可以使用顺序窃取阈值(VPSEQT)来保护缓冲池中随机访问的页面。 保护随机页面不受顺序页面的影响是有益的,因为从磁盘读取顺序页面通常比随机页面更快,而且顺序页面被重新访问的可能性较小。

由于所有预取I/O都是在数据库服务地址空间(ssnmDBM1 )中的服务请求块下执行的,因此预取I/O的I/O时间与第2类CPU时间不同步。 当获取页面操作等待预取I/O完成时,第3类暂停时间被记录为“其他读取I/O”暂停。

预取CPU时间被记录为系统SRB时间。 预取的CPU时间通常很短,但对于索引扫描而言,预取时间可能会变得很长,因为预取引擎需要解压缩压缩的索引页面。

预取的阅读页数

下表显示了每个缓冲池大小(4 KB、8 KB、16 KB和32 KB)的每个异步I/O的预取读取页数。

表 1. 按预取和缓冲池大小划分的每个异步I/O的读取页数
缓冲池大小 缓冲区数 按顺序和LOB列表预取读取的页面 动态和非LOB列表预取的已读页面 实用程序顺序预读的页数
4 KB VPSIZE < 224 8 8 16
225 < vpsize < 1,000 16 16 32
1000 &lt;= VPSIZE &lt; 40,000
or
VPSIZE*VPSEQT &lt; 40000
32 32 64
40,000 &lt;= VPSIZE*VPSEQT &lt; 80,000 64 32 64
80,000 &lt;= VPSIZE*VPSEQT 64 32 128
8 KB VPSIZE < 48 4 4 8
48 < vpsize <400 8 8 16
400 &lt;= VPSIZE&lt; 20,000 或
VPSIZE*VPSEQT
&lt; 20000
16 16 32
20,000 &lt;= VPSIZE*VPSEQT &lt; 40,000 32 16 32
40,000 &lt;= VPSIZE*VPSEQT 32 16 64
16 KB VPSIZE < 24 2 2 4
24 < vpsize < 200 4 4 8
200 < VPSIZE < 10,000 或 VPSIZE * VPSEQT < 10000 8 8 16
10,000 &lt;= VPSIZE*VPSEQT &lt; 20,000 16 8 16
20,000 &lt;= VPSIZE*VPSEQT 16 8 32
32 KB VPSIZE < 12 1 1 2
12 < VSPACE < 100 2 2 4
100 &lt;= VPSIZE&lt; 5,000
or
VPSIZE*VPSEQT &lt; 5,000
4 4 8
5,000 &lt;= VPSIZE*VPSEQT &lt; 10,000 8 4 8
10,000 &lt;= VPSIZE*VPSEQT 8 4 16