代码之家  ›  专栏  ›  技术社区  ›  Bass

我是否需要在PostgreSQL中手动清空临时表?

  •  1
  • Bass  · 技术社区  · 6 年前

    假设我有一个应用程序服务器,它:

    • 使用连接池(允许的空闲连接数相对较高),
    • 可以运行数月
    • 大量使用临时表(不是 DROP '打开ped COMMIT ).

    以上意思是我可能 N “永恒”数据库会话“保持” N 临时表,只有在服务器重新启动时才会删除。

    我很清楚autovacuum守护程序无法访问这些临时表。

    我的问题是,如果我经常 INSERT 的收件人和 DELETE 来自临时表,并且这些表应该“生存”很长时间,那么我需要手动 VACUUM 删除后的表或单个手册 ANALYZE 够了吗?

    当前,如果我执行

    select
      n_tup_del,
      n_live_tup,
      n_dead_tup,
      n_mod_since_analyze,
      vacuum_count,
      analyze_count
    from
      pg_stat_user_tables
    where
      relname = '...'
    order by
      n_dead_tup desc;
    

    我看到了 vacuum_count 始终为零:

    n_tup_del   n_live_tup  n_dead_tup  n_mod_since_analyze vacuum_count    analyze_count
    64      3       64      0           0       16
    50      1       50      26          0       3
    28      1       28      2           0       5
    7       1       7       4           0       4
    3       1       3       2           0       4
    1       6       1       8           0       2
    0       0       0       0           0       0
    

    这可能意味着手册 真空度 确实需要。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Vao Tsun    6 年前

    https://www.postgresql.org/docs/current/static/sql-commands.html

    分析收集有关数据库的统计信息

    真空垃圾收集 并可以选择分析数据库

    真空也可以选择性地进行分析。所以,如果你想要的是最新的统计数据,只要 analyze . 如果要“恢复”未使用的行,则 vacuum . 如果两者都要,请使用 vacuum analyze

        2
  •  2
  •   JosMac    6 年前

    我们有一个24小时以上运行的应用程序,它使用了许多长寿命的、非常繁重的更新温度表,我们对它们进行了分析。但真空有一个问题-如果您尝试在函数中使用,则会出现错误:

    ERROR:  VACUUM cannot be executed from a function or multi-command string
    CONTEXT:  SQL statement "vacuum xxxxxx"
    PL/pgSQL function inline_code_block line 4 at SQL statement
    SQL state: 25001
    

    但后来我们发现,临时表实际上并没有那么大的优势,至少对我们的应用程序来说是如此。从技术上讲,它们是作为数据文件存在于磁盘上的普通表,位于所谓的临时表空间中(可以是pg\u default,也可以在postgresql.conf文件中进行设置)。但它们只使用所谓的temp\u缓冲区,而不加载到shared\u缓冲区中。因此,您必须正确设置temp\u缓冲区,并更多地依赖Linux缓存。正如您已经提到的,autovacuum守护程序“看不到”它们。因此,我们后来转而使用普通表。