From: | Alvaro Herrera <alvherre(at)commandprompt(dot)com> |
---|---|
To: | Rubén da Silva <ruben(at)ozonomultimedia(dot)com> |
Cc: | postgresql <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Funcion inet2int - error |
Date: | 2006-12-01 20:05:25 |
Message-ID: | 20061201200525.GE3036@alvh.no-ip.org |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Rubén da Silva escribió:
> >>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.
> >
> >
> >Mala idea -- podrias almacenar las IPs usando el tipo "inet". Hay
> >operadores para > y < para ese tipo que te facilitarian estas busquedas.
> >
>
> Los datos me los han dado así, por mi los almacenaría en inet que es lo
> más lógico. La conversión me temo que puede ser mortal, son 3 millones *
> 2 columnas = 6 millones de conversiones. Meter los datos con inserts me
> llevaba varias horas, al final opté por COPY de un CSV y aún así le
> llevó sus 10-15 minutos, ¿debería llevar poco (no horas) la conversión
> si se trata de updates? (los metería en columnas de la misma tabla)
Si puedes hacer una funcion barata que haga la conversion, no deberia
demorarse mas de los 10-15 minutos de COPY. Pero te aconsejaria quitar
todos los indices de la tabla, luego hacer el UPDATE, luego hacer
VACUUM de la tabla, y finalmente volver a crear los indices.
> >>SELECT id, blocks.ipnum_start, blocks.ipnum_end FROM blocks
> >> WHERE inet2int('unaIP') > blocks.ipnum_start AND inet2int('unaIP') <
> >>blocks.ipnum_end;
> >
> >Cual es la definicion de la tabla, y que version de Postgres estas
> >usando?
>
> CREATE TABLE blocks
> (
> ipnum_start int8 NOT NULL,
> ipnum_end int8 NOT NULL,
> loc_id int4 NOT NULL,
> CONSTRAINT blocks_pkey PRIMARY KEY (loc_id, ipnum_start, ipnum_end)
> )
> WITHOUT OIDS;
Los bloques esos, son CIDR propiamente tales, o son cualquier cosa? Se
me ocurre que podrias solucionar esto de manera muy elegante usando un
indice GiST que implementara pertenencia de una IP a un bloque; si es
que los bloques estuvieran bien definidos.
Quizas podrias hacerlo tambien si los bloques fueran cualquier cosa,
pero no estoy seguro.
Las direcciones son IPv4 o pueden ser IPv6 tambien? Hmm, las IPv6 son
128 bits asi que no cabrian en un int8 de todas formas, cierto?
--
Alvaro Herrera http://www.CommandPrompt.com/
PostgreSQL Replication, Consulting, Custom Development, 24x7 support
From | Date | Subject | |
---|---|---|---|
Next Message | Raul Andres Duque | 2006-12-01 20:07:46 | Re: Configuracion optima para servidor postgres |
Previous Message | Rubén da Silva | 2006-12-01 19:29:31 | Re: Funcion inet2int - error |