Re: SQL pour trouver le premier libre?

From: Jean-Paul Argudo <jean-paul(at)argudo(dot)org>
To: Pierre Couderc <pierre(at)couderc(dot)cc>
Cc: pgsql-fr-generale(at)postgresql(dot)org
Subject: Re: SQL pour trouver le premier libre?
Date: 2006-06-03 14:58:20
Message-ID: 4481A38C.6050002@argudo.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-fr-generale

Re,

Il y a une autre solution, qui me paraît être encore meilleure, et bien
moins coûteuse, la voici:

explain
SELECT (x.a+1) AS id_disponible
FROM nombres x
LEFT JOIN nombres y
ON ((x.a + 1) = y.a)
WHERE y.a IS NULL
ORDER BY x.a
LIMIT 1;
QUERY PLAN
-----------------------------------------------------------------------------------
Limit (cost=0.00..1.58 rows=1 width=4)
-> Nested Loop Left Join (cost=0.00..22.09 rows=14 width=4)
Join Filter: (("outer".a + 1) = "inner".a)
Filter: ("inner".a IS NULL)
-> Index Scan using id_a on nombres x (cost=0.00..3.15
rows=14 width=4)
-> Seq Scan on nombres y (cost=0.00..1.14 rows=14 width=4)
(6 lignes)

test2=> SELECT (x.a+1) AS id_disponible FROM nombres x LEFT JOIN nombres
y ON ((x.a + 1) = y.a) WHERE y.a IS NULL ORDER BY x.a LIMIT 1;
id_disponible
---------------
4
(1 ligne)

Si vous constatez des lenteurs, il vous faudra créer un index sur a (si
ce n'est pas déjà fait, ce dont je doute):

create unique index id_a on nombres(a);

Et un index fonctionnel comme suit:

create index id_a_suivant on nombres ((a+1));

En tout cas, cette écriture sera moins coûteuse que celle avec le EXCEPT.

Merci à John Hansen (appeljack) pour cette idée.

Cordialement,

--
Jean-Paul Argudo
www.PostgreSQLFr.org

In response to

Responses

Browse pgsql-fr-generale by date

  From Date Subject
Next Message Daniel Verite 2006-06-05 16:45:08 Re: Blocage pg_dump sur erreur
Previous Message Marc Cousin 2006-06-03 10:55:32 Re: SQL pour trouver le premier libre?