Re: [pgbr-geral] Interpretação do explain analyse

2009-08-14 Por tôpico JotaComm
Opa,

Sim, é o analyze que é o responsável por atualizar as estatísticas do banco.

2009/8/14 Nei Rauni Santos 

> Legal,
>
> Os textos são bastante atualizados, existe bastante update e insert, delete
> não.
>
> estou usando o pg 8.3 autovacum então acho que é automatico ne?
>
> o analyse eu não rodo nao. é o analyse que atualiza as estatisticas?
>
> Nei
>
>
> 2009/8/14 Mozart Hasse 
>
>> tentava outro plano. Nada funcionou, mesmo em tabelas sem atualização, com
>> CLUSTER, VACUUM e ANALYZE. Talvez (eu disse TALVEZ) o otimizador resolva
>> usar um índice se você trocar essa consulta gigante pelas 28 consultas
>> individuais, uma para cada linha, o que deixará o desempenho delas juntas
>> muito melhor do que o dessa consulta. Sim, também acho que contraria o bom
>> senso, mas como estamos falando do otimizador do Postgres, as chances são
>> boas.
>>
>> Atenciosamente,
>>
>
>
>
> --
> Nei Rauni Santos
> nra...@gmail.com
> +55 41 85020985
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

[]s
-- 
JotaComm
http://jotacomm.wordpress.com
http://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


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-14 Por tôpico Nei Rauni Santos
Legal,

Os textos são bastante atualizados, existe bastante update e insert, delete
não.

estou usando o pg 8.3 autovacum então acho que é automatico ne?

o analyse eu não rodo nao. é o analyse que atualiza as estatisticas?

Nei


2009/8/14 Mozart Hasse 

> tentava outro plano. Nada funcionou, mesmo em tabelas sem atualização, com
> CLUSTER, VACUUM e ANALYZE. Talvez (eu disse TALVEZ) o otimizador resolva
> usar um índice se você trocar essa consulta gigante pelas 28 consultas
> individuais, uma para cada linha, o que deixará o desempenho delas juntas
> muito melhor do que o dessa consulta. Sim, também acho que contraria o bom
> senso, mas como estamos falando do otimizador do Postgres, as chances são
> boas.
>
> Atenciosamente,
>



-- 
Nei Rauni Santos
nra...@gmail.com
+55 41 85020985
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-14 Por tôpico Mozart Hasse
Oi Rauni,

> Obrigado pela sua explicação, vou testar isso aqui, existe alguma outra
> possibilidade sem criar as tmp tables??

Pouco provável. Criei índices para todas as combinaçoes de campos usadas 
na consulta, além de tentar mexer na sintaxe dela para ver se o otimizador
tentava outro plano. Nada funcionou, mesmo em tabelas sem atualização, com
CLUSTER, VACUUM e ANALYZE. Talvez (eu disse TALVEZ) o otimizador resolva
usar um índice se você trocar essa consulta gigante pelas 28 consultas
individuais, uma para cada linha, o que deixará o desempenho delas juntas
muito melhor do que o dessa consulta. Sim, também acho que contraria o bom 
senso, mas como estamos falando do otimizador do Postgres, as chances são 
boas.

Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-13 Por tôpico JotaComm
Olá,

Você tem as estatísticas do seu banco atualizadas, isto é, o comando ANALYZE
é executado com qual periodicidade?

Esta sua tabela tem muitas operações de UPDATE e DELETE? De quanto em quanto
tempo você executa um processo de VACUUM? O autovacuum está habilitado?

2009/8/12 Nei Rauni Santos 

