Usuário com melhor resposta
Queries com mesmo resultado, tempo de retorno diferenciado...

Pergunta
-
Qual retorno é mais rápido? Fazer Inner Join da tabela AB6010 (EXEMPLO 1) ou Utilizar Exists (EXEMPLO 2)? E Por Quê ?
EXEMPLO 1:
SELECT AB1_CODTEC, AB1_EMISSA, AA1_NOMTEC, AB1_NRCHAM, AA3_EST, AA3_MUN, AA3_CEP, AA3_LOCAL, AB2_NUMOS
FROM AB1010 AB1 (NOLOCK)
INNER JOIN AB2010 AB2 (NOLOCK)
ON AB1.AB1_FILIAL = AB2.AB2_FILIAL
AND AB1.AB1_NRCHAM = AB2.AB2_NRCHAM
INNER JOIN AA3010 AA3 (NOLOCK)
ON AB2.AB2_CODCLI = AA3.AA3_CODCLI
AND AB2.AB2_LOJA = AA3.AA3_LOJA
AND AB2.AB2_CODPRO = AA3.AA3_CODPRO
AND AB2.AB2_NUMSER = AA3.AA3_NUMSER
INNER JOIN AA1010 AA1 (NOLOCK)
ON AB1.AB1_CODTEC = AA1.AA1_CODTEC
INNER JOIN AB6010 AB6
ON AB2.AB2_FILIAL = AB6.AB6_FILIAL
AND LEFT(AB2.AB2_NUMOS,6) = LEFT(AB6.AB6_NUMOS,6)
WHERE AB1.D_E_L_E_T_ = ''
AND AB2.D_E_L_E_T_ = ''
AND AA3.D_E_L_E_T_ = ''
AND AA1.D_E_L_E_T_ = ''
AND AB6.AB6_STATUS = 'A'
AND AB1.AB1_CODTEC = '010146'
AND NOT EXISTS (SELECT 1 FROM AB9010 AB9 WHERE AB9.AB9_FILIAL = AB2.AB2_FILIAL AND LEFT(AB9.AB9_NUMOS,6) = LEFT(AB2.AB2_NUMOS,6))
EXEMPLO 2:
SELECT AB1_CODTEC, AB1_EMISSA, AA1_NOMTEC, AB1_NRCHAM, AA3_EST, AA3_MUN, AA3_CEP, AA3_LOCAL, AB2_NUMOS
FROM AB1010 AB1 (NOLOCK)
INNER JOIN AB2010 AB2 (NOLOCK)
ON AB1.AB1_FILIAL = AB2.AB2_FILIAL
AND AB1.AB1_NRCHAM = AB2.AB2_NRCHAM
INNER JOIN AA3010 AA3 (NOLOCK)
ON AB2.AB2_CODCLI = AA3.AA3_CODCLI
AND AB2.AB2_LOJA = AA3.AA3_LOJA
AND AB2.AB2_CODPRO = AA3.AA3_CODPRO
AND AB2.AB2_NUMSER = AA3.AA3_NUMSER
INNER JOIN AA1010 AA1 (NOLOCK)
ON AB1.AB1_CODTEC = AA1.AA1_CODTEC
WHERE AB1.D_E_L_E_T_ = ''
AND AB2.D_E_L_E_T_ = ''
AND AA3.D_E_L_E_T_ = ''
AND AA1.D_E_L_E_T_ = ''
AND AB1.AB1_CODTEC = '010146'
AND NOT EXISTS (SELECT 1 FROM AB9010 AB9 WHERE AB9.AB9_FILIAL = AB2.AB2_FILIAL AND LEFT(AB9.AB9_NUMOS,6) = LEFT(AB2.AB2_NUMOS,6))
AND EXISTS (SELECT 1 FROM AB6010 AB6 WHERE AB6.D_E_L_E_T_ = '' AND AB6.AB6_FILIAL = AB2.AB2_FILIAL AND LEFT(AB6.AB6_NUMOS,6) = LEFT(AB2.AB2_NUMOS,6)
AND AB6.AB6_STATUS = 'A')
Respostas
-
Denilson,
2 queryes diferentes ira gerar 2 planos de execução diferentes, fazendo com que os tempos sejam diferenciados devido a quais indices, meio de acessos, table lookup e muito mais, recomendaria voce marcar a opção do SSMS para trazer o plano de execução e compara-las.
------------------------------------------------------------- Oracle OCA11g- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 29 de março de 2011 17:05
- Marcado como Resposta Denison Soares quinta-feira, 31 de março de 2011 13:57
Todas as Respostas
-
Denilson,
2 queryes diferentes ira gerar 2 planos de execução diferentes, fazendo com que os tempos sejam diferenciados devido a quais indices, meio de acessos, table lookup e muito mais, recomendaria voce marcar a opção do SSMS para trazer o plano de execução e compara-las.
------------------------------------------------------------- Oracle OCA11g- Sugerido como Resposta Gustavo Maia Aguiar terça-feira, 29 de março de 2011 17:05
- Marcado como Resposta Denison Soares quinta-feira, 31 de março de 2011 13:57
-
-
Boa Tarde,
Complementando as colocações do Fabrizzio, acho que é impossível apenas olhando determinar a mais eficiente. Há várias variáveis que podem influenciar no resultado final e certamente que analisar os planos de execução é a saída correta para determinar que implementação utilizar ou ainda que índices podem ser adicionados para deixar a consulta mais performática.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.wordpress.com
Classifique as respostas. O seu feedback é imprescindível -
concordo com vocês Gustavo,
essa questão de performance no select depende muito do que você precisa. até porque as vezes não da pra trocar essas duas funções ESXISTS e INNER JOIN.
mas olhando o select do Denison seria melhor só INNER JOIN.
Att,
Midana Fernandes Sana Fortaleza - CE Brasil