Re: Problema con insert en tabla particionada

From: Juan Carlos Ramirez Zambrano <juancarlosrz(dot)78(at)gmail(dot)com>
To: Miguel Angel Hernandez Moreno <miguel(dot)hdz(dot)mrn(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema con insert en tabla particionada
Date: 2012-03-23 17:34:41
Message-ID: CAKqO2PiLJNjawxsS02zeFxg0a=NdHTZY_j9b250WN5ZN7BAtaA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

tienes razon, de acuerdo a lo que estado revisando en manuales y foros, se
recomienda tener el indice del campo con el que realizas la aprticion.

Voy a agregar el indice y a realizar pruebas, para ver que tal se comporta.

O la otra opcion seria separa el proceso de crear la tabla o solo dejar el
trgger para el insert de la tabla del dia.

El 23 de marzo de 2012 11:13, Miguel Angel Hernandez Moreno <
miguel(dot)hdz(dot)mrn(at)gmail(dot)com> escribió:

> Fijate que hay otro dato
>
> Tu haces el select con base a tu campo "recibo"
>
> select 'tabla_'||substr(NEW.recibo::text,1,4) ||'_'||substr(NEW.recibo::text,6,2)
> ||'_'|| substr(NEW.recibo::text,9,2) into nombre_tabla;
>
> Y tus indices estan
> -fecins
> -hreal, linea, economico
>
> Te falta el ndice para tu campo recibo que es por donde partcionas
>
> --Se agregan sus indices
> EXECUTE 'CREATE INDEX idx_fecins'||nombre_tabla||' ON
> esquema.'||nombre_tabla||' USING btree
> (fecins) TABLESPACE idx;';
>
> EXECUTE 'CREATE INDEX idx_hreal_lin_eco'||nombre_tabla||' ON
> esquema.'||nombre_tabla||' USING btree
> (hreal, linea, economico) TABLESPACE idx;';
>
> Puede ser eso
> El 23 de marzo de 2012 11:10, Juan Carlos Ramirez Zambrano <
> juancarlosrz(dot)78(at)gmail(dot)com> escribió:
>
> Ok deja revisar lo que comentas, en cuanto al mantenimiento no creo ya que
>> se tiene activo el autovaccum.
>>
>> Saludos.
>>
>> LI. Juan Carlos Ramirez Z.
>>
>>
>>
>> El 23 de marzo de 2012 11:04, Miguel Angel Hernandez Moreno <
>> miguel(dot)hdz(dot)mrn(at)gmail(dot)com> escribió:
>>
>> Hola
>>>
>>> Al parecer yo veo un select a information_schema checa el mantenimiento
>>> a tu BD por que puede que
>>> sea lento el select por lo mismo (SELECT * FROM information_schema.tables
>>> WHERE table_name = nombre_tabla)
>>>
>>> Gracias y excelente dia
>>>
>>> El 22 de marzo de 2012 17:10, Juan Carlos Ramirez Zambrano <
>>> juancarlosrz(dot)78(at)gmail(dot)com> escribió:
>>>
>>> Hola Lista, quiero consultar y ver si me pueden orientar con un problema
>>>> que se me presento con los insert en una tabla particionada
>>>>
>>>> El problema se presento de la nada, se implemento un trigger para
>>>> insertar los datos en tablas por dia, esta tabla recibio hasta las 14:00
>>>> horas 4,951,257 millones de registros, esto se implemento a las 00:00
>>>> horas y todo iva bien hasta las 14:00 horas cuando los inserte se empezaron
>>>> hacer muy lentos, es decir a tardar casi 1 segundo por insert.
>>>>
>>>> Agradezco cualquier ayuda que me puedan proporcionar para poder
>>>> solucionar este problema. Aqui dejo el trigger implementado.
>>>>
>>>> CREATE OR REPLACE FUNCTION monterrey.tabla_x_dia_v1()
>>>> RETURNS trigger AS
>>>> $BODY$
>>>> DECLARE
>>>> nombre_tabla text:='';
>>>> BEGIN
>>>> --Se obtiene la fecha a concatenar al nombre de la tabla
>>>> select 'tabla_'||substr(NEW.recibo::text,1,4)
>>>> ||'_'||substr(NEW.recibo::text,6,2) ||'_'|| substr(NEW.recibo::text,9,2)
>>>> into nombre_tabla;
>>>>
>>>> --Validamos si existe la tabla continuamos solo con el insert
>>>> IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name
>>>> = nombre_tabla) THEN
>>>> raise notice 'No existe la tabla, se crea como %',nombre_tabla;
>>>>
>>>> --Se ejecuta la creacion de la tabla correspondiete al dia
>>>> EXECUTE 'CREATE TABLE monterrey.' || nombre_tabla || '( CHECK( recibo
>>>> >= '''||
>>>> substr(NEW.recibo::text,0,11)||' 00:00:00''' ||' and recibo<= '''||
>>>> substr(NEW.recibo::text,0,11) ||' 23:59:59'')) INHERITS
>>>> (esquema.tabla);';
>>>>
>>>> --Se asignan los permisos correspondientes
>>>> EXECUTE 'GRANT ALL ON TABLE esquema.'||nombre_tabla||' TO " usuario ";';
>>>> EXECUTE 'GRANT ALL ON TABLE esquema .'||nombre_tabla||' TO usuario ;';
>>>> EXECUTE 'GRANT ALL ON TABLE esquema .'||nombre_tabla||' TO usuario ;';
>>>> EXECUTE 'GRANT ALL ON TABLE esquema .'||nombre_tabla||' TO usuario ;';
>>>> EXECUTE 'GRANT SELECT, UPDATE, INSERT ON TABLE
>>>> esquema .'||nombre_tabla||' TO usuario;';
>>>> EXECUTE 'GRANT SELECT, UPDATE, INSERT ON TABLE
>>>> esquema .'||nombre_tabla||' TO usuario ;';
>>>> EXECUTE 'GRANT SELECT, UPDATE, INSERT ON TABLE
>>>> esquema .'||nombre_tabla||' TO usuario ;';
>>>>
>>>> --Se agrega la llave primaria de tabla
>>>> EXECUTE 'ALTER TABLE esquema.'||nombre_tabla||' ADD PRIMARY KEY
>>>> (unidad, economico, linea, hreal, recibo) USING INDEX TABLESPACE idx';
>>>> --Se agregan sus indices
>>>> EXECUTE 'CREATE INDEX idx_fecins'||nombre_tabla||' ON
>>>> esquema.'||nombre_tabla||' USING btree
>>>> (fecins) TABLESPACE idx;';
>>>>
>>>> EXECUTE 'CREATE INDEX idx_hreal_lin_eco'||nombre_tabla||' ON
>>>> esquema.'||nombre_tabla||' USING btree
>>>> (hreal, linea, economico) TABLESPACE idx;';
>>>>
>>>> END IF;
>>>>
>>>> --Ejecutamos el insert del regsitro nuevo
>>>> EXECUTE 'insert into esquema.'|| nombre_tabla ||
>>>> '(campo, campo1,
>>>> campo2,fecha,lati,long,paro,distancia,causa,velp,velm,alarma,hora,
>>>>
>>>> recibo,operador,campo1,campo2,pasarela,momento,sub_del,baj_del,blo_del,ala_del,sub_tra,
>>>> baj_tra, blo_tra,ala_tra,tipo,xy, panicos, aux_d, aux_t,oreja)
>>>> values ('''|| NEW.unidad || ''','|| NEW.economico || ',' || NEW.linea
>>>> || ','''|| NEW.hreal || ''','|| NEW.lat || ','|| NEW.lon ||','|| NEW.paro
>>>> ||','|| NEW.distancia ||
>>>> ','''|| NEW.causa ||''',' || NEW.velp || ',' || NEW.velm || ',''' ||
>>>> NEW.alarma || ''',' || NEW.hora || ',''' || NEW.recibo || ''',' ||
>>>> NEW.operador || ',' || NEW.campo1 ||
>>>> ',' || NEW.campo2 || ',' || NEW.pasarela || ',' || NEW.momento || ','
>>>> || NEW.sub_del || ',' || NEW.baj_del || ',' || NEW.blo_del || ',' ||
>>>> NEW.ala_del || ',' || NEW.sub_tra ||
>>>> ',' || NEW.baj_tra || ',' || NEW.blo_tra || ',' || NEW.ala_tra ||
>>>> ',''' || NEW.tipo || ''',''' || NEW.xy || ''',' || NEW.panicos || ',' ||
>>>> NEW.aux_d || ',' || NEW.aux_t || ',' || NEW.oreja ||
>>>> ');';
>>>>
>>>> RETURN NULL;
>>>> END;
>>>> $BODY$
>>>> LANGUAGE plpgsql VOLATILE
>>>> COST 100;
>>>>
>>>>
>>>>
>>>>
>>>> Saludos.
>>>>
>>>> LI. Juan Carlos Ramirez Z.
>>>>
>>>> j <juancarlosrz(dot)78(at)gmail(dot)com>
>>>>
>>>
>>>
>>>
>>> --
>>> ISC Miguel Angel Hernandez Moreno
>>>
>>>
>>
>
>
> --
> ISC Miguel Angel Hernandez Moreno
>
>

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Miguel Angel Hernandez Moreno 2012-03-23 17:44:33 Re: Problema con insert en tabla particionada
Previous Message Juan Carlos Ramirez Zambrano 2012-03-23 17:10:03 Re: Problema con insert en tabla particionada