You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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.postgresql
    
    (不确定服务名的话,可以用launchctl list | grep postgres查找对应名称)

二、无需重启,单独清除查询计划缓存

如果你不想中断其他数据库连接,可以单独清除PostgreSQL的查询计划缓存(PostgreSQL 9.6及以上版本支持):

SELECT pg_stat_reset_shared('plans');

这个命令会强制PostgreSQL重新生成物化视图刷新的查询计划,避免复用之前的缓存计划导致的耗时偏差。

三、清空操作系统磁盘缓存

PostgreSQL的数据文件可能被Mac的操作系统页缓存所缓存,此时即使PostgreSQL内部缓存清空了,系统缓存依然会加速数据读取。要清空系统缓存,执行:

sync && sudo purge

sync会先将内存中的临时数据写入磁盘,purge则会清空系统的页缓存,确保接下来的物化视图刷新是从磁盘冷读取数据。

四、标准化测试流程

为了确保测试结果准确,每次优化前后都遵循相同的步骤:

  1. 执行sync && sudo purge清空系统缓存
  2. 执行SELECT pg_stat_reset_shared('plans');清除查询计划缓存
  3. (可选)重启PostgreSQL服务(如果需要彻底清空shared_buffers
  4. 在psql中开启计时功能:\timing on
  5. 执行物化视图刷新命令:
    REFRESH MATERIALIZED VIEW your_materialized_view_name;
    
    记录下命令返回的耗时,这样就能得到真实的冷启动耗时,准确对比优化效果了。

另外要注意:如果你的刷新命令用了REFRESH MATERIALIZED VIEW CONCURRENTLY,要确保每次测试都使用相同的刷新模式——并发刷新的逻辑和普通刷新不同,耗时也会有明显差异。

内容的提问来源于stack exchange,提问作者Isaac

火山引擎 最新活动