DB2 - 缓冲池
Db2 - 缓冲池
Section titled “Db2 - 缓冲池”本章将向您介绍缓冲池(Buffer Pools),它是Db2中数据库性能调优的关键组件。
缓冲池是Db2数据库管理器分配的数据库服务器主内存(RAM)中的专用部分。它的主要目的是作为从磁盘读取或写入的表和索引数据页面的高速缓存。通过将频繁访问的数据保留在内存中,Db2显著减少了缓慢的磁盘I/O操作,从而带来了显著的性能提升。
每个数据库都带有一个名为IBMDEFAULTBP的默认缓冲池。当请求数据时,Db2首先检查数据页是否在缓冲池中。如果存在(即“命中”),数据将直接从内存中检索。如果不存在(即“未命中”),则该页面会首先从磁盘读取到缓冲池中,然后再提供给应用程序。在缓冲池中被修改但尚未写回磁盘的页面称为“脏页”(dirty pages)。这些脏页由数据库代理程序定期刷新到磁盘。
表空间与缓冲池的关系
Section titled “表空间与缓冲池的关系”Db2中的一个关键规则是每个表空间都必须与特定的缓冲池关联。这种关联在页面大小方面是严格的一一对应:表空间只能与具有完全相同页面大小的缓冲池关联。例如,使用8 KB页面大小创建的表空间必须使用也定义为8 KB页面大小的缓冲池。然而,一个缓冲池可以服务多个表空间(只要它们的页面大小匹配)。
战略性地创建多个缓冲池可以实现细粒度的性能调优。您可以将不同类型的数据,例如将索引数据与表数据分离,或者将高事务量的OLTP数据与大扫描的报告数据分离,放入不同的缓冲池中,以优化内存使用和缓存效率。
现代缓冲池管理:自调优内存管理器(STMM)
Section titled “现代缓冲池管理:自调优内存管理器(STMM)”现代Db2版本强烈建议使用自调优内存管理器(Self-Tuning Memory Manager,STMM)。当缓冲池的大小设置为AUTOMATIC时,STMM会根据当前工作负载动态调整其大小。它智能地在各种消费者(如缓冲池、排序堆等)之间分配可用内存,以优化整体数据库性能。在大多数情况下,启用STMM是推荐的最佳实践,它能简化管理,并且通常比手动调优产生更好的结果。
查询缓冲池信息
Section titled “查询缓冲池信息”要列出当前数据库中的所有缓冲池及其配置,您可以查询系统编目视图SYSCAT.BUFFERPOOLS。
SELECT BPNAME, BUFFERPOOLID, PAGESIZE, NPAGESFROM SYSCAT.BUFFERPOOLS;为了监控缓冲池的有效性,您可以使用诸如MON_GET_BUFFERPOOL之类的监控函数。此示例计算了命中率(hit ratio),它表示从内存中满足的页面请求的百分比。
SELECT BP_NAME, POOL_DATA_L_READS, POOL_DATA_P_READS, CASE WHEN POOL_DATA_L_READS = 0 THEN 0 ELSE DEC(100 * (1 - (FLOAT(POOL_DATA_P_READS) / FLOAT(POOL_DATA_L_READS))), 5, 2) END AS HIT_RATIO_PERCENTFROM TABLE(MON_GET_BUFFERPOOL('',-2));高命中率(通常高于95%)是理想的,它表明缓冲池正在有效地缓存数据。
创建缓冲池时,您必须指定一个唯一的名称和页面大小。页面大小必须与您打算分配给它的表空间相匹配。可用的页面大小有4 KB、8 KB、16 KB和32 KB。
语法:
CREATE BUFFERPOOL <bufferpool_name>IMMEDIATE -- 或 DEFERREDSIZE <number_of_pages> -- 用于手动设置大小,或设置为 SIZE AUTOMATIC 以启用 STMMPAGESIZE <page_size_in_bytes>; -- 例如,8 KB 为 8192示例:创建一个名为BP_DATA_8K的新8 KB缓冲池,其大小由STMM自动管理。
CREATE BUFFERPOOL BP_DATA_8KIMMEDIATESIZE AUTOMATICPAGESIZE 8192;输出:
DB20000I The SQL command completed successfully.只有当没有表空间当前分配给缓冲池时,您才能删除它。默认缓冲池IBMDEFAULTBP不能被删除。
语法:
DROP BUFFERPOOL <bufferpool_name>;示例:删除BP_DATA_8K缓冲池。
DROP BUFFERPOOL BP_DATA_8K;输出:
DB20000I The SQL command completed successfully.