[pgbr-geral] Problemas com Triggers

2011-04-06 Por tôpico Nilson Chagas
Meus caros,

Tenho 3 triggers que já utilizo a um bom tempo. Elas são responsaveis para
alimentar 3 tabelas que tem informações resumidas que apareceram na home do
site (www.saopaulofc.com.br)

De uns dias para ká, ao gravar a noticia no site, as 3 triggers tem demorado
para atualizar, não entendi pq desta mudança de comportamento.

Vou mostrar abaixo o codigo das triggers. Uma breve explicação, estas
triggers foram criadas para que na Home onde tem um grande trafico, não
precisasse ficar fazendo consultas SQL na massa de dados (tabela noticias),
então na postagem da noticia, ele alimenta 3 tabelas que tem apenas o que
realmente precisa aparecer na home do site.

--- Tabela Noticia - chamada das TRIGGERS --
CREATE TRIGGER tg_a_iud_noticia_seq01
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_noticia_home();
COMMENT ON TRIGGER tg_a_iud_noticia_seq01 ON noticia IS 'Atualiza tabela que
mostrará listagens da noticia no site.';

CREATE TRIGGER tg_a_iud_noticia_seq02
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_botequim();
COMMENT ON TRIGGER tg_a_iud_noticia_seq02 ON noticia IS 'Atualiza tabela que
mostrará o botequim.';

CREATE TRIGGER tg_a_iud_noticia_seq03
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_destaque();
COMMENT ON TRIGGER tg_a_iud_noticia_seq03 ON noticia IS 'Atualiza tabela que
mostrará as noticias em destaque.';

- CRIAÇÃO DA TRIGGER 
CREATE OR REPLACE FUNCTION fc_botequim()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_botequim_seq01;
PERFORM refresh_matview('mv_botequim');
CREATE INDEX idx_mv_botequim_seq01 ON mv_botequim(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_botequim() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_botequim() IS 'Seleciona o botequim do destaque';

- CRIAÇÃO DA TRIGGER 
CREATE OR REPLACE FUNCTION fc_noticia_home()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_noticia_home_seq01;
PERFORM refresh_matview('mv_noticia_home');
CREATE INDEX idx_mv_noticia_home_seq01 ON mv_noticia_home(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_noticia_home() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_noticia_home() IS 'Seleciona as noticias da home';

- CRIAÇÃO DA TRIGGER 
CREATE OR REPLACE FUNCTION fc_destaque()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_destaque_seq01;
PERFORM refresh_matview('mv_destaque');
CREATE INDEX idx_mv_destaque_seq01 ON mv_destaque(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_destaque() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_destaque() IS 'Seleciona as noticias do destaque';

A função refresh_matview, foi criada para atualizar a minha materialize
view, é uma função que já uso em outros pontos do banco de dados, e sempre
funcionou perfeito.
CREATE OR REPLACE FUNCTION refresh_matview(name)
  RETURNS void AS
$BODY$
 DECLARE
 matview_name ALIAS FOR $1;
 entry matview%ROWTYPE;
 BEGIN

 SELECT * INTO entry FROM matview WHERE mtv_name = matview_name;

 IF NOT FOUND THEN
 RAISE EXCEPTION 'Materialized view % does not exist.',
matview_name;
END IF;

EXECUTE 'DELETE FROM ' || matview_name;
EXECUTE 'INSERT INTO ' || matview_name
|| ' SELECT * FROM ' || entry.mtv_view;

UPDATE matview
SET mtv_lastrefr=CURRENT_TIMESTAMP
WHERE mtv_name=matview_name;

RETURN;
END
$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION refresh_matview(name) OWNER TO dbspneta1;
COMMENT ON FUNCTION refresh_matview(name) IS 'Atualização da materialized
view';

Se alguém puder me ajudar eu agradeço.

-- 
[]s
Nilson Chagas - Ubuntu User 25794
---
Visite:
http://www.avozdoevangelho.com.br - Peça gratuitamente um curso Bíblico

Twitter: avozdoevangelhoTwitter: matrixspnet

http://www.amados.com.br
http://bbnradio.org - Ouça a rádio e faça gratuitamente um Curso Biblico
On-Line
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Problemas com Triggers

2011-04-06 Por tôpico Leandro DUTRA
2011/4/6 Nilson Chagas nilson.chagas.si...@gmail.com:

 De uns dias para ká, ao gravar a noticia no site, as 3 triggers tem demorado
 para atualizar, não entendi pq desta mudança de comportamento.

O código não faz muita diferença, a não ser que esteja ruim.  O que
precisa mesmo é de um perfil de execução, ou pelo menos do plano de
execução.


 Vou mostrar abaixo o codigo das triggers. Uma breve explicação, estas
 triggers foram criadas para que na Home onde tem um grande trafico, não
 precisasse ficar fazendo consultas SQL na massa de dados (tabela noticias),
 então na postagem da noticia, ele alimenta 3 tabelas que tem apenas o que
 realmente precisa aparecer na home do site.

Creio que um bom índice teria o mesmo efeito.  Não seria otimização prematura?


-- 
skype:leandro.gfc.dutra?chat      Yahoo!: ymsgr:sendIM?lgcdutra
+55 (61) 3546 7191              gTalk: xmpp:leand...@jabber.org
+55 (11) 9406 7191        ICQ/AIM: aim:GoIM?screenname=61287803
BRAZIL GMT-3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Problemas com Triggers

2011-04-06 Por tôpico Nilson Chagas
2011/4/6 Leandro DUTRA leandro.gfc.du...@gmail.com

 2011/4/6 Nilson Chagas nilson.chagas.si...@gmail.com:
 
  De uns dias para ká, ao gravar a noticia no site, as 3 triggers tem
 demorado
  para atualizar, não entendi pq desta mudança de comportamento.

 O código não faz muita diferença, a não ser que esteja ruim.  O que
 precisa mesmo é de um perfil de execução, ou pelo menos do plano de
 execução.


  Vou mostrar abaixo o codigo das triggers. Uma breve explicação, estas
  triggers foram criadas para que na Home onde tem um grande trafico, não
  precisasse ficar fazendo consultas SQL na massa de dados (tabela
 noticias),
  então na postagem da noticia, ele alimenta 3 tabelas que tem apenas o que
  realmente precisa aparecer na home do site.

 Creio que um bom índice teria o mesmo efeito.  Não seria otimização
 prematura?


Temos uma base de noticias, muito grande, para não correr o risco que
tinhamos no mysql na versão anterior do site, que ficava um tempão para
trazer estes dados a tela, optei por trabalhar com uma massa de dados menor.

Mas posso pegar a view que alimenta a trigger e substituir na tela e ver
como fica.

Vou fazer isto.



 --
 skype:leandro.gfc.dutra?chat  Yahoo!: ymsgr:sendIM?lgcdutra
 +55 (61) 3546 7191  gTalk: xmpp:leand...@jabber.org
 +55 (11) 9406 7191ICQ/AIM: aim:GoIM?screenname=61287803
 BRAZIL GMT-3  MSN: msnim:chat?contact=lean...@dutra.fastmail.fm
 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral




-- 
[]s
Nilson Chagas - Ubuntu User 25794
---
Visite:
http://www.avozdoevangelho.com.br - Peça gratuitamente um curso Bíblico

Twitter: avozdoevangelhoTwitter: matrixspnet

http://www.amados.com.br
http://bbnradio.org - Ouça a rádio e faça gratuitamente um Curso Biblico
On-Line
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral