我们如何从postgresql中选择碎片索引?

-1 postgresql index fragmentation

需要选择碎片达到一定级别的索引。有人可以帮我查询吗?

Lau*_*lbe 5

您可以使用pgstatindexfrompgstattuple扩展来获取所有 B 树索引的叶子碎片:

SELECT i.indexrelid::regclass,
       s.leaf_fragmentation
FROM pg_index AS i
   JOIN pg_class AS t ON i.indexrelid = t.oid
   JOIN pg_opclass AS opc ON i.indclass[0] = opc.oid
   JOIN pg_am ON opc.opcmethod = pg_am.oid
   CROSS JOIN LATERAL pgstatindex(i.indexrelid) AS s
WHERE t.relkind = 'i'
  AND pg_am.amname = 'btree';
Run Code Online (Sandbox Code Playgroud)

这将扫描所有这些索引,并且可能需要很长时间。

请注意,索引的碎片率达到 70% 是正常的。