Mac系统下PostgreSQL缓存清理及物化视图性能调优问题
解决PostgreSQL物化视图缓存导致性能测试不准的问题
我完全理解你在优化物化视图生成性能时的困扰——缓存确实会严重干扰真实耗时的对比,尤其是当你想验证优化效果的时候。针对Mac OS High Sierra上的PostgreSQL,这里有几个实用的方法来确保每次测试都是冷启动状态,让你能准确对比优化前后的性能:
一、彻底清除所有缓存(最可靠的方式)
如果时间允许,重启PostgreSQL服务是清空所有内部缓存(包括shared_buffers和查询计划缓存)的最彻底方法:
- 如果你是用Homebrew安装的PostgreSQL:
brew services restart postgresql - 如果你是系统自带或通过其他方式安装的,可以用launchctl操作:
(不确定服务名的话,可以用sudo launchctl stop homebrew.mxcl.postgresql sudo launchctl start homebrew.mxcl.postgresqllaunchctl list | grep postgres查找对应名称)
二、无需重启,单独清除查询计划缓存
如果你不想中断其他数据库连接,可以单独清除PostgreSQL的查询计划缓存(PostgreSQL 9.6及以上版本支持):
SELECT pg_stat_reset_shared('plans');
这个命令会强制PostgreSQL重新生成物化视图刷新的查询计划,避免复用之前的缓存计划导致的耗时偏差。
三、清空操作系统磁盘缓存
PostgreSQL的数据文件可能被Mac的操作系统页缓存所缓存,此时即使PostgreSQL内部缓存清空了,系统缓存依然会加速数据读取。要清空系统缓存,执行:
sync && sudo purge
sync会先将内存中的临时数据写入磁盘,purge则会清空系统的页缓存,确保接下来的物化视图刷新是从磁盘冷读取数据。
四、标准化测试流程
为了确保测试结果准确,每次优化前后都遵循相同的步骤:
- 执行
sync && sudo purge清空系统缓存 - 执行
SELECT pg_stat_reset_shared('plans');清除查询计划缓存 - (可选)重启PostgreSQL服务(如果需要彻底清空
shared_buffers) - 在psql中开启计时功能:
\timing on - 执行物化视图刷新命令:
记录下命令返回的耗时,这样就能得到真实的冷启动耗时,准确对比优化效果了。REFRESH MATERIALIZED VIEW your_materialized_view_name;
另外要注意:如果你的刷新命令用了REFRESH MATERIALIZED VIEW CONCURRENTLY,要确保每次测试都使用相同的刷新模式——并发刷新的逻辑和普通刷新不同,耗时也会有明显差异。
内容的提问来源于stack exchange,提问作者Isaac




