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 19:56:59
Message-ID: CAKqO2Phg__Lf4ykhdem6S2a0RZ0ZcNAvDRD_PnSzWBX85qjdZQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Que onda, ya hice lagunas pruebas, agregando el indice, y todo parecía bien
y de repente empezó hacer lentas las inserciones, voy a probar creando las
tablas por dia y solo dejar el trigger con el insert a la tabla que le
corresponda.

Si tienes alguna otra idea el por que de esto, te lo agradezco de antemano

Saludos.

LI. Juan Carlos Ramirez Z.

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

> Si puede ser k crearas un script que se llamara por cron
> unos mometos ates para crear la tabla
>
> Y pues has tus pruebas y comentanos como te fue!! gracias y excelente
> dia!! =)
>
> El 23 de marzo de 2012 11:34, Juan Carlos Ramirez Zambrano <
> juancarlosrz(dot)78(at)gmail(dot)com> escribió:
>
> 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
>>>
>>>
>>
>
>
> --
> ISC Miguel Angel Hernandez Moreno
>
>

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Rodrigo Gonzalez 2012-03-23 20:30:59 Re: Generar numeros aleatorios enteros de 4 digitos
Previous Message maria teresa tarquino chavez 2012-03-23 19:54:36 Generar numeros aleatorios enteros de 4 digitos