【问题标题】:PostgreSQL index size and value numberPostgreSQL 索引大小和值数
【发布时间】:2018-03-10 05:59:21
【问题描述】:

我正在尝试获取有关索引的统计信息。我正在寻找索引中的总值及其大小。

我只能找到表上所有索引的大小。 表 pg_class 列 relpages 和 reltuples 显示表的值,而不是特定索引级别的值。

此外,函数 pg_indexes_size 将表名作为参数并返回该表的总索引大小。

有没有办法在索引级别获取大小和行号? 我正在使用 PostgreSQL 9.3。

提前感谢您的帮助

【问题讨论】:

  • pg_stat_all_indexes?..
  • pg_stat_all_indexes 仅显示有关读取/获取/扫描的统计信息,而不显示索引中值的实际大小和数量
  • 是的,你提到的pg_indexes_size 显示了磁盘上的索引大小,而不是“实际数据量” - 我认为你可以接受一些近似值? :)
  • pg_indexes_size 显示表的总索引大小。我想要具体的索引大小。
  • 对单个索引使用pg_table_size('index_name') - 但它只会显示磁盘大小,而不是数据量

标签: postgresql indexing postgresql-9.3


【解决方案1】:

pg_table_size('index_name') 用于单个索引 - 但它只会显示磁盘大小,而不是数据量

count(*) 获取当前确切的行数

sum(pg_column_size(column_name)) from table_name 用于估计列数据量

你可以自己试试:

t=# \di+ tbl*
                                    List of relations
 Schema |         Name         | Type  |  Owner   |     Table      |  Size  | Description
--------+----------------------+-------+----------+----------------+--------+-------------
 public | tbl_pkey  | index | postgres | tbl | 156 MB |
 public | tbl_unpic | index | postgres | tbl | 46 MB  |
 public | tbl_x1    | index | postgres | tbl | 57 MB  |
(3 rows)

t=# \dt+ tbl
                        List of relations
 Schema |      Name      | Type  |  Owner   | Size  | Description
--------+----------------+-------+----------+-------+-------------
 public | tbl | table | postgres | 78 MB |
(1 row)

t=# select pg_size_pretty(pg_total_relation_size('tbl'));
 pg_size_pretty
----------------
 337 MB
(1 row)

t=# select 78+57+46+156;
 ?column?
----------
      337
(1 row)

要检查 psql 如何获取单个索引大小,请使用 psql -E.. 运行它。

再一次 - 上面的函数使用它占用的磁盘大小 - 它可能/(可能不会)与实际数据量有很大不同。吸尘在这里有帮助

更新 我不知道您从哪里直接获得索引中的“行”数,因此只能提供间接方式。例如,让我有部分索引,所以“行数”与表不同。我可以用 EXPLAIN 检查估计值(当然你必须为此重复 where 子句)检查 Index Only Scan using 中的 rows=66800 让我知道该索引中的行数(实际上它是 rows=64910 你可以通过explain analyze 或只是运行 count(*))。我在 pg_stats 中找不到相关信息 - 也许有一些公式。我不知道。

【讨论】:

  • Vao Tsun,非常感谢您的回答,但我可能对 Pg 索引维护不是很了解。我运行以下命令:create table stg.test_index_size as select t.id, case when t.id
  • 关于统计表的公平点 - 编辑答案 - 谢谢。关于另一个 - 我想最好问一个新问题
  • 另外 pg_stat_all_indexes 不显示索引的估计行数,而只显示 idx_scan、idx_tup_read 和 idx_tup_fetch。我希望得到 idx_id 50000 和 idx_flag =2
【解决方案2】:

此 sql 将为您提供表和索引大小的详细信息

SELECT
   relname  as table_name,
   pg_size_pretty(pg_total_relation_size(relid)) As "Total Size",
   pg_size_pretty(pg_indexes_size(relid)) as "Index Size",
   pg_size_pretty(pg_relation_size(relid)) as "Actual Size"
   FROM pg_catalog.pg_statio_user_tables 
ORDER BY pg_total_relation_size(relid) DESC;

【讨论】:

  • 可能是正确的:pg_size_pretty(pg_indexes_size(relid)) as "Index Size",
【解决方案3】:

如果您正在寻找所有基表的索引大小的快速摘要,请使用这个方便的查询:

SELECT
    table_name,
    pg_size_pretty(pg_indexes_size(table_name)) AS indexes_size
FROM
    information_schema.tables
WHERE
    table_schema = 'public'
    AND table_type = 'BASE TABLE'
ORDER BY
    pg_indexes_size(table_name) DESC

【讨论】:

    猜你喜欢
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    相关资源
    最近更新 更多