Inquiridor
Ref.: Diferença de SELECTs

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.EmployeeIDSELECT Employees.EmployeeID
,Employees.FirstName
,Employees.LastName
,Employees.City
,EmployeeTerritories.TerritoryID
FROM Employees INNER JOIN
EmployeeTerritories ON Employees.EmployeeID = EmployeeTerritories.EmployeeIDExiste algum problema de performance???
Valeu!
T+
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.
-
-
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
-
-
-
-
-
Boa Tarde,
Eu até acredito que possa haver diferença no tempo total de execução. Fiz um pequeno teste abaixo:
SET
STATISTICS TIME ONSELECT
* FROM Person.Contact As ConINNER
JOIN HumanResources.Employee As Emp ON Con.ContactID = Emp.ContactIDSELECT
* FROM Person.Contact As Con, HumanResources.Employee As EmpWHERE
Con.ContactID = Emp.ContactIDDa 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