有时我运行Postgres查询需要30秒.然后,我立即运行相同的查询,需要2秒.似乎Postgres有某种缓存.我可以以某种方式看到缓存持有什么?我是否可以强制清除所有缓存以进行调整?
注意:我基本上是在寻找以下SQL Server命令的postgres版本:
DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS
但我还想知道如何查看缓冲区中实际包含的内容.
谢谢你的帮助.
您可以使用pg_buffercache模块查看PostgreSQL缓冲区缓存中的内容.我做了一个名为" Inside the PostgreSQL Buffer Cache " 的演示文稿,它解释了你所看到的内容,并展示了一些更复杂的查询来帮助解释随之而来的信息.
在某些系统上也可以查看操作系统缓存,有关一个粗略的示例,请参阅pg_osmem.py.
没有办法轻松清除缓存.在Linux上,您可以停止数据库服务器并使用drop_caches工具清除操作系统缓存; 一定要注意那里的警告,先运行同步.
我还没有看到任何命令来刷新PostgreSQL中的缓存.您所看到的可能只是从磁盘读取并保存在内存中的普通索引和数据缓存.通过postgresql和OS中的缓存.为了摆脱这一切,我所知道的唯一方法:
你应该做的是:
关闭数据库服务器(pg_ctl,sudo service postgresql stop等)
echo 3>/proc/sys/vm/drop_caches这将清除OS文件/块缓存 - 虽然我不知道如何在其他操作系统上执行此操作,但非常重要.
启动数据库服务器
我在我的linux盒子上使用这个命令:
sync; /etc/init.d/postgresql-9.0 stop; echo 1 > /proc/sys/vm/drop_caches; /etc/init.d/postgresql-9.0 start
它完全摆脱了缓存.
Greg Smith关于drop_caches的回答非常有帮助.我确实发现有必要停止并启动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秒的查询进行测试,并且在后续尝试中花费不到2秒.运行此脚本后,查询再次耗时19秒.
我有这个错误.
psql:/cygdrive/e/test_insertion.sql:9:ERROR:参数53的类型(t_stat_gardien)与准备计划时的类型(t_stat_avant)不匹配
我正在寻找冲洗当前的计划,并发现了这个:
丢弃计划
我在插入之间有这个,它解决了我的问题.
是的,postgresql肯定有缓存.大小由shared_buffers设置控制.除此之外,还有前面提到的答案,也使用了OS文件缓存.
如果你想查看缓存中的内容,可以使用一个名为pg_buffercache的contrib模块(在contrib /中,在contrib树中,在contrib RPM中,或者在适合你安装它的地方).如何使用它列在标准的PostgreSQL文档中.
除了重新启动服务器之外,没有办法清除缓冲区缓存.您可以使用其他答案中提到的命令删除操作系统缓存 - 前提是您的操作系统是Linux.
是的,可以清除共享缓冲区postgres缓存和 OS缓存.解决方案贝娄是针对Windows ...其他人已经给出了Linux解决方案.
正如许多人已经说过的,要清除共享缓冲区,您只需重启Postgres(无需重启服务器).但这样做不会清除操作系统缓存.
要清除Postgres使用的操作系统缓存,请在停止服务后使用优秀的Sysinternals Suite中的优秀RamMap(https://technet.microsoft.com/en-us/sysinternals/rammap).执行RamMap后,只需在主菜单中单击"清空" - >"清空待机列表".
重新启动Postgres,你会看到由于没有缓存,你的下一个查询将会很慢.
你也可以在不关闭Postgres的情况下执行RamMap,并且可能会有你想要的"无缓存"结果,因为正如人们已经说过的,与OS缓存相比,共享缓冲区通常没什么影响.但是对于可靠的测试,我宁愿在清除操作系统缓存之前停止postgres以确保.
注意:AFAIK,我不建议在使用RamMap时清除除"待机列表"之外的其他内容,因为其他数据以某种方式被使用,如果你这样做,你可能会导致问题/数据松散.请记住,您正在清除不仅由postgres文件使用的内存,还包括任何其他应用程序和操作系统.
此致,Thiago L.
这是我的捷径
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_buffers
缓存的模块.并且在某些时候我需要删除缓存以对"冷"缓存进行一些性能测试,因此我编写了一个pg_dropcache扩展来完成此操作.请检查一下.