Dúvida em um select - Muito lento

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pc_delphi
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Qui, 29 Mai 2008 6:44 pm
Localização: São Paulo
Tudo posso, nAquel que me fortalece
Filipenses 4:13

Preciso fazer um Count e que que essas informações não estejam dentro de uma entidade chamada CONSUMIDOR. Para não ter na CONSUMIDOR eu digo que uma coordenada
não esteja dentro da entidade consumidor. O que passa é que a tabela consumidor é muito grande, na casa de milhões de registros, o que torna o select com um
NOT IN muito lento, às vezes levando horas, pois não consegui um bom plano de execução da query. Fiz mais ou menos assim:

Selecionar tudo

SELECT COUNT(*)TOTAL FROM
TABELA1 TBL1, TABELA2 TBL2
WHERE TBL1.PONTO_X = TBL2.PONTO_X
AND TBL1.PONTO_Y = TBL2.PONTO_Y
AND TBL1.PONTO_X NOT IN(SELECT PONTO_X FROM CONSUMIDOR);
O select acima está acabando com o meu processamento. Alguém me ajudar a minimizar isso?
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5026
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Na real, pra ajudar, a gente tem que ter muito mais informação:
* Quantas linhas tem cada tabela
* Quais são as chaves / índices de cada uma
* Quantas linhas tem nessa tabela do NOT IN
* O plano de execução completo

se tiver mais informação, melhor :-S
pc_delphi
Rank: Analista Pleno
Rank: Analista Pleno
Mensagens: 128
Registrado em: Qui, 29 Mai 2008 6:44 pm
Localização: São Paulo
Tudo posso, nAquel que me fortalece
Filipenses 4:13

Fiz algumas mudanças e melhorou. O erro foi meu. Primeiro, troquei o NOT IN por NOT EXISTS e claro, que na subconsulta do NOT EXISTS, precisei relacionar com a query de "Fora", aí fiz assim e melhorou e veio o resultado:

Selecionar tudo

SELECT COUNT(*)TOTAL FROM 
TABELA1 TBL1, TABELA2 TBL2 
WHERE TBL1.PONTO_X = TBL2.PONTO_X 
AND TBL1.PONTO_Y = TBL2.PONTO_Y 
AND NOT EXISTS(SELECT NULL FROM CONSUMIDOR CS 
WHERE TBL1.PONTO_X = CS.PONTO_X AND TBL1.PONTO_Y = CS.PONTO_Y);
Vou postar mais informações, conforme pediu o dr_gori, mas essa mudança que eu fiz melhorou bastante a performance, só falta comparar o resultado e ver se está correto.
Responder
  • Informação