# 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')
quinta-feira, 17 de março de 2011 22:00

### 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
quinta-feira, 17 de março de 2011 23:51

### 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
quinta-feira, 17 de março de 2011 23:51
• Denison,

nesse caso, eu acho que Inner Join é mais rápido. mas são dois comandos SQL que na realidades são utilizados pra circunstancias fdiferentes.

Att,

Midana Fernandes Sana Fortaleza - CE Brasil
terça-feira, 29 de março de 2011 14:41
• 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
terça-feira, 29 de março de 2011 17:05
• 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
quarta-feira, 30 de março de 2011 03:26