From: | Rubén da Silva <ruben(at)ozonomultimedia(dot)com> |
---|---|
To: | postgresql <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Funcion inet2int - error |
Date: | 2006-12-01 18:56:12 |
Message-ID: | 45707ACC.2060607@ozonomultimedia.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Alvaro Herrera wrote:
> Rubén da Silva escribió:
>
>>He creado una función para pasar de inet a entero largo (int8):
>>
>>==============
>>
>>CREATE OR REPLACE FUNCTION inet2int(inet "varchar")
>> RETURNS information_schema.cardinal_number AS
>
>
> Declarala como RETURNS int8. cardinal_number es un dominio sobre el
> tipo int4.
>
OK. Perfecto. Gracias.
Ahora que esto está solucionado, veo cuando la uso (con EXPLAIN ANALYZE)
que usa un "seq scan" en lugar de un "index scan".
Para ponernos en situación:
Imaginemos que tengo rangos de ips almacenados en una tabla como enteros
(int8) start y end.
Tengo un index de estas columnas de enteros.
Y quiero encontrar la red a la que pertenece la ip para ello:
SELECT id, blocks.ipnum_start, blocks.ipnum_end FROM blocks
WHERE inet2int('unaIP') > blocks.ipnum_start AND inet2int('unaIP') <
blocks.ipnum_end;
Esta consulta le ha llevado hacerla 74 segundos, sin embargo esta:
SELECT id, blocks.ipnum_start, blocks.ipnum_end FROM blocks
WHERE IPint > blocks.ipnum_start AND IPint < blocks.ipnum_end;
Le ha llevado 600 ms
Sin embargo lo que es el uso de la función demora 31 ms:
SELECT inet2int('UNAIP');
La diferencia está en usar o no la funcion de conversión, ¿Que ocurre?
EXPLAIN ANALYZE me dice que usando la funcion no usa los indices (seq
scan), ¿porque?, se ejecuta la funcion, tantas veces como registros
LA BD almacena casi tres millones de rangos de IP.
Un saludo, y gracias de nuevo.
Rubén
From | Date | Subject | |
---|---|---|---|
Next Message | Alvaro Herrera | 2006-12-01 19:06:39 | Re: Configuracion optima para servidor postgres |
Previous Message | Raul Andres Duque | 2006-12-01 18:44:53 | Re: Configuracion optima para servidor postgres |