ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Select Not Exists muito lento[RESOLVIDO]

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
rogerioclaro2
Experiente
Experiente


Registrado: Quinta-Feira, 17 de Outubro de 2013
Mensagens: 404

MensagemEnviada: Ter Jul 24, 2018 11:12 am    Assunto: Select Not Exists muito lento[RESOLVIDO] Responder com Citação

Pessoal, bom dia!

Estou precisando fazer um select para verificar os registros de uma tabela que não estão em outras, no caso referencia de produto, sei que são 12071 registros que estão na tabela produtosl4 e nao estão na tabela produtosl1 e nem na produtosl3
Fiz assim
Código:

SELECT  * FROM produtol4 pr4
inner join produtol3 pr3 on pr3.referencia = pr4.referencia
WHERE NOT EXISTS (SELECT * FROM produtol1 pr1 WHERE pr1.referencia = pr4.referencia)


Porém esta muito, mas muito lento... demorando cerca de 6 horas para rodar, a estrutura das tabelas são as mesmas.

Tentei pegar somente um referencia que sei que só tem na produtol4 mas ele demora quase 15 min para trazer o resultado.

Alguém tem alguma ideia pra agilizar o processo? Uso Firebird

Desde já muito obrigado.


Editado pela última vez por rogerioclaro2 em Qui Jul 26, 2018 1:35 pm, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 24, 2018 11:31 am    Assunto: Responder com Citação

Bom dia,

Existe um índice nessas 3 tabelas com o campo Referencia?
Acho que se existir esse índice deveria executar rapidamente.


Editado pela última vez por imex em Ter Fev 27, 2024 11:55 am, num total de 1 vez
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rogerioclaro2
Experiente
Experiente


Registrado: Quinta-Feira, 17 de Outubro de 2013
Mensagens: 404

MensagemEnviada: Ter Jul 24, 2018 1:03 pm    Assunto: Responder com Citação

imex escreveu:
Bom dia,

Existe um índice nessas 3 tabelas com o campo Referencia?
Acho que se existir esse índice deveria executar rapidamente.



não tem imex, so pk, porém e diferente, iguais so o campo referencia
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Ter Jul 24, 2018 4:22 pm    Assunto: Responder com Citação

Não entendi muito bem... o campo Referencia é a PK das tabelas?
Se não é então acredito que você vai ter que criar índices nessas tabelas com o campo Referencia para melhorar o desempenho dessa consulta.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rogerioclaro2
Experiente
Experiente


Registrado: Quinta-Feira, 17 de Outubro de 2013
Mensagens: 404

MensagemEnviada: Qua Jul 25, 2018 2:04 pm    Assunto: Responder com Citação

imex escreveu:
Não entendi muito bem... o campo Referencia é a PK das tabelas?
Se não é então acredito que você vai ter que criar índices nessas tabelas com o campo Referencia para melhorar o desempenho dessa consulta.


certo IMEX, vou criar e posto os resultados, obrigado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rogerioclaro2
Experiente
Experiente


Registrado: Quinta-Feira, 17 de Outubro de 2013
Mensagens: 404

MensagemEnviada: Qui Jul 26, 2018 9:00 am    Assunto: Responder com Citação

Pessoal, bom dia , fiz os índices conforme nosso amigo imex deu ideia, e deu ceto, ficou rápido.

Porém me deparei com um outra situação, tentei not exists e o not in,

Código:

SELECT * FROM produtol4 pr4
WHERE pr4.referencia not in --NOT EXISTS
(SELECT pr1.referencia FROM produtol1 pr1
inner join
produtol3 pr3
on
pr1.referencia <> pr3.referencia
WHERE pr1.referencia = pr4.referencia)


Preciso de pegar os produtos que estão na l4 que nao estão na l3 e também não estão na l1 rsss depois fazer isso com a l3, fiz da forma acima mas ele traz algumas certas e outras erradas(que estão presentes na l3 e l1) alguém pode dar um help?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Jul 26, 2018 10:09 am    Assunto: Responder com Citação

Bom dia,

Acho que nesse caso você pode utilizar dois not exists:

Código:
SELECT * FROM produtol4 pr4
WHERE
    NOT EXISTS
        (SELECT pr1.referencia FROM produtol1 pr1
         WHERE pr1.referencia = pr4.referencia) AND
    NOT EXISTS
        (SELECT pr3.referencia FROM produtol3 pr3
         WHERE pr3.referencia = pr4.referencia)


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Jul 26, 2018 10:21 am    Assunto: Responder com Citação

ja tentou com having?

Código:
SELECT pr4.referencia AS ref4,
  pr3.referencia AS ref3,
  pr1.referencia AS re1
FROM produtol4 pr4
LEFT JOIN produtol3 pr3 ON pr3.referencia = pr4.referencia
LEFT JOIN produtol1 pr1 ON pr1.referencia = pr4.referencia
HAVING ref3 IS NULL OR ref1 IS NULL

_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
rogerioclaro2
Experiente
Experiente


Registrado: Quinta-Feira, 17 de Outubro de 2013
Mensagens: 404

MensagemEnviada: Qui Jul 26, 2018 1:30 pm    Assunto: Responder com Citação

Valeu imex e joemil, fiz alguns ajustes e deu certo, muito obrigado
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Qui Jul 26, 2018 3:14 pm    Assunto: Responder com Citação

qual deles deu certo?
_________________
<b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB