none
Ref.: Diferença de SELECTs RRS feed

  • Pergunta

  • Olá Pessoal,

     

    Qual a diferença das selects abaixo???

     

    SELECT Employees.EmployeeID
          ,Employees.FirstName
          ,Employees.LastName
          ,EmployeeTerritories.TerritoryID
      FROM Employees
          ,EmployeeTerritories
     WHERE Employees.EmployeeID = EmployeeTerritories.EmployeeID

     

    SELECT Employees.EmployeeID
          ,Employees.FirstName
          ,Employees.LastName
          ,Employees.City
          ,EmployeeTerritories.TerritoryID
      FROM Employees INNER JOIN
           EmployeeTerritories ON Employees.EmployeeID = EmployeeTerritories.EmployeeID

     

    Existe algum problema de performance???

     

    Valeu!

     

    T+

    sábado, 29 de dezembro de 2007 20:17

Todas as Respostas

  • Oi xará,

     

    Qdo eu comecei a programar em SQL eu usava o WHERE para relacionar as tabelas.  Com o tempo eu passei a usar o INNER JOIN (que é justamento para relacionar as tabelas) e deixei o WHERE para usar com os parâmetros e filtrar minha consulta.

     

    Sinceramente eu não percebi nenhuma diferença em performance, apenas na limpesa do código.   Tudo bem que não tenho tabelas mostruosas.

     

    Mas aconselho a você a usar INNER JOIN que é a prática mais correta.

     

    Acredito que ao final do longo feriado você obterá respostas mais profissionais que a minha (a galera fera estará de volta).

     

    Mas espero  ter ajudado.

     

    Abraços e feliz 2008.

    sábado, 29 de dezembro de 2007 21:30
  • Olá Perrot... Agradeço-lhe por tua visão!!!

     

    Feliz 2008 e precisando estamos aí...

     

    Abração!

    domingo, 30 de dezembro de 2007 17:43
  • Boa Tarde,

     

    Acho que a resposta do Perrot já está simples e correta. Podemos acrescentar outros detalhes, mas a resposta já está simples e já basta. "Não há nenhuma diferença em performance, apenas limpeza no código".

     

    Fazer junções na cláusula WHERE é um vício muito comum entre iniciantes e analistas mais antigos. Isso porque anteriormente (bem anteriormente) não havia como fazer junções senão via WHERE (bem nos primórdios da SQL). Como semanticamente, junções via cláusula WHERE e JOIN tem o mesmo resultado não há problemas em optar por uma ou por outra. Os iniciantes acabam fazendo junções na cláusula WHERE por ser de certa forma mais intuitiva.

     

    Há rumores de que existe diferença de desempenho, mas isso é apenas especulação (talvez nos primeiros SGBDs relacionais isso fosse verdade). Se você copiar as duas queries e verificar o plano de execução estimado ou real (CTRL + L ou CTRL + M) verá que ambas as consultas tem exatamente o mesmo plano, o mesmo desempenho e o mesmo resultado.

     

    Seguindo a recomendação do Perrot, use o JOIN por conta da limpeza do código. Quanto maior o número de tabelas e de filtros, pior ficará a cláusula WHERE. Nesse caso, fazer junções através do INNER JOIN deixará sua cláusula WHERE mais limpa e fácil de manter.

     

    No caso do SQL Server, quando se utiliza JOINs, é possível influenciar no comportamento do otimizador optando por outros algoritmos de junção como o Nested Loops, Merge Join ou Hash Join. Embora isso represente uma certa vantagem não é comum realizarmos essa alteração. Sendo assim, por uma instrução SQL mais limpa, evite junções na cláusula WHERE.

     

    [ ]s,

     

    Gustavo

    domingo, 30 de dezembro de 2007 20:05
  • Bom dia Marcelo

     

    A diferença é que o segundo SQL está no padrão SQL ANSI 92. Em muitos casos você vai perceber que é muito mais simples utilizar o INNER ao invés do WHERE.

     

     

     

     

     

     

    Espero ter ajudado

     

    segunda-feira, 31 de dezembro de 2007 10:56
  • O select com as tabelas no from tendem a gastar mais CPU no Parse e Compile, comprove usando o SET STATISTICS TIME ON,

     

     

    quarta-feira, 2 de janeiro de 2008 18:38
  • Fabiano, vc. analisou isso mesmo, o plano de execucao e o mesmo para o os dois casos ?

    quarta-feira, 2 de janeiro de 2008 18:47
  • Sim Marcelo, o mesmo Plano de Execução.

    quarta-feira, 2 de janeiro de 2008 19:12
  • Boa Tarde,

     

    Eu até acredito que possa haver diferença no tempo total de execução. Fiz um pequeno teste abaixo:

     

    SET STATISTICS TIME ON

    SELECT * FROM Person.Contact As Con

    INNER JOIN HumanResources.Employee As Emp ON Con.ContactID = Emp.ContactID

    SELECT * FROM Person.Contact As Con, HumanResources.Employee As Emp

    WHERE Con.ContactID = Emp.ContactID

     

    Da primeira vez, a junção na cláusula WHERE foi mais rápida e na segunda vez foi mais lenta. Acredito que pequenas variações possam ocorrer por conta dos recursos disponíveis (CPU, Memória, Disco, etc). Mesmo que não haja ninguém utilizando, as variações de páginas na memória, memory clerck, ciclo de CPU, trechos de pesquisa de disco, etc não vão ser exatamente as mesmas. Não sei se podemos generalizar e dizer que uma é mais rápida que a outra principalmente por que as duas tem exatamente o mesmo plano com a carga dividida (50% para cada).

     

    [ ]s,

     

    Gustavo

    quarta-feira, 2 de janeiro de 2008 19:28