查看并清除Postgrescaching/caching?

有时我运行一个Postgres查询需要30秒。 然后,我马上运行相同的查询,它需要2秒钟。 看来Postgres有某种caching。 我可以以某种方式看到caching是什么? 我可以强制清除所有caching以进行调整吗?

注意:我基本上在寻找postgres版本的下面的SQL Server命令:

DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS 

但是我也想知道如何看看缓冲区中实际包含的内容。

谢谢你的帮助。

您可以使用pg_buffercache模块查看PostgreSQL缓冲区caching中的内容。 我做了一个名为“ PostgreSQL缓冲区caching内部 ”的演示文稿,解释你所看到的内容,并展示一些更复杂的查询来帮助解释这些信息。

在某些系统上也可以查看操作系统caching,请参阅pg_osmem.py来获得一个简单的示例。

无法轻松清除caching。 在Linux上,您可以停止数据库服务器并使用drop_caches工具清除OS高速caching; 一定要留意那里的警告先运行同步。

我还没有看到任何命令刷新PostgreSQL中的caching。 你看到的可能只是正常的索引和数据caching从磁盘读取并保存在内存中。 由postgresql和操作系统中的caching。 为了摆脱这一切,我知道的唯一方法是:

你应该做的是:

  1. closures数据库服务器(pg_ctl,sudo service postgresql stop等)
  2. echo 3> / proc / sys / vm / drop_caches这将清除OS文件/块caching – 非常重要,虽然我不知道如何在其他操作系统上做到这一点。
  3. 启动数据库服务器

我在我的linux机器上使用这个命令:

 sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start 

它完全摆脱了caching。

我有这个错误。

psql:/cygdrive/e/test_insertion.sql:9:错误:参数53(t_stat_gardien)的types与准备计划(t_stat_avant)时不匹配

我正在寻找冲洗目前的计划,并发现这一点:

DISCARD计划

我有这之间插入,它解决了我的问题。

Greg Smith对drop_caches的回答非常有帮助。 我发现除了删除caching之外,还需要停止并启动postgresql服务。 这里有一个shell脚本可以做到这一点。 (我的环境是Ubuntu 14.04和PostgreSQL 9.3。)

 #!/usr/bin/sudo bash service postgresql stop sync echo 3 > /proc/sys/vm/drop_caches service postgresql start 

我使用第一次使用了19秒的查询进行testing,并在随后的尝试中使用了不到2秒的查询。 运行此脚本后,查询再次花费了19秒。

是的,postgresql肯定有caching。 大小由设置shared_buffers控制。 除此之外,正如前面的回答所提到的那样,也使用了OS文件caching。

如果您想查看caching中的内容,那么可以使用一个名为pg_buffercache的contrib模块(在源代码树的contrib /中,在contrib RPM中,或适用于安装方式的任何地方)。 如何使用它在标准的PostgreSQL文档中列出。

没有办法清除缓冲区caching,除了重新启动服务器。 您可以使用其他答案中提到的命令删除操作系统caching – 只要您的操作系统是Linux。

这是我的捷径

 echo 1 > /proc/sys/vm/drop_caches; echo 2 > /proc/sys/vm/drop_caches; echo 3 > /proc/sys/vm/drop_caches; rcpostgresql stop; rcpostgresql start; 

pg_buffercache模块来查看shared_bufferscaching。 在某些时候,我需要放弃caching来对“冷”caching进行一些性能testing,所以我写了一个pg_dropcache扩展来完成这个工作。 请检查一下。

是的,可以清除共享缓冲区postgrescaching操作系统caching。 解决scheme波纹pipe是为Windows …其他人已经给了Linux解决scheme。

正如很多人已经说过,要清除共享缓冲区,您可以重新启动Postgres(无需重新启动服务器)。 但只是这样做不会清除操作系统caching。

要清除Postgres使用的操作系统caching,在停止服务之后,使用卓越的Sysinternals套件中的优秀RamMaphttps://technet.microsoft.com/en-us/sysinternals/rammap )。 一旦你执行RamMap,只需点击主菜单中的“Empty” – >“Empty Standby List”。

重新启动Postgres,你会看到现在你的下一个查询将会因为没有caching而变得缓慢。

你也可以在不closuresPostgres的情况下执行RamMap,并且可能会得到你想要的“no cache”结果,因为正如人们所说的,与OScaching相比,共享缓冲区通常影响不大。 但是对于一个可靠的testing,我宁愿在清除OScaching之前停止postgres以确保。

注意:AFAIK,我不推荐在使用RamMap的时候清除除了“Standby list”以外的其他东西,因为其他数据在某种程度上被使用,如果你这样做,你可能会导致问题/数据丢失。 请记住,您正在清除内存不仅由postgres文件,而且任何其他应用程序和操作系统。

问候,蒂亚戈湖