Moriarty 0 Denunciar post Postado Agosto 12, 2008 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
cassitos 2 Denunciar post Postado Agosto 12, 2008 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
Moriarty 0 Denunciar post Postado Agosto 12, 2008 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
cassitos 2 Denunciar post Postado Agosto 12, 2008 é... 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
Moriarty 0 Denunciar post Postado Agosto 13, 2008 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
cassitos 2 Denunciar post Postado Agosto 13, 2008 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