Re: Consulta

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: "Viveros A(dot), Guillermo M(dot)" <gviveros(at)safp(dot)cl>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Consulta
Date: 2005-09-07 20:52:07
Message-ID: 20050907205207.GD8250@surnet.cl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

On Wed, Sep 07, 2005 at 03:14:21PM -0400, Viveros A., Guillermo M. wrote:

Estimado Guillermo,

> Sin embargo, al modificar el query y poner el número entre apóstrofes,
> se tiene lo siguiente:
>
> [un recorrido de indice]

> que es lo que uno realmente esperaría.
>
> ¿Alguien me podría explicar cuando es necesario utilizar apóstrofes?

Cuando el tipo asignado al literal y el tipo de la columna no coinciden.
Los literales de numeros enteros que sean menores que INT_MAX (menores
que dos mil millones y fraccion), son clasificados como int4 (tambien
conocido como tipo INTEGER). Si el tipo de la columna no es INTEGER, el
optimizador decide que el tipo no coincide con aquel del indice, y no
puede usarlo; por lo tanto revierte a usar un recorrido secuencial.

Un literal entre comillas se clasifica de tipo "unknown". Esto permite
que el optimizador le ponga la etiqueta que le convenga, por eso puede
escoger int8 y por eso usa el indice.

Otra alternativa es reescribir la consulta usando un cast:

EXPLAIN SELECT count(*) from movi where cuen_numcue=1000829::<tipo>;
EXPLAIN SELECT count(*) from movi where cuen_numcue=cast(1000829 as <tipo>);

donde <tipo> es el tipo de la columna cuen_numcue, ya sea int8,
numeric, etc. Eso adorna el literal con el tipo apropiado, de modo que
el optimizador ya no cree estar lidiando con un int4 inapropiado.

Observa que en 8.0 ya no es necesario hacer esto, puesto que el
optimizador se volvio subitamente mas inteligente.

Saludos,

--
Alvaro Herrera -- Valdivia, Chile Architect, www.EnterpriseDB.com
"Los dioses no protegen a los insensatos. Éstos reciben protección de
otros insensatos mejor dotados" (Luis Wu, Mundo Anillo)

In response to

  • Consulta at 2005-09-07 19:14:21 from Viveros A., Guillermo M.

Responses

  • Re: Consulta at 2005-09-07 21:30:17 from Viveros A., Guillermo M.

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Viveros A., Guillermo M. 2005-09-07 21:30:17 Re: Consulta
Previous Message Alvaro Herrera 2005-09-07 20:44:18 Re: Consulta toma 100 Minutos!!??