PostgreSQL索引大小和值编号

时间:2017-09-28 13:10:10

标签: postgresql indexing postgresql-9.3

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

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

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

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

提前感谢您的帮助

3 个答案:

答案 0 :(得分:6)

单个索引的

pg_table_size('index_name') - 但它只显示磁盘大小,而不是数据量

count(1)获取精确的当前行数

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 ..

运行它

再次 - 上面的函数与磁盘大小一起工作 - 它可能/(可能不)与实际数据量有所不同。吸尘有助于此

<强>更新 我不知道你在哪里可以直接获得&#34;行数#34;在索引中,因此只能提供间接方式。例如,让我有部分索引,所以&#34;行数&#34;与表不同。我可以用EXPLAIN检查估计(当然你必须重复where子句)检查rows=66800中的Index Only Scan using让我对该索引中的行数有所了解(实际上它是{{1}您可以通过rows=64910或仅运行explain analyze获取。我无法在pg_stats中找到相关信息 - 可能还有一些公式......不知道。

答案 1 :(得分:2)

这个sql会给你表和索引大小的详细信息

SELECT
   relname  as table_name,
   pg_size_pretty(pg_total_relation_size(relid)) As "Total Size",
   pg_size_pretty(pg_total_relation_size(relid) - pg_relation_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;

答案 2 :(得分:-1)

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

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