Index redondants¶
La requête suivante détecte les index peut-être redondants contenus dans d’autres.
Elle est extraite du module pgcluu_collectd
de pgCluu de Gilles Darold.
Attention
Cette liste est à prendre avec précaution. Certains index à première vue redondants peuvent être utiles et parfois vitaux :
- index partiels ;
- index sur une seule colonne plus petits qu’un gros index composé.
SELECT
date_trunc('seconds', now()),
current_database(),
pg_get_indexdef(indexrelid) AS contained,
pg_get_indexdef(index_backward) AS container
FROM
(
SELECT
indexrelid,
indrelid,
array_to_string(indkey, '+') AS colindex,
indisunique AS is_unique,
lag(array_to_string(indkey, '+')) OVER search_window AS colindexbackward,
lag(indexrelid) OVER search_window AS index_backward,
lag(indisunique) OVER search_window AS is_unique_backward
FROM
pg_index WINDOW search_window AS (
PARTITION BY indrelid
ORDER BY array_to_string(indkey, '+')
DESC)
) AS tmp
WHERE
(
colindexbackward LIKE (colindex || '+%')
OR colindexbackward = colindex
)
AND (
is_unique_backward <> is_unique
OR (
not is_unique_backward
AND NOT is_unique
)
)
AND NOT is_unique
AND coalesce(
regexp_match(pg_get_indexdef(indexrelid), ' (WHERE .*)'):: text, 'A'
) = coalesce(
regexp_match(pg_get_indexdef(index_backward), ' (WHERE .*)'):: text, 'A'
);