【问题标题】:Clearing cache in PostgreSQL清除 PostgreSQL 中的缓存
【发布时间】:2021-10-19 07:24:17
【问题描述】:

我的问题: 如何删除数据库的缓存,让同一个查询总是“实时”运行。

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

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

什么是清除缓存的最简单方法,或者为一般的测试准备一块干净的板子?

【问题讨论】:

    标签: postgresql performance caching sql-execution-plan explain


    【解决方案1】:

    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;
    

    注意:DISCARD ALL 不能在事务块内执行。

    【讨论】:

    • 谢谢!上面的内容实际上清除了所谓的“缓存”吗?这是一个克隆数据库,只有我在处理,一次一个查询 - 我真的需要所有这些命令还是有点矫枉过正?另外,什么是“交易块”?
    • 事务块意味着 BEGIN .. COMMIT。该命令主要用于删除当前会话之前的执行计划。
    【解决方案2】:

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

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

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

    【讨论】:

    • 也许重启 + pg_prewarm 会产生最“真实”的时间?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-18
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多