Re: Update et effet sur les INDEX

From: Rodolphe Quiédeville <rodolphe(at)quiedeville(dot)org>
To: "pgsql-fr-generale" <pgsql-fr-generale(at)postgresql(dot)org>
Subject: Re: Update et effet sur les INDEX
Date: 2014-07-04 06:53:17
Message-ID: yi71tu1ipia.fsf@elz.rodo.lan
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale


Guillaume Lelarge <guillaume(at)lelarge(dot)info> writes:

> Le 3 juillet 2014 22:58, Rodolphe Quiédeville <rodolphe(at)quiedeville(dot)org> a
> écrit :
>
>> Bonsoir,
>>
>> J'ai cherché en vain ce soir des informations sur la mécanique interne à
>> PG lors d'un UPDATE et les effets sur les index, je cherche à mesurer
>> l'impact de performance entre deux requêtes, une spécifiant uniquement
>> la colonne à modifier et une autre indiquant toutes les colonnes même
>> celle qui ne sont pas modifiées.
>> Exemple
>>
>> CREATE TABLE foo (id integer, name varchar(255), active boolean);
>> CREATE INDEX foo_id ON foo(id);
>> CREATE INDEX foo_name ON foo(name);
>>
>> INSERT INTO foo (id, name, active) VALUES (1, 'Barack', false);
>> INSERT INTO foo (id, name, active) VALUES (2, 'Angela', false);
>>
>> #La question est si je fais un update :
>>
>> UPDATE foo SET active = true WHERE id = 1;
>>
>> L'index foo_name ne sera pas mis à jour car name n'est pas modifié.
>>
>>
> Il sera mis à jour car l'adresse de la ligne changera. Sauf si la nouvelle
> adresse se trouve sur le même bloc que l'ancienne.
>
>
>> Mais si je fais (considérant toujours que active=false), en ajoutant la
>> colonne name mais avec la même valeur.
>>
>> UPDATE foo SET name='Barack', active = true WHERE id = 1;
>>
>> Est-ce que PG met à jour l'index où il détecte que la valeur n'a pas
>> changé dans la ligne ?
>
>
> Il met à jour l'index.
>
>
>> Je suppose que oui mais j'aimerai tout de même
>> une confirmation, et si vous avez quelques pointeurs là-dessus ça
>> m'intéresse. Je cherche à comprendre tous les impacts en terme de perf,
>> et même si il ne met pas à jour l'index le traitement entraine-t'il une
>> sur consommation non négligeable ?
>>
>
> Bon courage, sincèrement. Il y a tellement de cas possibles que ça rend
> l'analyse très compliquée.
>
> Mon seul conseil est de ne pas mettre à jour une ligne pour rien car ça
> sera forcément plus coûteux que de ne pas la mettre à jour. Même si vous
> faites un bête "UPDATE t1 set c1=c1;", vous dupliquez la ligne, ce qui a
> une conséquence immédiate en écriture de la table et des index, et une
> conséquence retardée au niveau de la maintenance par VACUUM de la table. Je
> pense que, sur ce bête truc, on peut gagner beaucoup. Ensuite, le coup des
> colonnes me paraît plus discutable.

Bonjour,

Merci pour la réponse, bien évidemment que je partage le point du vue de
ne rien faire quand c'est inutile, mais là on s'est un peu éloigné du
cas décris, l'UPDATE est fait car la donnée change.

Si ce sont des principes que j'applique dans mes développements il est
différent de convaincre les gens de suivre les bonnes pratiques, et
c'est pour cela que je cherche des arguments solides et clairs auprès
vous ici pour étayer mon argumentation.

Bonne journée

--
Rodolphe Quiédeville - Expert Tsung
Consulting en performance des SI(G)
http://blog.rodolphe.quiedeville.org
Tel : 06 13 79 63 41

--
Envoi via la liste pgsql-fr-generale (pgsql-fr-generale(at)postgresql(dot)org)

In response to

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Rodolphe Quiédeville 2014-07-04 07:04:21 Re: Update et effet sur les INDEX
Previous Message Dimitri Fontaine 2014-07-03 22:42:40 Re: Update et effet sur les INDEX