我正在使用 postgresql 9.3 并试图了解索引如何以及为什么比它们的表大。
样本输出:
database_name | database_size | table_name | table_size | indexes_size | total_size
---------------+---------------+--------------------------------------------------------------+------------+--------------+------------
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_sends" | 57 MB | 131 MB | 189 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_started" | 17 MB | 39 MB | 56 MB
foo_12345 | 412 MB | "foobar_dev_12345"."fact_mobile_stopped" | 16 MB | 35 MB | 51 MB
我正在运行以下查询来获取表和索引大小。
SELECT
table_catalog AS database_name,
pg_size_pretty(pg_database_size(current_database())) As database_size,
table_name,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
table_catalog,
pg_database_size(current_database()) AS database_size,
table_name,
pg_table_size(table_name) AS table_size,
pg_indexes_size(table_name) AS indexes_size,
pg_total_relation_size(table_name) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name, table_catalog
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;
我的查询正确吗?什么会导致索引变大?
可能的原因:
表上有许多可能重叠的索引;看看
\d
由于更新流失率高而导致的膨胀有时会影响索引而不是表,具体取决于更新模式。检查每个单独索引的大小,看看它是否有意义。
GiST 索引(如果使用)可能非常大
与我最初认为这不是不
TOAST
计算外线存储的问题不同,因为pg_table_size
包括TOAST
表。请注意,如果您担心索引膨胀并决定使用所有涉及的索引,如果表需要进行大量更新(或插入+删除)
REINDEX
,请考虑首先设置非默认值。FILLFACTOR
否则,您将受到写入性能的影响,因为索引没有任何空间来插入新值,因此它将强制进行大量页面拆分并且结构效率较低。