> Dae pessoal, tenho uma consulta entre 2 tabelas que está demorando bastante
> tempo, gostaria da ajuda de alguém para analisar o resultado do explain
> analize.
>
> minha query:
>
> select d.description_type_id, t.lang, count( t.id ) from hotel_description
> as d
> inner join hotel_description_translation as t ON ( d.id = t.id )
> group by d.description_type_id, t.lang
>
> o pgadmin3 diz que demora 14714 ms para executar essa query, o resultado
> dela é esse:
>
> 4;"pt_BR";12183
> 3;"pt";13326
> 8;"pt_BR";58957
> 5;"en";27687
> 7;"en";20041
> 11;"en";61
> 6;"pt";24534
> 2;"pt_BR";11559
> 1;"pt_BR";10024
> 3;"en";33032
> 6;"en";59706
> 7;"pt";10176
> 11;"pt";29
> 5;"pt";4061
> 4;"en";28612
> 8;"en";59726
> 2;"pt";11559
> 1;"pt";10024
> 5;"pt_BR";4061
> 7;"pt_BR";10176
> 11;"pt_BR";29
> 1;"en";23219
> 2;"en";26297
> 8;"pt";58957
> 3;"pt_BR";13326
> 4;"pt";12183
> 6;"pt_BR";24534
>
>
> estrutura das minhas tabelas:
>
> CREATE TABLE hotel_description_translation
> (
>   id integer NOT NULL,
>   lang character varying(5) NOT NULL,
>   created_at timestamp without time zone,
>   updated_at timestamp without time zone,
>   description text NOT NULL,
>   CONSTRAINT pkhotel_description_i18n PRIMARY KEY (id, lang),
>   CONSTRAINT fk_hotel_description_i18n_hotel_description FOREIGN KEY (id)
>   REFERENCES hotel_description (id) MATCH SIMPLE
>   ON UPDATE NO ACTION ON DELETE NO ACTION
> )
> WITH (OIDS=FALSE);
>
> CREATE TABLE hotel_description
> (
>   description_type_id integer NOT NULL,
>   hotel_id integer NOT NULL,
>   id serial NOT NULL,
>   CONSTRAINT pkhotel_description PRIMARY KEY (id))
> WITH (OIDS=FALSE);
>
>
> quantidade de registros
>
> select count(*) from hotel_description; --327819 rows
> select count(*) from hotel_description_translation; --568079 rows
>
>
> o explain analyse resultou nisso:
>
>
> "HashAggregate  (cost=88792.79..88793.09 rows=24 width=11)"
> "  ->  Hash Join  (cost=10263.93..84532.20 rows=568079 width=11)"
> "Hash Cond: (t.id = d.id)"
> "->  Seq Scan on hotel_description_translation t
> (cost=0.00..57895.79 rows=568079 width=7)"
> "->  Hash  (cost=4885.19..4885.19 rows=327819 width=8)"
> "  ->  Seq Scan on hotel_description d  (cost=0.00..4885.19
> rows=327819 width=8)"
>
>
>
>
>
> se alguém puder ajudar, não sei se é possível otimizar um pouco mais isso.
>
> Nei
>
>
>
>
> --
> Nei Rauni Santos
> nra...@gmail.com
> +55 41 85020985
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>

[]s
-- 
JotaComm
http://jotacomm.wordpress.com
http://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


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-13 Por tôpico Nei Rauni Santos
Oi Hasse,

Obrigado pela sua explicação, vou testar isso aqui, existe alguma outra
possibilidade sem criar as tmp tables??



2009/8/13 Mozart Hasse 

> Olá Rauni,
>
> Um jeito de ensinar SQL para o otimizador do Postgres é o seguinte:
>
> create index tmp2 on hotel_description_translation (id,lang);
>
> create temporary table x as
> select d.description_type_id, t.lang, count( t.id ) as count
> from hotel_description_translation as t
> group by t.id, t.lang;
>
> select d.description_type_id,t.lang
> from x t
> inner join hotel_description_translation d ON ( d.id = t.id );
>
> Ou seja: crie uma tabela temporária contendo as totalizações, usando apenas
> a tabela filha.
> Essa consulta será simples o suficiente para o otimizador do Postgres usar
> o
> índice e montar os totais rapidamente (a consulta completa pelo visto é
> complicada demais para ele...).
> Depois, sobre uma tabela muito menor, mesmo sem usar índices, o Hash Join
> do
> Postgres vai ter um desempenho mais aceitável.
>
> Não tenho tuas tabelas, mas com duas minhas de volume e proporção similares
> a resposta foi 5 vezes mais rápida.
>
> Atenciosamente,
>
> Mozart Hasse
>
>
> ___
> pgbr-geral mailing list
> pgbr-geral@listas.postgresql.org.br
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>



