Footcow Blog - Mot-clé - postgreslLinux, Base de données Postgresql, développement, Internet, emailing et déliverabilité.2024-03-29T11:07:38+01:00Hervé Piedvache alias Bill Footcow pour les intimesurn:md5:ef5d07bad25e414feca607a3b7f2af11DotclearPostgreSQL : Vos index sont-ils utilisés ?urn:md5:4df46f64e306b0bd9cb1c5df09385cd92009-10-23T21:36:00+02:002009-10-23T21:36:00+02:00footcowPostgreSQLbase de donnéesindexpostgresltaillevolumétrie<p><br />
Pour compléter mon précédent billet sur <a href="https://www.footcow.com/index.php/post/2007/12/18/Lespace-disque-de-votre-base-de-donnees">L'espace disque de votre base de données</a>, il est également particulièrement intéressant d'être en mesure d'évaluer si les index volumineux sont véritablement utiles en production.
Un index peut être parfois coûteux en espace de stockage, mais savez-vous si il est véritablement pertinent pour votre applicatif en production ?</p> <p>Quoi de mieux qu'une simple requête pour vous permettre d'un seul coup d'oeil de connaître à la fois :</p>
<ul>
<li>le nom du schéma</li>
<li>le nom de la table concernée</li>
<li>le nom de l'index</li>
<li>le nombre d'utilisation de l'index</li>
<li>la taille de la table</li>
<li>la taille de l'index</li>
<li>le ratio entre la table et son index</li>
</ul>
<p>Exemple :</p>
<pre>
select
s.schemaname as sch,
s.relname as rel,
s.indexrelname as idx,
s.idx_scan as scans,
pg_size_pretty(pg_relation_size(s.relid)) as ts,
pg_size_pretty(pg_relation_size(s.indexrelid)) as "is",
(1.0 * pg_relation_size(s.indexrelid) / pg_relation_size(s.relid))::numeric(10, 2) as ratio
from
pg_stat_user_indexes s
join pg_index i on i.indexrelid=s.indexrelid
left join pg_constraint c on i.indrelid=c.conrelid and array_to_string(i.indkey, ' ') = array_to_string(c.conkey, ' ')
where
i.indisunique is false
and pg_relation_size(s.relid) > 1000000
and s.idx_scan < 100000
and c.confrelid is null
order by
CASE WHEN s.idx_scan < 1000 THEN 0 ELSE s.idx_scan END asc,
pg_relation_size(s.indexrelid) desc,
pg_relation_size(s.relid) desc;
</pre>
<p><strong>Attention</strong> cette requête d'exemple, ne prend en compte que des tables de plus 1 Mo, et les index qui n'ont été scannés que moins de 100 000 fois. Vous pouvez adapter les paramètres de pg_relation_size(s.relid) et idx_scan qui se trouvent dans le WHERE en fonction de vos besoins.</p>
<p>Résultat :</p>
<pre>
sch | rel | idx | scans | ts | is | ratio
--------+---------------------+-------------------------------------------------+-------+---------+------------+-------
public | table_name | ix_table_name | 0 | 24 MB | 16 MB | 0.68
</pre>
<p>On voit donc rapidement que si cet index (ix_table_name) est en production, il n'est à ce jour jamais utilisé, et coûte l'air de rien pas loin de 16 Mb d'espace inutile ... il est donc temps de se demander pourquoi il a été créé ...</p>
<p>Je remercie au passage <a href="https://twitter.com/luddic" hreflang="fr">Luddic</a> qui m'a fait partager son expérience sur ce sujet.</p>https://www.footcow.com/index.php/post/2009/10/23/PostgreSQL-%3A-Vos-index-sont-ils-utilis%C3%A9s#comment-formhttps://feeds.feedburner.com/FootcowBlog/comments/78