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/
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 |