4. 测试环境搭建:使用 pgbench 创建测试表与数据,配置 shared_buffers、effective_cache_size 参数

在进行索引优化与查询性能测试之前,必须搭建一个可复现、可控制的测试环境。本节将指导你使用 PostgreSQL 内置的 pgbench 工具快速生成标准测试表与数据,并详细说明两个核心内存参数——shared_buffers 和 effective_cache_size——的配置原理与测试策略。

4.1 使用 pgbench 创建测试表与数据

pgbench 是 PostgreSQL 自带的基准测试工具,其 -i(initialize)模式可以快速创建标准测试表并填充数据。默认生成的表结构包含 pgbench_accounts、pgbench_branches、pgbench_tellers 和 pgbench_history,其中 pgbench_accounts 是查询测试的核心表。

4.1.1 初始化测试数据库

-- 创建专用测试数据库
CREATE DATABASE pgbench_test;

-- 使用 pgbench 初始化,缩放因子 100(约 1000 万行 accounts 数据)
pgbench -i -s 100 -U postgres -d pgbench_test

参数说明:

  • -i:初始化模式,创建表并加载数据。
  • -s 100:缩放因子(scale factor),控制数据量。默认 pgbench_accounts 表行数为 100000 × scale,即 s=100 时生成约 1000 万行。
  • -U postgres:指定数据库用户。
  • -d pgbench_test:目标数据库名称。

4.1.2 验证表结构与数据量

-- 查看表结构
\d pgbench_accounts

-- 验证数据行数
SELECT count(*) FROM pgbench_accounts;

-- 查看表大小
SELECT pg_size_pretty(pg_total_relation_size('pgbench_accounts'));

初始化完成后,pgbench_accounts 表默认仅在 aid(账户 ID)列上存在主键索引。后续章节的索引优化测试将基于此表添加不同类型的索引。

4.2 核心内存参数配置:shared_buffers 与 effective_cache_size

这两个参数直接影响 PostgreSQL 的缓存行为与查询计划器的成本估算,是缓存回归测试中必须明确配置的变量。

4.2.1 参数对比与配置建议

参数 作用域 默认值 测试推荐值 说明
shared_buffers 共享内存 128MB 总内存的 15%~25% PostgreSQL 自身用于缓存数据页的共享内存缓冲区大小。增大可减少磁盘 I/O。
effective_cache_size 计划器成本 4GB 总内存的 50%~75% 告诉查询计划器操作系统和 PostgreSQL 总共可用于文件系统缓存的内存量。不影响实际分配,只影响索引扫描 vs 顺序扫描的成本估算。
测试环境配置原则:在回归测试中,建议将 shared_buffers 设置为一个固定值(如 2GB),并在不同测试轮次中调整 effective_cache_size,观察其对查询计划选择的影响。切勿在生产环境与测试环境之间混用参数值。

4.2.2 配置方法

-- 方法一:修改 postgresql.conf 文件
shared_buffers = '2GB'
effective_cache_size = '8GB'

-- 方法二:使用 ALTER SYSTEM 命令(无需重启,但需 reload)
ALTER SYSTEM SET shared_buffers = '2GB';
ALTER SYSTEM SET effective_cache_size = '8GB';

-- 重新加载配置
SELECT pg_reload_conf();
注意:shared_buffers 的修改需要重启 PostgreSQL 服务才能生效;effective_cache_size 仅需 pg_reload_conf() 即可。在测试脚本中应明确记录每次测试前的参数快照。

4.3 测试环境参数配置流程

以下流程图展示了从数据库初始化到参数配置的完整步骤:

测试环境搭建流程 测试环境搭建流程 1. 创建测试数据库 2. pgbench -i -s 100 初始化 3. 验证表结构与数据量 4. 配置 shared_buffers(需重启) 5. 配置 effective_cache_size(reload)

4.4 测试环境参数快照记录

为了确保回归测试的可追溯性,每次测试前应记录当前环境的参数快照:

-- 记录关键内存参数
SELECT name, setting, unit, context
FROM pg_settings
WHERE name IN ('shared_buffers', 'effective_cache_size', 'work_mem', 'maintenance_work_mem');

-- 记录当前数据库大小
SELECT pg_size_pretty(pg_database_size('pgbench_test')) AS db_size;

-- 记录 pgbench_accounts 表统计信息
SELECT relname, n_live_tup, n_dead_tup, last_analyze, last_autoanalyze
FROM pg_stat_user_tables
WHERE relname = 'pgbench_accounts';
最佳实践:将上述查询结果保存为 env_snapshot_YYYYMMDD_HH24MI.txt 文件,与测试结果一同归档。这可以避免因环境参数不一致导致的“缓存回归误判”。

4.5 测试数据准备清单

完成本节操作后,应确认以下项目均已就绪:

  • 数据库:pgbench_test 已创建并可用。
  • 测试表:pgbench_accounts 包含约 1000 万行数据,aid 列有主键索引。
  • 内存参数:shared_buffers 设置为 2GB(已重启生效),effective_cache_size 设置为 8GB(已 reload)。
  • 参数快照:已记录当前环境参数并归档。
  • 无干扰进程:测试期间关闭 autovacuum 或将其阈值调高,避免后台进程干扰缓存状态。