【问题标题】:What's the difference between pg_table_size, pg_relation_size & pg_total_relation_size? (PostgreSQL)pg_table_size、pg_relation_size 和 pg_total_relation_size 有什么区别? (PostgreSQL)
【发布时间】:2017-02-01 22:56:07
【问题描述】:

pg_table_size()pg_relation_size()pg_total_relation_size() 有什么区别?

我了解in the documentation 解释的基本区别,但就我的表实际使用的空间而言,这意味着什么?

【问题讨论】:

  • @a_horse_with_no_name 我对“返回该关系的一个分支的磁盘大小(以字节为单位)感到困惑。”在这种情况下,什么是关系和分叉? (我是 PostgreSQL 新手)它还列出了一些 fork 示例:“主数据 fork”、“Free Space Map”、“Visibility Map”和“initialization fork”。那些是什么?哪一项与我的表使用的实际磁盘空间相关?

标签: postgresql


【解决方案1】:

对于随机表:

# select pg_relation_size(20306, 'main') as main,
  pg_relation_size(20306, 'fsm') as fsm,
  pg_relation_size(20306, 'vm') as vm,
  pg_relation_size(20306, 'init') as init,
  pg_table_size(20306), pg_indexes_size(20306) as indexes,
  pg_total_relation_size(20306) as total;
  main  |  fsm  |  vm  | init | pg_table_size | indexes |  total 
--------+-------+------+------+---------------+---------+--------
 253952 | 24576 | 8192 |    0 |        286720 |  196608 | 483328
(1 row)

由此可知,pg_table_sizepg_relation_size 的所有返回值的总和。而pg_total_relation_sizepg_table_sizepg_indexes_size 的总和。

如果您想知道您的表使用了多少空间,请使用pg_table_sizepg_total_relation_size 来考虑它们 - 一个数字是仅表,一个数字是表 + 索引。

查看storage file layout 了解fsmvminit 的含义以及它们如何存储在磁盘上的一些信息。

【讨论】:

    【解决方案2】:

    pg_table_size:指定表使用的磁盘空间,不包括索引(但包括TOAST、空闲空间映射、可见性映射)

    pg_relation_size:关系主数据分叉的大小

    select
          pg_size_pretty(pg_total_relation_size(relid)) as total_size,
          pg_size_pretty(pg_relation_size(relid, 'main')) as relation_size_main,
          pg_size_pretty(pg_relation_size(relid, 'fsm')) as relation_size_fsm,
          pg_size_pretty(pg_relation_size(relid, 'vm')) as relation_size_vm,
          pg_size_pretty(pg_relation_size(relid, 'init')) as relation_size_init,
          pg_size_pretty(pg_table_size(relid)) as table_size,
          pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) as external_size
     from 
          pg_catalog.pg_statio_user_tables
    where 
          schemaname = 'XXXX'
      and relname like 'XXXXXX';
    
    total_size         | 6946 MB
    relation_size_main | 953 MB
    relation_size_fsm  | 256 kB
    relation_size_vm   | 32 kB
    relation_size_init | 0 bytes
    table_size         | 6701 MB
    external_size      | 5994 MB
    

    所以 pg_table_size 不仅是 pg_relation_size 所有返回值的总和,还必须加上 toast 大小

    toast_bytes         | 5748 MB
    

    【讨论】:

    • 外部尺寸是什么意思?
    • total_size - 总表大小 data_size - 表行大小 external_size - 外部元素大小,例如索引等。
    • "具有可能较大条目的列的表将具有关联的 TOAST 表,该表用于对太大而无法正确保存在表行中的字段值进行离线存储。 " - 来自 postgres 文档。
    • @Dineshkumar 你可以看看这个答案stackoverflow.com/a/70397779/8609847
    【解决方案3】:

    我很确定在查看下图后,您将很好地了解各种尺寸关系。在阅读了此答案部分中提到的所有答案并在数据库中为查询分析更多内容后,我制作了此图。

    对于存储文件布局 fsm、vm 和 init 均值,您可以从 link 中获取,就像 @jmelesky 提到的那样。

    【讨论】:

    • 谢谢,这很有帮助。然后似乎 TOAST 的大小可以计算为pg_total_relation_size(relid) - pg_relation_size(relid) - pg_indexes_size(relid)
    • @EM0 没错
    • 在我整理 Postgresql 数据库的指标时遇到了这个问题。文档说明给定 1 个参数(即关系),pg_relation_size 将仅返回主分支。所以@EM0 的计算仍将包括 fms、vm 和 init 以及 TOAST 大小。从 v14 开始,似乎无法将组合的 main、fsm、vm 和 init fork(图中的 relation_size)作为一个方法调用。 postgresql.org/docs/current/…
    • 明白你的意思。然后 toast_size = pg_total_relation_size(relid) - pg_indexes_size(relid) - (pg_relation_size(relid, 'main') + pg_relation_size(relid, 'fsm') + pg_relation_size(relid, 'vm') + pg_relation_size(relid, 'init')) toast_size = pg_table_size(relid) - ((pg_relation_size(relid, 'main') + pg_relation_size(relid, 'fsm') + pg_relation_size(relid, 'vm') + pg_relation_size(relid, 'init)'))
    猜你喜欢
    • 2016-12-11
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 2019-08-25
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多