[pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Giuliano Grego
Bom dia !

Estou rodando 3.180 comandos UPDATE (
UPDATE areas SET mun_geocodigo = '3204906' WHERE num_prop = '23611'; por
exemplo), numa tabela com as mesmas 3.180 linhas, e isso está demorando
horas; no último teste que fiz numa tabela com a metade do tamanho  :
Query returned successfully: 1909 rows affected, *75451361* ms execution
time.

Meu computador é localhost; ninguém mais usando o banco; banco com 2
funções de gatilho para cópia de registros entre tabelas ligadas; enfim, um
banco super singelo que roda em intranet.

Fiz testes com os mesmos números de comandos insert e delete nas mesmas
tabelas e demorou alguns segundos apenas.

A configuração de meu computador que está como servidor é:
Processador:  AMD Phenom II X4 945 3.00 GHz
8 gb de ram
Win 7 professional.


Vi um outro post na lista sobre o mesmo tema, mas que tratava sobre um
banco com 20 milhões de registros .
Mesmo assim dei uma conferida nas minhas conf's e não tem nada de anormal;
já fiz coisa pior no passado e nunca demorou mais que 10 seg o
processamento.


Alguma dica ?

Grato

-- 
Giuliano Grigolin
Geógrafo
CREA: SC-0760890/D
Analista SIG
SEGE / DTCAR
*
*
**
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Tiago Adami
Em 13 de novembro de 2012 11:21, Giuliano Grego grego...@gmail.com escreveu:


 Bom dia !

Bom dia!

 Estou rodando 3.180 comandos UPDATE (
 UPDATE areas SET mun_geocodigo = '3204906' WHERE num_prop = '23611'; por 
 exemplo), numa tabela com as mesmas 3.180 linhas, e isso está demorando 
 horas; no último teste que fiz numa tabela com a metade do tamanho  : Query 
 returned successfully: 1909 rows affected, 75451361 ms execution time.

Você não conseguiria trocar estes 3.180 comandos por apenas um? Ou a
essência da modificação de dados requer que cada linha receba valores
diferentes? Um único comando UPDATE é mais rápido que disparar vários.
Se possível faça isso.

 Meu computador é localhost; ninguém mais usando o banco; banco com 2 funções 
 de gatilho para cópia de registros entre tabelas ligadas; enfim, um banco 
 super singelo que roda em intranet.

Sem ter o conteúdo (código) dos gatilhos não há como ajudar muito. A
rede neste caso não interfere em nada. Para o PostgreSQL 3000
registros não representam grande massa de dados, o SGBD tira de letra.
O que pode estar interferindo e causando a demora são estes TRIGGERs.
Já parou para revisar seu código?

 Fiz testes com os mesmos números de comandos insert e delete nas mesmas 
 tabelas e demorou alguns segundos apenas.

Mais um argumento para culpar os TRIGGERs - se eles forem BEFORE/AFTER UPDATE.

 A configuração de meu computador que está como servidor é:
 Processador:  AMD Phenom II X4 945 3.00 GHz
 8 gb de ram
 Win 7 professional.

Esqueceu da especificação principal: disco. Em uma operação de
alteração de registros o gargalo ficará no disco, exceto se existir
uma rotina mal escrita em TRIGGER que abuse de memória e CPU.

 Vi um outro post na lista sobre o mesmo tema, mas que tratava sobre um banco 
 com 20 milhões de registros .
 Mesmo assim dei uma conferida nas minhas conf's e não tem nada de anormal; já 
 fiz coisa pior no passado e nunca demorou mais que 10 seg o processamento.

Como assim? Os mesmos comandos UPDATE no passado levavam 10 seg? Os
TRIGGERs que você se referiu já existiam n'aquele tempo?

--
TIAGO J. ADAMI
http://www.adamiworks.com
@tiadami
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Giuliano Grego
 Estou rodando 3.180 comandos UPDATE (
 UPDATE areas SET mun_geocodigo = '3204906' WHERE num_prop = '23611'; por
exemplo), numa tabela com as mesmas 3.180 linhas, e isso está demorando
horas; no último teste que fiz numa tabela com a metade do tamanho  :
Query returned successfully: 1909 rows affected, 75451361 ms execution
time.

1-  Você não conseguiria trocar estes 3.180 comandos por apenas um? Ou a
essência da modificação de dados requer que cada linha receba valores
diferentes? Um único comando UPDATE é mais rápido que disparar vários.
Se possível faça isso.


resp:  Cada linha recebe um valor diferente.






 Meu computador é localhost; ninguém mais usando o banco; banco com 2
funções de gatilho para cópia de registros entre tabelas ligadas; enfim, um
banco super singelo que roda em intranet.

2-  Sem ter o conteúdo (código) dos gatilhos não há como ajudar muito. A
rede neste caso não interfere em nada. Para o PostgreSQL 3000
registros não representam grande massa de dados, o SGBD tira de letra.
O que pode estar interferindo e causando a demora são estes TRIGGERs.
Já parou para revisar seu código?



resp:  eis os códigos das 2 funções / gatilhos:


CREATE OR REPLACE FUNCTION calcula_area_ha()
RETURNS TRIGGER
LANGUAGE plpgsql
  AS
   'BEGIN
 UPDATE public.areas SET area_shp = (SELECT ST_Area(geom)/1 FROM
public.propriedades
 WHERE public.areas.num_prop = public.propriedades.num_prop AND
public.areas.mun_geocodigo = public.propriedades.mun_geocodigo);
 RETURN OLD;
   END;' ;


 CREATE TRIGGER calcula_area_ha
  AFTER INSERT OR UPDATE OR DELETE
  ON public.propriedades
  FOR EACH ROW
  EXECUTE PROCEDURE calcula_area_ha();



CREATE OR REPLACE FUNCTION fn_insert_area_num_prop()
RETURNS trigger
LANGUAGE plpgsql
AS
'begin
insert into public.areas (num_prop)
values (new.num_prop);
return new;
end; ';


CREATE TRIGGER tg_insert_area_num_prop
AFTER INSERT
ON public.propriedades
FOR EACH ROW
EXECUTE PROCEDURE fn_insert_area_num_prop();


e o sql das 2 tabelas:


CREATE TABLE propriedades
(
  id_num_prop serial NOT NULL,
  num_prop integer NOT NULL,
  ficha character varying(15),
  processo_dtc_num character varying(15),
  localidade character varying(50),
  distrito character varying(50),
  mun_geocodigo integer NOT NULL,
  estado character(2) DEFAULT 'ES'::bpchar,
  proprietario character varying(100),
  cpf character varying(11),
  cgc character varying(15),
  endereco character varying(200),
  cidade character varying(50),
  mun_end_proprt character varying(50),
  estado_end_proprt character(2),
  confront_n character varying(200),
  confront_s character varying(200),
  confront_l character varying(200),
  confront_o character varying(200),
  descricao_sumaria character varying(500),
  id_situacao integer,
  geom geometry,
  CONSTRAINT pk_propriedades PRIMARY KEY (num_prop , mun_geocodigo ),
  CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
  CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) =
'MULTIPOLYGON'::text OR geom IS NULL),
  CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 31984)
)
WITH (
  OIDS=FALSE,
  autovacuum_enabled=true,
  toast.autovacuum_enabled=true



CREATE TABLE areas
(
  id_areas serial NOT NULL,
  num_prop integer NOT NULL,
  foto character varying(15),
  documento character varying(15),
  planta character varying(15),
  dp character varying(15),
  foto1 character varying(15),
  documento1 character varying(15),
  planta1 character varying(15),
  dp1 character varying(15),
  foto2 character varying(15),
  documento2 character varying(15),
  planta2 character varying(15),
  dp2 character varying(15),
  foto3 character varying(15),
  documento3 character varying(15),
  planta3 character varying(15),
  dp3 character varying(15),
  foto4 character varying(15),
  documento4 character varying(15),
  planta4 character varying(15),
  dp4 character varying(15),
  foto5 character varying(15),
  documento5 character varying(15),
  planta5 character varying(15),
  dp5 character varying(15),
  area_shp numeric(11,4),
  mun_geocodigo integer,
  CONSTRAINT areas_pkey PRIMARY KEY (id_areas ),
  CONSTRAINT areas_fkey FOREIGN KEY (num_prop, mun_geocodigo)
  REFERENCES propriedades (num_prop, mun_geocodigo) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
  OIDS=FALSE,
  autovacuum_enabled=true
);




 Fiz testes com os mesmos números de comandos insert e delete nas mesmas
tabelas e demorou alguns segundos apenas.

Mais um argumento para culpar os TRIGGERs - se eles forem BEFORE/AFTER
UPDATE.

 A configuração de meu computador que está como servidor é:
 Processador:  AMD Phenom II X4 945 3.00 GHz
 8 gb de ram
 Win 7 professional.

Esqueceu da especificação principal: disco. Em uma operação de
alteração de registros o gargalo ficará no disco, exceto se existir
uma rotina mal escrita em TRIGGER que abuse de memória e CPU.

resp:

2 HDs:
C: 35 GB livres de 117 GB (disco do sistema)
D: 95 GB livres de 348 GB


 Vi um outro 

Re: [pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Jean Domingues
RETURNS TRIGGER
LANGUAGE plpgsql
  AS
   'BEGIN
     UPDATE public.areas SET area_shp = (SELECT ST_Area(geom)/1 FROM 
public.propriedades
     WHERE public.areas.num_prop = public.propriedades.num_prop AND 
public.areas.mun_geocodigo = public.propriedades.mun_geocodigo);
     RETURN OLD;
   END;' ; 


aqui, acho que tem que ser return old para delete, e new para insert e update;


 CREATE TRIGGER calcula_area_ha
  AFTER INSERT OR UPDATE OR DELETE
  ON public.propriedades
  FOR EACH ROW
  EXECUTE PROCEDURE calcula_area_ha();
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Matheus de Oliveira
2012/11/13 Giuliano Grego grego...@gmail.com

  Estou rodando 3.180 comandos UPDATE (
  UPDATE areas SET mun_geocodigo = '3204906' WHERE num_prop = '23611'; por
 exemplo), numa tabela com as mesmas 3.180 linhas, e isso está demorando
 horas; no último teste que fiz numa tabela com a metade do tamanho  :
 Query returned successfully: 1909 rows affected, 75451361 ms execution
 time.


Vários fatores podem estar influenciando, eu começaria com a verificação de
locks, usando as consultas em [1] e [2].


 1-  Você não conseguiria trocar estes 3.180 comandos por apenas um? Ou a

 essência da modificação de dados requer que cada linha receba valores
 diferentes? Um único comando UPDATE é mais rápido que disparar vários.
 Se possível faça isso.


 resp:  Cada linha recebe um valor diferente.



É informado por usuário ou é calculado/gerado?




  Meu computador é localhost; ninguém mais usando o banco; banco com 2
 funções de gatilho para cópia de registros entre tabelas ligadas; enfim, um
 banco super singelo que roda em intranet.

 2-  Sem ter o conteúdo (código) dos gatilhos não há como ajudar muito. A

 rede neste caso não interfere em nada. Para o PostgreSQL 3000
 registros não representam grande massa de dados, o SGBD tira de letra.
 O que pode estar interferindo e causando a demora são estes TRIGGERs.
 Já parou para revisar seu código?



 resp:  eis os códigos das 2 funções / gatilhos:


 CREATE OR REPLACE FUNCTION calcula_area_ha()
 RETURNS TRIGGER
 LANGUAGE plpgsql
   AS
'BEGIN
  UPDATE public.areas SET area_shp = (SELECT ST_Area(geom)/1 FROM
 public.propriedades
  WHERE public.areas.num_prop = public.propriedades.num_prop AND
 public.areas.mun_geocodigo = public.propriedades.mun_geocodigo);
  RETURN OLD;
END;' ;


Não sei quão seletivo é esse WHERE do UPDATE, mas pra mim parece estranho
atualizar registros (de areas) sem que a consulta seja basead em NEW e OLD.
Não?



  CREATE TRIGGER calcula_area_ha
   AFTER INSERT OR UPDATE OR DELETE
   ON public.propriedades
   FOR EACH ROW
   EXECUTE PROCEDURE calcula_area_ha();



 CREATE OR REPLACE FUNCTION fn_insert_area_num_prop()
 RETURNS trigger
 LANGUAGE plpgsql
 AS
 'begin
 insert into public.areas (num_prop)
 values (new.num_prop);
 return new;
 end; ';


 CREATE TRIGGER tg_insert_area_num_prop
 AFTER INSERT
 ON public.propriedades
 FOR EACH ROW
 EXECUTE PROCEDURE fn_insert_area_num_prop();



Não entendi. Você disse que dá um UPDATE na tabela areas e essas triggers
estão na tabela propriedades, elas não poderiam influenciar dessa forma.

Tem mais alguma trigger em areas? Como você executa esse UPDATE? Pela
aplicação? Tem como testar direto no banco?


 e o sql das 2 tabelas:


 CREATE TABLE propriedades
 (
   id_num_prop serial NOT NULL,
   num_prop integer NOT NULL,
   ficha character varying(15),
   processo_dtc_num character varying(15),
   localidade character varying(50),
   distrito character varying(50),
   mun_geocodigo integer NOT NULL,
   estado character(2) DEFAULT 'ES'::bpchar,
   proprietario character varying(100),
   cpf character varying(11),
   cgc character varying(15),
   endereco character varying(200),
   cidade character varying(50),
   mun_end_proprt character varying(50),
   estado_end_proprt character(2),
   confront_n character varying(200),
   confront_s character varying(200),
   confront_l character varying(200),
   confront_o character varying(200),
   descricao_sumaria character varying(500),
   id_situacao integer,
   geom geometry,
   CONSTRAINT pk_propriedades PRIMARY KEY (num_prop , mun_geocodigo ),
   CONSTRAINT enforce_dims_geom CHECK (st_ndims(geom) = 2),
   CONSTRAINT enforce_geotype_geom CHECK (geometrytype(geom) =
 'MULTIPOLYGON'::text OR geom IS NULL),
   CONSTRAINT enforce_srid_geom CHECK (st_srid(geom) = 31984)
 )
 WITH (
   OIDS=FALSE,
   autovacuum_enabled=true,
   toast.autovacuum_enabled=true



 CREATE TABLE areas
 (
   id_areas serial NOT NULL,
   num_prop integer NOT NULL,
   foto character varying(15),
   documento character varying(15),
   planta character varying(15),
   dp character varying(15),
   foto1 character varying(15),
   documento1 character varying(15),
   planta1 character varying(15),
   dp1 character varying(15),
   foto2 character varying(15),
   documento2 character varying(15),
   planta2 character varying(15),
   dp2 character varying(15),
   foto3 character varying(15),
   documento3 character varying(15),
   planta3 character varying(15),
   dp3 character varying(15),
   foto4 character varying(15),
   documento4 character varying(15),
   planta4 character varying(15),
   dp4 character varying(15),
   foto5 character varying(15),
   documento5 character varying(15),
   planta5 character varying(15),
   dp5 character varying(15),
   area_shp numeric(11,4),
   mun_geocodigo integer,
   CONSTRAINT areas_pkey PRIMARY KEY (id_areas ),
   CONSTRAINT areas_fkey FOREIGN KEY (num_prop, mun_geocodigo)
   REFERENCES propriedades (num_prop, 

Re: [pgbr-geral] Demora absurda processamento comando UPDATE

2012-11-13 Por tôpico Matheus de Oliveira
On Tue, Nov 13, 2012 at 3:58 PM, Jean Domingues ejdom...@yahoo.com.brwrote:

 RETURNS TRIGGER
 LANGUAGE plpgsql
   AS
'BEGIN
  UPDATE public.areas SET area_shp = (SELECT ST_Area(geom)/1 FROM
 public.propriedades
  WHERE public.areas.num_prop = public.propriedades.num_prop AND
 public.areas.mun_geocodigo = public.propriedades.mun_geocodigo);
  RETURN OLD;
END;' ;


 aqui, acho que tem que ser return old para delete, e new para insert e
 update;


A trigger é do tipo after (veja abaixo), então não fará diferença nesse
caso.


  
  CREATE TRIGGER calcula_area_ha
   AFTER INSERT OR UPDATE OR DELETE
   ON public.propriedades
   FOR EACH ROW
   EXECUTE PROCEDURE calcula_area_ha();


[]'s
-- 
Matheus de Oliveira
Analista de Banco de Dados PostgreSQL
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral