清除 PostgreSQL 中的缓存

我的问题:如何删除数据库的缓存,以便相同的查询总是需要“实时”运行。

背景:我正在尝试改善查询的运行时间。计划是运行一次查询,然后在其上运行 explain 并根据 explain 的输出添加一些相关索引,最后再次运行查询。

有人告诉我,数据库中发生的缓存可能会影响我的测试结果。

什么是清除缓存的最简单方法,或者一般来说有一个干净的测试?

stack overflow Clearing cache in PostgreSQL
原文答案

答案:

作者头像

重新启动数据库将清除数据库的 shared_buffers 缓存。它不会清除 PostgreSQL 严重依赖的文件系统缓存。

在 Linux 上,将 1 写入文件 /proc/sys/vm/drop_caches 将删除 FS 缓存。 (执行此 after 重新启动数据库)但是您需要成为特权用户才能执行此操作。其他操作系统将有其他方法。

令人怀疑的是,这会产生更“真实”的时间。它们很容易变得不那么“真实”。您实际上多久重启一次生产服务器?通常更好的是编写一个驱动程序脚本,重复运行相同的查询但使用不同的参数,以便它访问数据的不同部分。

作者头像

DISCARD 释放与数据库会话关联的内部资源。此命令对于部分或完全重置会话状态很有用。有几个子命令可以释放不同类型的资源; DISCARD ALL 变体包含所有其他变体,并且还重置其他状态。请试试这个

SET SESSION AUTHORIZATION DEFAULT;
RESET ALL;
DEALLOCATE ALL;
CLOSE ALL;
UNLISTEN *;
SELECT pg_advisory_unlock_all();
DISCARD PLANS;
DISCARD SEQUENCES;
DISCARD TEMP;

N.B.:DISCARD ALL 不能在事务块内执行。

作者头像

元数据更改应自动使受影响的计划失效。所以改变表,创建/删除索引应该可以做到,你不需要做任何特别的事情。

enter image description here

ANALYZE 命令也可以做到这一点。