Aller au contenu

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'
  );