Re: [pgbr-geral] Obter menor valor de coluna - Dúvida sobre index only scan em tabela/índice grande
2016-09-30 16:52 GMT-03:00 Everton Luís Berz : > Ambas realizam um index only scan e levam em torno de 10 minutos pra > terminar. hm... Sério? Bem estranho isso mesmo, eram pra ser consultas quase instantâneas, mesmo com bilhões de linhas na tabela. E ambas têm uma execução bem semelhante, duvido que encontrará diferença de performance entre uma e outro (ao menos nas versões mais recentes). Se está lento assim, a única explicação que vem à minha cabeça é um inchaço bem grande nesse índice, se for o caso um REINDEX (ou criar um novo índice, assim pode usar o CONCURRENTLY) deve resolver. Pode testar? Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Erro ao executar vários deletes
On Fri, Sep 30, 2016 at 2:28 PM, wrote: > ERROR: permission denied for schema transporte LINE 1: SELECT 1 FROM ONLY > "transporte"."anexo_movimento_veiculo" x ...^ > QUERY: SELECT 1 FROM ONLY "transporte"."anexo_movimento_veiculo" x WHERE > $1 OPERATOR(pg_catalog.=) "id_movimento_veiculo" FOR KEY SHARE OF x > CONTEXT: SQL statement "delete from transporte.movimento_veiculo mv2 where > mv2.id_movimento_veiculo= movimento_veiculo[i]" PL/pgSQL function > inline_code_block line 38 at SQL statement É, acho que essa não é muito intuitiva mesmo... Vou tentar explicar. Esse erro acontece quando você executa o DELETE na tabela " transporte.movimento_veiculo", e certamente há uma chave estrangeira da tabela "anexo_movimento_veiculo" para a "movimento_veiculo", certo? Bem, para verificar se o DELETE que você executou não fere essa *constraint* (ou seja, se não está deletando um "movimento_veiculo" que ainda é referenciado em "anexo_movimento_veiculo"), o PostgreSQL executa o SELECT que você vê aí: SELECT 1 FROM ONLY "transporte"."anexo_movimento_veiculo" x WHERE $1 OPERATOR(pg_catalog.=) "id_movimento_veiculo" FOR KEY SHARE OF x Sendo "$1" o valor que está sendo excluído pela PK (ou uma UK) de " movimento_veiculo". Mas, veja que esse SELECT é executado internamente pelo PostgreSQL (a maioria das pessoas nem sabe que é um SELECT que é feito para verificar FK), e essa consulta só existe porque há uma chave estrangeira na tabela " anexo_movimento_veiculo" (que esse *owner* é responsável por ela), isso significa que o proprietário/*owner* dessa tabela é quem está forçando essa restrição, logo esse mesmo proprietário/*owner* deve ter permissão de executar esse SELECT acima, assim sendo o PostgreSQL faz essa consulta como se estivesse logado com esse usuário. Ou seja, a solução do seu problema é: 1. Veja qual o *owner* da "anexo_movimento_veiculo" 2. Adicione permissão necessária. Por exemplo: GRANT USAGE ON SCHEMA transporte TO ; 3. Teste novamente, e se der algum erro nos avise aqui, pode ter mais alguma permissão faltando. Meio chatinho essa parte, fui claro? Pode perguntar aí se tiver alguma dúvida. Atenciosamente, -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Obter menor valor de coluna - Dúvida sobre index only scan em tabela/índice grande
Pessoal preciso obter o menor valor de uma coluna e tentei de duas formas: a) SELECT id_log FROM tb_log ORDER BY id_log LIMIT 1; "Limit (cost=0.57..0.62 rows=1 width=8)" " -> Index Only Scan using pk_tb_log on tb_log (cost=0.57..7626461.90 rows=156814622 width=8)" b) SELECT min(id_log) FROM tb_log; "Result (cost=0.62..0.63 rows=1 width=0)" " InitPlan 1 (returns $0)" "-> Limit (cost=0.57..0.62 rows=1 width=8)" " -> Index Only Scan using pk_tb_log on tb_log (cost=0.57..8018482.05 rows=156814313 width=8)" "Index Cond: (id_log IS NOT NULL)" Ambas realizam um index only scan e levam em torno de 10 minutos pra terminar. Entendo que o custo está alto pois são 150 milhões de linhas, mas os dados do índice já não são armazenados de maneira ordenada? Não seria somente o PostgreSQL obter o primeiro valor do índice que seja válido? O quê não estou enxergando aí? Alguma outra solução pra obter o menor valor da coluna em tempo reduzido? ps: por motivos diversos, não posso particionar a tabela. Estrutura da tabela: xxx=# \d tb_log Table "public.tb_log" Column |Type |Modifiers +-+- id_log | bigint | not null default nextval('sq_tb_log'::regclass) id_usuario | integer | id_pagina | character varying(200) | ds_ip | character varying(15) | not null ds_entidade| character varying(50) | not null ds_id_entidade | character varying(200) | not null tp_operacao| character(1)| not null dt_log | timestamp without time zone | ds_package | character varying(150) | Indexes: "pk_tb_log" PRIMARY KEY, btree (id_log) "idx_tb_log2" btree (id_usuario) "tb_log_in02" btree (dt_log, id_usuario) Check constraints: "tp_operacao_check" CHECK (tp_operacao = ANY (ARRAY['I'::bpchar, 'D'::bpchar, 'U'::bpchar, 'S'::bpchar])) Obrigado -- Everton ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Depuração & pgHero
2016-09-30 16:47 GMT-03:00 Roberto Mello : > > On Fri, Sep 30, 2016 at 12:45 PM, Guimarães Faria Corcete DUTRA, Leandro > wrote: >> >> https://www.justwatch.com/blog/post/debugging-postgresql-performance-the-hard-way/ > > Excelentes artigos! Grato por compartilhar! De nada! E obrigado por confirmar minha impressão. Estou tão afastado do traçado que compartilho algumas coisas até para saber se realmente é tão bom quanto me pareceu. -- skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra +55 (61) 3546 7191 gTalk: xmpp:leand...@jabber.org +55 (61) 9302 2691ICQ/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] Depuração & pgHero
On Fri, Sep 30, 2016 at 12:45 PM, Guimarães Faria Corcete DUTRA, Leandro < l...@dutras.org> wrote: > Porque hoje é sexta. > > https://www.justwatch.com/blog/post/debugging-postgresql-performance-the- > hard-way/ > > https://github.com/ankane/pghero Excelentes artigos! Grato por compartilhar! Roberto ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Erro ao executar vários deletes
Olá Pessoal, Esse é meu primeiro post.Não tenho muito experiencia com PostgreSQL.Estou fazendo a seguinte consulta para em seguida fazer alguns DELETES, porem esta dando erro.DO $$DECLARE reserva_veiculo INTEGER[]; movimento_veiculo INTEGER[]; i INTEGER; BEGIN i:=0; reserva_veiculo := ARRAY (select r.id_reserva_veiculo from transporte.movimento_veiculo m inner join transporte.reserva_veiculo r on (r.id_movimento_veiculo = m.id_movimento_veiculo) left join requisicoes.requisicao_reserva_veiculo req on (req.id_reserva_veiculo = r.id_reserva_veiculo) inner join transporte.veiculo v on (v.id_veiculo = r.id_veiculo) where --req.numero=21937 v.placa = 'JKO-4601')::integer[]; movimento_veiculo := ARRAY (select m.id_movimento_veiculo from transporte.movimento_veiculo m inner join transporte.reserva_veiculo r on (r.id_movimento_veiculo = m.id_movimento_veiculo) left join requisicoes.requisicao_reserva_veiculo req on (req.id_reserva_veiculo = r.id_reserva_veiculo) inner join transporte.veiculo v on (v.id_veiculo = r.id_veiculo) where --req.numero=21937 v.placa = 'JKO-4601')::integer[]; FOR i in 1..array_length(reserva_veiculo,1) loop raise notice 'reserva_veiculo: %', reserva_veiculo[i]; delete from transporte.motorista_reserva where motorista_reserva.id_reserva_veiculo= reserva_veiculo[i]; delete from requisicoes.requisicao_reserva_veiculo r where r.id_reserva_veiculo= reserva_veiculo[i]; delete from transporte.reserva_veiculo rv where rv.id_reserva_veiculo= reserva_veiculo[i]; end loop; i :=0; FOR i in 1..array_length(movimento_veiculo,1) loop raise notice 'movimento_veiculo: %', movimento_veiculo[i]; delete from transporte.movimento_veiculo_passageiro mv where mv.id_movimento_veiculo= movimento_veiculo[i]; delete from transporte.trecho_percorrido mv1 where mv1.id_movimento_veiculo= movimento_veiculo[i]; delete from transporte.movimento_veiculo mv2 where mv2.id_movimento_veiculo= movimento_veiculo[i]; end loop; END$$; Porem está dando o seguinte erro:ERROR: permission denied for schema transporte LINE 1: SELECT 1 FROM ONLY "transporte"."anexo_movimento_veiculo" x ... ^ QUERY: SELECT 1 FROM ONLY "transporte"."anexo_movimento_veiculo" x WHERE $1 OPERATOR(pg_catalog.=) "id_movimento_veiculo" FOR KEY SHARE OF x CONTEXT: SQL statement "delete from transporte.movimento_veiculo mv2 where mv2.id_movimento_veiculo= movimento_veiculo[i]" PL/pgSQL function inline_code_block line 38 at SQL statementSim, tenho permissão para excluir. Se eu rodar somente as linhas dos deletes, substituindo as variáveis. A exclusão acontece sem erros. Obrigado pela atenção ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Depuração & pgHero
Porque hoje é sexta. https://www.justwatch.com/blog/post/debugging-postgresql-performance-the-hard-way/ https://github.com/ankane/pghero -- skype:leandro.gfc.dutra?chat Yahoo!: ymsgr:sendIM?lgcdutra +55 (61) 3546 7191 gTalk: xmpp:leand...@jabber.org +55 (61) 9302 2691ICQ/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] Mudanças no repositório do PGDG
2016-09-29 14:15 GMT-03:00 Sebastian Webber : > Imagino que os servidores baseados no Debian sofram do mesmo mal. Pelo que entendi essas mudanças foram só nos repositórios yum/rpm mesmo. -- Matheus de Oliveira ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral