Re: Problema Order By en PosgreSQL 8.1

From: "Paolo Lopez" <murphyperu(at)gmail(dot)com>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Problema Order By en PosgreSQL 8.1
Date: 2006-04-07 17:32:02
Message-ID: ab97ec200604071032m55e68c7fy3d887cd49b671fb5@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs pgsql-es-ayuda

A ver, como dice Alvaro mejor es tener un caso de prueba concreto para
asi entender el problema que estoy experimentando.

Pasos para reproduccion del error:

1) Tener instalado postgreSQL 8.1 en windows xp profesional.

2) Crear una base de datos vacía con encoding UTF-8.

3) Crear la siguente tabla , con sus PK , y 40 datos de prueba:

CREATE TABLE tablita (
campoA integer NOT NULL,
campoB integer NOT NULL,
campoC integer NOT NULL,
campoD integer NOT NULL,
campoE integer NOT NULL,
campoF integer NOT NULL,
iddia integer NOT NULL,
numhora integer NOT NULL,
horainicio time without time zone,
horafin time without time zone
);

ALTER TABLE ONLY tablita
ADD CONSTRAINT tablita_pkey PRIMARY KEY (campoA, campoB, campoC,
campoD, campoE, campoF, iddia, numhora);

INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 1, '08:00:00', '08:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 2, '08:45:00', '09:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 3, '09:30:00', '10:15:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 4, '10:15:00', '11:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 5, '11:00:00', '11:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 6, '12:15:00', '13:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 7, '13:00:00', '13:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 1, 8, '13:45:00', '14:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 1, '08:00:00', '08:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 2, '08:45:00', '09:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 3, '09:30:00', '10:15:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 4, '10:15:00', '11:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 5, '11:00:00', '11:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 6, '12:15:00', '13:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 7, '13:00:00', '13:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 2, 8, '13:45:00', '14:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 1, '08:00:00', '08:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 2, '08:45:00', '09:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 3, '09:30:00', '10:15:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 4, '10:15:00', '11:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 5, '11:00:00', '11:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 6, '12:15:00', '13:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 7, '13:00:00', '13:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 3, 8, '13:45:00', '14:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 1, '08:00:00', '08:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 2, '08:45:00', '09:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 3, '09:30:00', '10:15:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 4, '10:15:00', '11:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 5, '11:00:00', '11:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 6, '12:15:00', '13:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 7, '13:00:00', '13:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 4, 8, '13:45:00', '14:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 5, 1, '08:00:00', '08:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 5, 2, '08:45:00', '09:30:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 5, 3, '09:30:00', '10:15:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 5, 4, '10:15:00', '11:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 5, 5, '11:00:00', '11:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 5, 6, '12:15:00', '13:00:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 1, 5, 7, '13:00:00', '13:45:00');
INSERT INTO tablita (campoA, campoB, campoC, campoD, campoE, campoF,
iddia, numhora, horainicio, horafin) VALUES (1, 1, 1, 1,

1, 2, 5, 8, '13:45:00', '14:30:00');

4) Hacer el siguiente query con el ORDER BY que se quiere :

select *
from tablita
WHERE tablita.campoA = 1 AND
tablita.campoB = 1 AND
tablita.campoC = 1 AND
tablita.campoD = 1 AND
tablita.campoE = 1
ORDER BY tablita.idDia , tablita.numHora

Conclusiones :

C1) El ejemplo dado NO ordena en la version 8.1 . Pero si uno va al
pgadmin, y hace click en la tabla "tablita" inmediatamente sale la
ventana de "Guru Hint" con lo siguiente :

Running VACUUM recommended
The estimated rowcount on the table "tablita" deviates
significantly from the actual
rowcount. You should run VACUUM ANALYZE on this table.

posibles opciones ante esto:

C1.1) Si NO se hace caso al "Guru Hint" el ordenamiento
ascendente nunca se
efectuará.

C1.2) Si SI hace caso al "Guru Hint" (vacuum analyze) el
ordenamiento ascendente
se efectuará como se ha previsto.

C2) El ejemplo dado SI ordena en la version 7.4.1 corriendo en cygwin
, y en windows xp professional. No se experimentan problemas.

Y listo señores, el ejemplo pedido se los acabo de proporcionar.
Adicionalmente he puesto todo el ejemplo en un archivo Ejemplo2.zip
que tambien lo estoy enviando.

Espero esta vez haber sido detallado en cuanto a este problema.

Gracias de antemano por la ayuda que me puedan brindar.

Paolo.

On 4/6/06, Jaime Casanova <systemguards(at)gmail(dot)com> wrote:
> > Y segun lo que he leido de esto en el HELP, ademas de otra informacion
> > de la internet, es que el dichoso ORDER BY no se va a efectuar
> > correctamente debido a que forzosamente debe de hacerse un vacuum.
> >
>
> y que parte del HELP te dio a entender eso? si efectivamente da a
> entender eso, habria que proponer una manera distinta de explicar las
> cosas
>
> --
> Atentamente,
> Jaime Casanova
>
> "What they (MySQL) lose in usability, they gain back in benchmarks, and that's
> all that matters: getting the wrong answer really fast."
> Randal L. Schwartz
>

Attachment Content-Type Size
Ejemplo2.zip application/zip 671 bytes

In response to

Responses

Browse pgsql-bugs by date

  From Date Subject
Next Message Miguel 2006-04-07 18:06:25 Re: Problema Order By en PosgreSQL 8.1
Previous Message Tom Lane 2006-04-07 14:18:10 Re: Bug in window xp

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Luis Granados 2006-04-07 17:58:11 Importacion de datos Oracle a Postgres
Previous Message Leonel Nunez 2006-04-07 17:24:39 Re: Optimizacion de servidor