Re: Consulta con query usando limit

From: Emanuel Calvo Franco <postgres(dot)arg(at)gmail(dot)com>
To: juapabsan(at)tutopia(dot)com
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta con query usando limit
Date: 2010-09-10 18:07:02
Message-ID: AANLkTik5zOodvzdL=OyQnL9MMwgANKSURwtmq3SzJiVV@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

> shell->psql colesci
> psql (8.4.2)
> Type "help" for help.
>
> colesci=# select sb.oid,sb.sabocopr,sb.sabofhci from saldbode sb where
> sb.saboarti='1003' and sb.sabofhci <= '2010-09-09' and sb.sabocopr != 0
> order by sb.sabofhci desc ;
>     oid    |     sabocopr     |  sabofhci
> -----------+------------------+------------
>  879676839 | 14693.6960236998 | 2009-12-04
>  879676723 | 14094.6000000000 | 2009-12-04
>  879676823 | 14630.8422959184 | 2009-12-03
>  879669539 | 12682.3767346939 | 2008-11-04
>  879671175 | 14565.3400000000 | 2008-11-04
>  879668961 | 12258.7100000000 | 2008-10-31
> (6 rows)
>
>
>
> Como se observa los registos viene organizados por la fecha de forma
> descendenrte, pero el caso que se tiene es que cuando se desea obtener el
> primer registro del set, el motor, segun se observa decide usar el segundo
> registro, es decir usa como
>
> segundo ordenamiento el oid, puede ser un fallo? como por obtener el primer
> registro, ? , por que razon la segunda consulta
>
> me arroja el segundo registro y no el primero ?
>
>
>
> colesci=# select sb.oid,sb.sabocopr,sb.sabofhci from saldbode sb where
> sb.saboarti='1003' and sb.sabofhci <= '2010-09-09' and sb.sabocopr != 0
> order by sb.sabofhci desc limit 1;
>     oid    |     sabocopr     |  sabofhci
> -----------+------------------+------------
>  879676723 | 14094.6000000000 | 2009-12-04
> (1 row)
>
> colesci=#
>
> Y claro el informe que estabamos evaluando nos arrojo diferencias entre la
> version  7.3.7 y 8.4.2
>
>

Lo que sucede es que 7.3 utiliza un algoritmo de recuperación de datos
distinto a >8. De hecho, para esta compatibilidad creo que deberías desactivar
synchronize_seqscan (obliga a buscar en el orden de los bloques) u agregar
la columna OID en tu tabla y ordenar por la misma.

De hecho, en teoría, si esos registros están en bloques distintos y haces
un VACUUM FULL (obligando a cambiar la ubicación física de dicho registro)
puede ser que te retorne el otro registro.

El motivo es que seguramente el segundo registro estaba en un bloque
'más cercano' o en caché.

Solución, agregar una columna más en el order by u ordernar por
por ctid si no quires agregar OID. Además recuerda que oid no viene por defecto
en las versiones superiores a 8.

--
              Emanuel Calvo Franco
        www.emanuelcalvofranco.com.ar
     Join: http://www.thevenusproject.com/

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Carlos Edward Grajales Marmolejo 2010-09-10 18:55:15 Re: Ayuda
Previous Message Francisco Delgado 2010-09-10 17:19:56 PostgreSQL en España