读取操作和预取I/O
Db2 在几乎所有情况下都使用预取I/O读取数据,但在某些情况下使用同步I/O。
使用同步读取时,一次只能读取一页。 同步读取的传输单位为每次I/O操作一页。 Db2 尽可能使用预取机制,如动态预取、顺序预取和列表预取,以避免同步I/O带来的昂贵等待时间。
预取是一种将一组页面(通常为32个)读入缓冲池的机制,只需进行一次异步I/O操作。 预取功能可大幅节省CPU和I/O成本。 单个预取操作读取的最大页数取决于用于该操作的缓冲池的大小。
- 顺序预取
- 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的预取读取页数。
| 缓冲池大小 | 缓冲区数 | 按顺序和LOB列表预取读取的页面 | 动态和非LOB列表预取的已读页面 | 实用程序顺序预读的页数 |
|---|---|---|---|---|
| 4 KB | VPSIZE < 224 | 8 | 8 | 16 |
| 225 < vpsize < 1,000 | 16 | 16 | 32 | |
1000 <= VPSIZE < 40,000
or VPSIZE*VPSEQT < 40000 |
32 | 32 | 64 | |
| 40,000 <= VPSIZE*VPSEQT < 80,000 | 64 | 32 | 64 | |
| 80,000 <= VPSIZE*VPSEQT | 64 | 32 | 128 | |
| 8 KB | VPSIZE < 48 | 4 | 4 | 8 |
| 48 < vpsize <400 | 8 | 8 | 16 | |
400 <= VPSIZE< 20,000 或
VPSIZE*VPSEQT < 20000 |
16 | 16 | 32 | |
| 20,000 <= VPSIZE*VPSEQT < 40,000 | 32 | 16 | 32 | |
| 40,000 <= 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 <= VPSIZE*VPSEQT < 20,000 | 16 | 8 | 16 | |
| 20,000 <= VPSIZE*VPSEQT | 16 | 8 | 32 | |
| 32 KB | VPSIZE < 12 | 1 | 1 | 2 |
| 12 < VSPACE < 100 | 2 | 2 | 4 | |
100 <= VPSIZE< 5,000
or VPSIZE*VPSEQT < 5,000 |
4 | 4 | 8 | |
| 5,000 <= VPSIZE*VPSEQT < 10,000 | 8 | 4 | 8 | |
| 10,000 <= VPSIZE*VPSEQT | 8 | 4 | 16 |