我正在尝试获取索引的统计信息。我想要的是索引中的总值和它的大小。
我只能找到表上所有索引的大小。表 pg_class
的列 relpages
和 reltuples
显示了表的值,而不是特定索引级别的值。
此外,函数 pg_indexes_size
以表名作为参数,并返回该表的总索引大小。
有没有一种方法可以获取索引级别的大小和行数?我正在使用 PostgreSQL 9.3。
我正在尝试获取索引的统计信息。我想要的是索引中的总值和它的大小。
我只能找到表上所有索引的大小。表 pg_class
的列 relpages
和 reltuples
显示了表的值,而不是特定索引级别的值。
此外,函数 pg_indexes_size
以表名作为参数,并返回该表的总索引大小。
有没有一种方法可以获取索引级别的大小和行数?我正在使用 PostgreSQL 9.3。
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
运行。
再次强调-上面的函数用于处理磁盘占用大小-它与实际数据量可能相差很大。这时候需要进行Vacuum操作。
更新
我不知道你直接从索引中获取"行数"的位置,因此我只能提供间接的方法。例如,让我拥有一个部分索引,所以索引中的“行数”与表中的行数不同。我可以通过使用EXPLAIN(当然必须重复使用WHERE
子句)检查Index Only Scan using
中的rows=66800
来估算索引中的行数(实际上是rows=64910
,可以通过explain analyze
或者直接运行count(*)
来获取)。我无法在pg_stats
中找到相关信息-也许有一些公式,我不知道。
此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"
作为“索引大小”, - Dek4nicepg_size_pretty(pg_table_size(relid))as“Data Size”
,这将为您提供数据大小+索引大小=总大小。有关更多信息,请参见https://dev59.com/QlgQ5IYBdhLWcg3w7ofY#70397779。 - Samuli Asmala这是检索以下信息的查询:
总大小
所有索引的总大小
表大小
索引大小
估计的表行数
SELECT i.relname "Table Name",indexrelname "Index Name",
pg_size_pretty(pg_total_relation_size(relid)) As "Total Size",
pg_size_pretty(pg_indexes_size(relid)) as "Total Size of all Indexes",
pg_size_pretty(pg_relation_size(relid)) as "Table Size",
pg_size_pretty(pg_relation_size(indexrelid)) "Index Size",
reltuples::bigint "Estimated table row count"
FROM pg_stat_all_indexes i JOIN pg_class c ON i.relid=c.oid
WHERE i.relname='uploads'
也许对某些人来说这会很有用。
也许对某些人来说这会很有用。
pg_stat_all_indexes
是什么? - Vao Tsunpg_indexes_size
显示的是索引在磁盘上占用的空间大小,而不是“实际数据量” - 我以为你可以接受一些近似值? :) - Vao Tsunpg_table_size('index_name')
函数获取其在磁盘上的大小,但这只能显示索引本身的大小,无法显示其中的数据量。 - Vao Tsun