Re: [pgbr-geral] Interpretação do explain analyse
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
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
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
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
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
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
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
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