none
Queries com mesmo resultado, tempo de retorno diferenciado... RRS feed

  • 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
    Moderador

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
    Moderador
  • 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