-- 
Nei Rauni Santos
nra...@gmail.com
+55 41 85020985
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-13 Por tôpico Mozart Hasse
Olá Rauni,

Um jeito de ensinar SQL para o otimizador do Postgres é o seguinte:

create index tmp2 on hotel_description_translation (id,lang);

create temporary table x as
select d.description_type_id, t.lang, count( t.id ) as count 
from hotel_description_translation as t 
group by t.id, t.lang;

select d.description_type_id,t.lang 
from x t
inner join hotel_description_translation d ON ( d.id = t.id );

Ou seja: crie uma tabela temporária contendo as totalizações, usando apenas
a tabela filha.
Essa consulta será simples o suficiente para o otimizador do Postgres usar o
índice e montar os totais rapidamente (a consulta completa pelo visto é
complicada demais para ele...).
Depois, sobre uma tabela muito menor, mesmo sem usar índices, o Hash Join do
Postgres vai ter um desempenho mais aceitável.

Não tenho tuas tabelas, mas com duas minhas de volume e proporção similares
a resposta foi 5 vezes mais rápida.

Atenciosamente,

Mozart Hasse


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Interpretação do explain analyse

2009-08-12 Por tôpico Luiz Rafael Culik Guimaraes
Ola

se vc nao utilizar a clausula where na sua querie, ela vai mesmo dar um full 
table scan, ja que vc nao especificou quais registros vc quer

[]
Luiz
- Original Message - 
From: Nei Rauni Santos
To: Comunidade PostgreSQL Brasileira
Sent: Wednesday, August 12, 2009 3:43 PM
Subject: [pgbr-geral] Interpretação do explain analyse


Dae pessoal, tenho uma consulta entre 2 tabelas que está demorando bastante 
tempo, gostaria da ajuda de alguém para analisar o resultado do explain 
analize.

minha query:

select d.description_type_id, t.lang, count( t.id ) from hotel_description 
as d
inner join hotel_description_translation as t ON ( d.id = t.id )
group by d.description_type_id, t.lang

o pgadmin3 diz que demora 14714 ms para executar essa query, o resultado 
dela é esse:

4;"pt_BR";12183
3;"pt";13326
8;"pt_BR";58957
5;"en";27687
7;"en";20041
11;"en";61
6;"pt";24534
2;"pt_BR";11559
1;"pt_BR";10024
3;"en";33032
6;"en";59706
7;"pt";10176
11;"pt";29
5;"pt";4061
4;"en";28612
8;"en";59726
2;"pt";11559
1;"pt";10024
5;"pt_BR";4061
7;"pt_BR";10176
11;"pt_BR";29
1;"en";23219
2;"en";26297
8;"pt";58957
3;"pt_BR";13326
4;"pt";12183
6;"pt_BR";24534


estrutura das minhas tabelas:

