Re: Criterio para crear indices

From: Jaime Casanova <jaime(dot)casanova(at)2ndquadrant(dot)com>
To: Edwin De La Cruz <edwinspire(at)gmail(dot)com>
Cc: POSTGRES <pgsql-es-ayuda(at)postgresql(dot)org>, Gerardo Herzig <gherzig(at)fmed(dot)uba(dot)ar>
Subject: Re: Criterio para crear indices
Date: 2015-09-17 13:20:41
Message-ID: CAJGNTePn2fsQp_riQUy1FMCqwRYjJ_Cn4APTotvw=dESR3TFQw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

2015-09-16 14:17 GMT-05:00 Edwin De La Cruz <edwinspire(at)gmail(dot)com>:
> El 16/09/15 a las 13:01, Gerardo Herzig escribió:
>>
>> /*
>> >FOR idevent_for_close_on_restore IN SELECT idevent FROM events WHERE
>> >ideventtype = ANY(et.auto_close_on_event_defined)
>> >AND status = 0 AND idaccount = NEW.idaccount AND zu = NEW.zu AND
>> >idevent != NEW.idevent LOOP
>> >
>> >INSERT INTO event_comments(
>> >comment_event, status,
>> >idevent)
>> >VALUES ('Event closed for restoring event idevent '||NEW.idevent, 7,
>> >idevent_for_close_on_restore);
>> >
>> >END LOOP;
>> >*/
>
>
> Si dejo el codigo como se muestra a continuacion:
>
> FOR idevent_for_close_on_restore IN SELECT idevent FROM events WHERE
> ideventtype = ANY(et.auto_close_on_event_defined)
> AND status = 0 AND idaccount = NEW.idaccount AND zu = NEW.zu AND
> idevent != NEW.idevent LOOP
> /*
> INSERT INTO event_comments(
> comment_event, status,
> idevent)
> VALUES ('Event closed for restoring event idevent '||NEW.idevent, 7,
> idevent_for_close_on_restore);
> */
> END LOOP;
>
> igual se vuelve muy lento el script, probé hace unas semanas atras con
> ANALIZE EXPLAIN y se demoró unos 40 segundos en correr, y eso que solo era
> prueba. Lo que pude ver es que recorre todas las particiones y las
> particiones de las particiones de la tabla events, que de momento como dije
> son mas de 40 millones de registros repartidos en unas 15 tablas.
> El indice lo creo solo en la tabla padre o en todas las hijas, creo que lo
> logico seria en todas las hijas, pues son las que contienen datos.
>
>

Saludos Edwin,

Tu mencionaste que particionaste por año y luego por meses por lo que
para que postgres sea capaz de "excluir" particiones debes incluir en
la consulta clausulas que le permitan decidir que no encontrará datos
en una partición específica. Supongo que particionas usando elgunos de
los campos: ts, loaded o dateevent.

Por lo que en la consulta debes agregar una clausula en el where con
el campo con el que particionas. Además debes asegurarte de crear en
cada partición un constraint CHECK que le permita a postgres saber que
puede esperar en cada partición.

Por ejemplo, si particionas por año en cada partición podrías tener algo así:

CREATE TABLE events2015 (CHECK (ts between '2015-01-01 00:00:00' AND
'2015-12-31 23:59:59.99999'))
INHERITS (events);

y luego la consulta puede tener algo como:

WHERE ts > '2015-01-01 00:00:00'

eso te aseguraría que solo la última partición se leería

De todos modos, podrías mostrar por favor el plan de ejecución?

--
Jaime Casanova www.2ndQuadrant.com
Professional PostgreSQL: Soporte 24x7 y capacitación

-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda(at)postgresql(dot)org)
Para cambiar tu suscripcin:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Edwin De La Cruz 2015-09-17 15:44:06 Re: Criterio para crear indices
Previous Message Gerardo Herzig 2015-09-16 19:28:54 Re: Criterio para crear indices