From: | Marc Cousin <mcousin(at)sigma(dot)fr> |
---|---|
To: | pgsql-fr-generale(at)postgresql(dot)org |
Cc: | Stephane Bortzmeyer <bortzmeyer(at)nic(dot)fr>, philippe(dot)beaudoin(at)bull(dot)net |
Subject: | Re: Transaction en erreur sur CLOSE ou INSERT |
Date: | 2009-01-12 10:40:16 |
Message-ID: | 200901121140.16761.mcousin@sigma.fr |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-fr-generale |
Le Monday 12 January 2009 11:26:22 Stephane Bortzmeyer, vous avez écrit :
> On Sat, Jan 10, 2009 at 10:41:57AM +0100,
> philippe(dot)beaudoin(at)bull(dot)net <philippe(dot)beaudoin(at)bull(dot)net> wrote
>
> a message of 68 lines which said:
> > 2) Détection de doublon sur INSERT
>
> N'est-ce pas ce qu'on appelle couramment un UPSERT
> <http://en.wikipedia.org/wiki/Upsert> ? Si oui, outre la solution du
> UPDATE-if-rowcount-0-INSERT, il y a celle du
> SELECT-if-not-found-INSERT-else-UPDATE.
Si mais la dernière version (SELECT,INSERT,UPDATE) oblige à faire au moins 2
ordres à chaque fois, ce qui la rendra probablement moins performante (à
cause du dialogue client-serveur). Evidemment, si le moteur supportait des
merges, cela serait la solution au problème, mais en attendant, le plus
efficace est de faire l'opération qui réussira le plus fréquemment d'abord
(ça dépend de l'appli), intercepter l'erreur pour l'autre cas et le traiter
ensuite.
Les 2 versions (insert puis update ou update puis insert) ont des coûts
propres :
- le besoin de créer (implicitement en pl ou explicitement en sql) un
savepoint pour la première
- le besoin d'aller rechercher un enregistrement dans la table pour l'update
(via un index) dans le second.
Le mieux dans ce genre de cas, c'est de connaître l'application et de savoir
quel est l'ordre qui va réussir dans 95% des cas ...
From | Date | Subject | |
---|---|---|---|
Next Message | Stephane Bortzmeyer | 2009-01-12 10:45:35 | Re: Transaction en erreur sur CLOSE ou INSERT |
Previous Message | Stephane Bortzmeyer | 2009-01-12 10:26:22 | Re: Transaction en erreur sur CLOSE ou INSERT |