|只有“Sun Solaris 操作环境”才支持此功能部件。
|由于存在 I/O 开销,所以从磁盘中预取装页面是一种代价很高的操作。当处理可以与 I/O |重叠时,DB2 的预取装极大地提高了吞吐量。大多数平台都提供了高性能原语来将磁盘中的相邻页读取到内存中不相邻的部分。这些原语通常称为“分散读取”或者“向量化 |I/O”。在某些平台上,这些原语的性能无法与在较大块大小中执行 I/O |时的性能竞争。缺省情况下,缓冲池是基于页的。即,磁盘上的相邻页将预取装到内存中不相邻的页中。如果可以将磁盘中的页面读取到缓冲池的相邻页面中,则可以进一步提高这些平台上的预取装性能。注册表变量 DB2_BLOCK_BASED_BP |允许您在缓冲池中创建分区来保存多组相邻页。这些相邻页组又称为“块”。通过设置此注册表变量,顺序预取装会将磁盘中的页面直接读取到这些块中,而不是个别地读取每一页。这将提高 I/O |性能。有关此注册表变量的更多信息,参见《管理指南》的『注册表变量与环境变量』一节。 |
|可以将不同数据块大小的多个表空间绑定至相同块大小的缓冲池。虽然数据块大小和块大小是不同的概念,但是它们之间存在密切的关系。数据块是在表空间在多个容器中条带化时所采用的粒度。块是 |I/O 服务器执行顺序预取装请求时,将考虑执行基于块的 I/O 所采用的唯一粒度。
|个别顺序预取装请求使用数据块大小页。接收到这样的预取装请求时,I/O 服务器将确定以基于块的 I/O 方式(如果在缓冲池中具有基于块的区域)执行每个请求的成本和好处,而不是使用分散读取方法使用基于页的 I/O |执行请求时的成本和好处。将任何 I/O 作为基于块的 |I/O 来执行的好处是可以提高从相邻磁盘读取到相邻内存中的性能。成本是使用此方法时产生的浪费的缓冲池的量。
|执行基于块的 I/O 时,可能会因两种原因而浪费缓冲池内存: |
|I/O 服务器允许每个块中都有一些浪费的页面,以获得执行基于块的 I/O 的好处。然而,如果块中浪费的页面太多,I/O 服务器将转而使用基于页面的预取装进至缓冲池的页面区域。因此,在预取装期间完成的某些 I/O 将不是基于块的。这不是最佳情况。
|要获得最佳性能,应该将具有相同数据块大小的表空间绑定至具有相同块大小的缓冲池。如果某些表空间的数据块大小大于它们所绑定至的缓冲池的块大小,则仍然可以获得良好的性能。当数据块大小小于块大小时,建议不要将表空间绑定至缓冲池。
|不能同时对缓冲池设置 AWE 和基于块的支持。如果 DB2_AWE |和 DB2_BLOCK_BASED_BP 注册表变量指向同一缓冲池,则 AWE |将具有优先权。在此情况下,将禁用基于块的支持,并且将仅在禁用了 AWE 时才重新启用该支持。
|使用扩展存储器的缓冲池不支持基于块的 |I/O。 |
|在使用任何示例之前,需要知道表示系统上的缓冲池的标识符。可以在 |BUFFERPOOLID 列或 SYSCAT.BUFFERPOOLS 系统目录视图中看到缓冲池的标识。
|方案 1
|假设您具有一个 1000 页的标识为 4 的缓冲池。而您想创建一个由 |700 页组成的块区域,并且每个块包含 32 页。因此,您必须运行以下命令:
| db2set DB2_BLOCK_BASED_BP=4,700,32
|启动数据库时,将创建标识为 4 的缓冲池,其块区域为 672 页,页区域为 328 页。在此示例中,32 不能整除 700。这意味着,需要使用以下公式来将指定的块区域大小降低到最接近的块大小边界:
| ((块区域大小)) | FLOOR(-----------------) X 块大小 | ((块大小)) | ( 700 ) | = FLOOR(-----------------) X 32 | ( 32 ) | = 21 x 32 | = 672
|方案 2
|假设您具有一个 3000 页的标识为 11 的缓冲池。而您想创建一个由 |2700 页组成的块区域。因此,您必须运行以下命令:
| db2set DB2_BLOCK_BASED_BP=11,2700
|启动数据库时,将创建标识为 11 的缓冲池,其块区域为 2688 页,页区域为 312 页。如果没有明确给定块大小,则使用缺省值 32。在此示例中,32 不能整除 2700。这意味着,需要使用以下公式来将指定的块区域大小降低到最接近的块大小边界:
| ((块区域大小)) | FLOOR(-----------------) X 块大小 | ((块大小)) | ( 2700 ) | = FLOOR(-----------------) X 32 | ( 32 ) | = 84 x 32 | = 2688