Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Moriarty

SQL Avançado

Recommended Posts

Pessoal, tenho duas tabelas relacionadas:

 

- PESSOA_FISICA

e

- DEBITO

 

aonde ID_PESSOA_FISICA é FK (1:N) na tabela DEBITO.

 

Gostaria de otimizar um select que fiz, visto que esse está demorando muito tempo para executar.

Meu objetivo é pegar todas as pessoas físicas que não possuem registro na tabela DEBITO, ou seja, como se fosse um join inverso.

 

Abaixo é o SELECT que estou usando mas que está demorando muito, devido a qtd de registros que as duas tabelas possuem.

 

SELECT * FROM pessoa_fisica WHERE id_pessoa_fisica NOT IN (SELECT distinct id_pessoa_fisica FROM DEBITO)

Compartilhar este post


Link para o post
Compartilhar em outros sites

veja se utilizando o Left join melhora...

tipo assim:

SELECT DISTINCTpessoa_fisica.*

FROM pessoa_fisica

LEFT JOIN DEBITO ON pessoa_fisica.id_pessoa_fisica = DEBITO.id_pessoa_fisica

WHERE

DEBITO.id_pessoa_fisica IS NULL

quais os índices existentes nestas tabelas com relação a estes campos que estão sendo utilizados neste join? Se não tiver, talvez seja interessante criar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, o LEFT JOIN deixa três vezes mais lento. Piora muito a performance dessa query.

Possuo indices nas chaves estrangeiras e chaves primárias

Compartilhar este post


Link para o post
Compartilhar em outros sites

é... consulta lenta é brabo...

faz o seguinte, utiliza o explain em uma destas consultas (ou nas duas) e verifique se o mysql está utilizando o índice que deveria utilizar já que tem alguns criados...

se ainda não utilizou dá uma lida nesta documentação: http://dev.mysql.com/doc/refman/5.0/en/explain.html, aqui tem mais detalhes http://dev.mysql.com/doc/refman/5.0/en/using-explain.html.

se quiser, posta o resultado do explain pro pessoal dar uma olhada e ver o que pode ser feito para melhorar o desempenho. se possível, põe o resultado (explain) das duas consultas para uma comparação mais precisa.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala Cassitas,

 

Usei o explain e está tudo correndo corretamente. O problema é o MYSQL que é muito ruim com subquerys.

Por isso sempre recomendo o Postgresql.

 

Placar: POSTGRE 15.324.621.546.132.156.132.135.457.831 X 0 MYSQL

 

Infelizmente nesse caso tenho que usar o Mysql, mas já resolvi o problema no código mesmo.

 

Valeu!!!

 

Abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

po... 'cassitas' ficou (mais) estranho huaheuehauehe http://forum.imasters.com.br/public/style_emoticons/default/yay.gif

 

bom, já que no explain está tudo certo... http://forum.imasters.com.br/public/style_emoticons/default/ninja.gif

 

qquer novidade estamos ae!

http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.