CREATE TABLE hotel_description_translation
(
  id integer NOT NULL,
  lang character varying(5) NOT NULL,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  description text NOT NULL,
  CONSTRAINT pkhotel_description_i18n PRIMARY KEY (id, lang),
  CONSTRAINT fk_hotel_description_i18n_hotel_description FOREIGN KEY (id)
  REFERENCES hotel_description (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);

CREATE TABLE hotel_description
(
  description_type_id integer NOT NULL,
  hotel_id integer NOT NULL,
  id serial NOT NULL,
  CONSTRAINT pkhotel_description PRIMARY KEY (id),
  CONSTRAINT fk_hotel_description_description_type FOREIGN KEY 
(description_type_id)
  REFERENCES description_type (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_hotel_description_hotel FOREIGN KEY (hotel_id)
  REFERENCES hotel (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);


quantidade de registros

select count(*) from hotel_description; --327819 rows
select count(*) from hotel_description_translation; --568079 rows


o explain analyse resultou nisso:


"HashAggregate  (cost=88792.79..88793.09 rows=24 width=11)"
"  ->  Hash Join  (cost=10263.93..84532.20 rows=568079 width=11)"
"Hash Cond: (t.id = d.id)"
"->  Seq Scan on hotel_description_translation t 
(cost=0.00..57895.79 rows=568079 width=7)"
"->  Hash  (cost=4885.19..4885.19 rows=327819 width=8)"
"  ->  Seq Scan on hotel_description d  (cost=0.00..4885.19 
rows=327819 width=8)"





se alguém puder ajudar, não sei se é possível otimizar um pouco mais isso.

Nei




-- 
Nei Rauni Santos
nra...@gmail.com
+55 41 85020985




___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral 

___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


[pgbr-geral] Interpretação do explain analyse

2009-08-12 Por tôpico Nei Rauni Santos
Dae pessoal, tenho uma consulta entre 2 tabelas que está demorando bastante
tempo, gostaria da ajuda de alguém para analisar o resultado do explain
analize.

minha query:

select d.description_type_id, t.lang, count( t.id ) from hotel_description
as d
inner join hotel_description_translation as t ON ( d.id = t.id )
group by d.description_type_id, t.lang

o pgadmin3 diz que demora 14714 ms para executar essa query, o resultado
dela é esse:

4;"pt_BR";12183
3;"pt";13326
8;"pt_BR";58957
5;"en";27687
7;"en";20041
11;"en";61
6;"pt";24534
2;"pt_BR";11559
1;"pt_BR";10024
3;"en";33032
6;"en";59706
7;"pt";10176
11;"pt";29
5;"pt";4061
4;"en";28612
8;"en";59726
2;"pt";11559
1;"pt";10024
5;"pt_BR";4061
7;"pt_BR";10176
11;"pt_BR";29
1;"en";23219
2;"en";26297
8;"pt";58957
3;"pt_BR";13326
4;"pt";12183
6;"pt_BR";24534


estrutura das minhas tabelas:

CREATE TABLE hotel_description_translation
(
  id integer NOT NULL,
  lang character varying(5) NOT NULL,
  created_at timestamp without time zone,
  updated_at timestamp without time zone,
  description text NOT NULL,
  CONSTRAINT pkhotel_description_i18n PRIMARY KEY (id, lang),
  CONSTRAINT fk_hotel_description_i18n_hotel_description FOREIGN KEY (id)
  REFERENCES hotel_description (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);

CREATE TABLE hotel_description
(
  description_type_id integer NOT NULL,
  hotel_id integer NOT NULL,
  id serial NOT NULL,
  CONSTRAINT pkhotel_description PRIMARY KEY (id),
  CONSTRAINT fk_hotel_description_description_type FOREIGN KEY
(description_type_id)
  REFERENCES description_type (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
  CONSTRAINT fk_hotel_description_hotel FOREIGN KEY (hotel_id)
  REFERENCES hotel (id) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (OIDS=FALSE);


quantidade de registros

select count(*) from hotel_description; --327819 rows
select count(*) from hotel_description_translation; --568079 rows


o explain analyse resultou nisso:


"HashAggregate  (cost=88792.79..88793.09 rows=24 width=11)"
"  ->  Hash Join  (cost=10263.93..84532.20 rows=568079 width=11)"
"Hash Cond: (t.id = d.id)"
"->  Seq Scan on hotel_description_translation t
(cost=0.00..57895.79 rows=568079 width=7)"
"->  Hash  (cost=4885.19..4885.19 rows=327819 width=8)"
"  ->  Seq Scan on hotel_description d  (cost=0.00..4885.19
rows=327819 width=8)"





se alguém puder ajudar, não sei se é possível otimizar um pouco mais isso.

Nei




-- 
Nei Rauni Santos
nra...@gmail.com
+55 41 85020985
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral