macos - Mac w/PostgreSQL flush/empty cache for performance tuning

标签 macos postgresql performance caching

这个问题会有点具体,因为我已经尝试了很多东西,但没有一个对我有用。我希望外面有人可能有其他想法。

我在 Mac (OS High Sierra) 上使用 PostgreSQL,我正在尝试提高生成物化 View 的性能,但无法再比较我的更改,因为 PostgreSQL 似乎已经缓存了物化 View 。过去生成实体化 View 需要大约 12 分钟,现在只需不到 10 秒(相同的代码,我还原了更改)。

我使用 EXPLAIN (ANALYZE, BUFFERS) 来确认几乎所有被查询获取以生成物化 View 的数据都是命中(缓存),并且几乎没有磁盘读取

我不知道信息是否缓存在 PostgreSQL 的共享缓冲区或操作系统缓存中,因为此时我已经做了一些我认为会清除两者的事情。

这是我尝试清空 PostgreSQL 缓存的方法:

  1. 使用 brew services stop postgres 重新启动 PostgreSQL 服务器,然后 brew services start postgres(还尝试在两者之间调用 sync && sudo purge) .我通过 top 和 grep 确认 postgres 不再运行。
  2. 使用了 DISCARD ALL,以及 DISCARD 及其其他选项。
  3. 将 postgresql.conf 中的 shared_buffers 设置为最小值 (128k)。
  4. 安装、编译和使用 pg_dropcache .
  5. 我看了一会儿 pg_ctl,但我承认我不知道如何使用它。我收到错误未指定数据库目录且未设置环境变量 PGDATA,并且我不确定要为我的情况设置 -D/pgdata 选项。
  6. 真空。我知道这不应该有影响,但我还是试过了。

这是我尝试清空操作系统缓存的方法:

  1. 重新启动计算机。
  2. 清空 ~/Library/Caches/Library/Caches
  3. sync && sudo purge 以及 sync && purge
  4. 以安全模式启动。

我还尝试了其他一些我认为会强制 PostgreSQL 从头开始​​生成物化 View 的方法(这些方法会很好,因为我现在只需要在开发中测试性能):

  1. 克隆了物化 View 中使用的主表,并从克隆中生成了物化 View 。它仍然在 10 秒内生成。
  2. 打乱了一些列值(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/

相关文章:

sql - 获取具有日期范围的自定义聚合的增量

python - Django ORM 和 PostgreSQL 连接限制

php - 在 MySQL 端或 PHP 端处理此查询更好吗?

macos - 未找到 vm_region

macos - OS X 10.6 上的 emacs

c++ - 编译器是否有用 C++ 中的推断类型替换 auto 的功能?

node.js - NodeJS,pg-promise 和数组作为参数

C# 代码大小和代码执行时间

database - 基于键值的数据库,有人可以向我解释如何实际使用它们吗?

MacOS 上的 R 错误 : vector memory exhausted (limit reached? )