这个问题会有点具体,因为我已经尝试了很多东西,但没有一个对我有用。我希望外面有人可能有其他想法。
我在 Mac (OS High Sierra) 上使用 PostgreSQL,我正在尝试提高生成物化 View 的性能,但无法再比较我的更改,因为 PostgreSQL 似乎已经缓存了物化 View 。过去生成实体化 View 需要大约 12 分钟,现在只需不到 10 秒(相同的代码,我还原了更改)。
我使用 EXPLAIN (ANALYZE, BUFFERS)
来确认几乎所有被查询获取以生成物化 View 的数据都是命中
(缓存),并且几乎没有磁盘读取
。
我不知道信息是否缓存在 PostgreSQL 的共享缓冲区或操作系统缓存中,因为此时我已经做了一些我认为会清除两者的事情。
这是我尝试清空 PostgreSQL 缓存的方法:
- 使用
brew services stop postgres
重新启动 PostgreSQL 服务器,然后brew services start postgres
(还尝试在两者之间调用sync && sudo purge
) .我通过 top 和 grep 确认 postgres 不再运行。 - 使用了
DISCARD ALL
,以及 DISCARD 及其其他选项。 - 将 postgresql.conf 中的 shared_buffers 设置为最小值 (128k)。
- 安装、编译和使用 pg_dropcache .
- 我看了一会儿
pg_ctl
,但我承认我不知道如何使用它。我收到错误未指定数据库目录且未设置环境变量 PGDATA
,并且我不确定要为我的情况设置 -D/pgdata 选项。 真空
。我知道这不应该有影响,但我还是试过了。
这是我尝试清空操作系统缓存的方法:
- 重新启动计算机。
- 清空
~/Library/Caches
和/Library/Caches
。 sync && sudo purge
以及sync && purge
。- 以安全模式启动。
我还尝试了其他一些我认为会强制 PostgreSQL 从头开始生成物化 View 的方法(这些方法会很好,因为我现在只需要在开发中测试性能):
- 克隆了物化 View 中使用的主表,并从克隆中生成了物化 View 。它仍然在 10 秒内生成。
- 打乱了一些列值(first_name、last_name、mem_id(不是主键))。它仍然在 10 秒内生成(并且物化 View 已使用新的扰乱值正确生成)。
我卡住了,不知道该尝试什么了。任何想法/帮助将不胜感激!
最佳答案
重新启动计算机会清除两个缓存(除非您使用 pg_prewarm
中的 autoprewarm
,但该代码尚未发布)。如果重新启动没有导致问题再次出现,那么您要么已经永久解决了问题,要么一开始就没有正确理解它。
一种可能性是 ANALYZE(手动或自动)修复了一些过时的统计信息,这些统计信息导致物化 View 刷新使用了糟糕的计划。另一种可能性是 VACUUM 意味着现在仅索引扫描不再需要访问表页,因为它们被标记为全部可见。如果是其中任何一种情况,并且如果您出于某种原因想要重现该问题,则必须将数据库恢复到运行 VACUUM 或 ANALYZE 之前的状态。
EXPLAIN (ANALYZE, BUFFERS)
只知道 shared_buffers。如果仅命中操作系统缓存,EXPLAIN (ANALYZE, BUFFERS)
仍会将其报告为未命中。如果您刚刚重新启动 PostgreSQL,并且第一次运行的查询显示大部分缓冲区命中
,只有少数未命中
,这表明您的查询一次又一次地命中相同的缓冲区。例如,这在仅索引扫描中很常见,因为对于每一行,它都会引用少数可见性 map 页面中的一个。
关于macos - Mac w/PostgreSQL flush/empty cache for performance tuning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180914/