Bruno Perroni
DBA SQL Server com mais de 6 anos de experiência!

Join Hints

Dando sequencia nessa linha de ‘HINTS’, vou tentar explicar de uma forma bem simplista e resumida os hints que podem ser utilizados em conjunto com os Joins.

Lembrando que a sua utilização deve ser avaliada com extremo cuidado e a melhor opção é deixar que o próprio SQL faça essa escolha.

Por experiencia própria a utilização desses hints em pouquíssimas vezes surtiu o efeito desejado.

| LOOP

  • Efetivo quando uma das tabelas envolvidas no Join tiver poucos registros e a outra uma grande quantidade de registros, pois utiliza pouco I/O devido ao fato de fazer poucas comparações.
use AdventureWorks2017

select NationalIDNumber, LoginID, JobTitle, BirthDate, HireDate, Name, GroupName
from HumanResources.Employee E
left join HumanResources.EmployeeDepartmentHistory EDH
	on E.BusinessEntityID = EDH.BusinessEntityID
left loop join HumanResources.Department D 
	ON EDH.DepartmentID = D.DepartmentID

| HASH

  • Hash joins são eficientes onde as tabelas envolvidas possuírem uma grande quantidade de registros, não ordenados e não indexados.
  • Adequado para result sets intermediários de queries complexas, pois não são indexados pelo query optimyzer.
use AdventureWorks2017

select NationalIDNumber, LoginID, JobTitle, BirthDate, HireDate, Name, GroupName
from HumanResources.Employee E
left join HumanResources.EmployeeDepartmentHistory EDH
	on E.BusinessEntityID = EDH.BusinessEntityID
left join HumanResources.Department D 
	ON EDH.DepartmentID = D.DepartmentID
OPTION ( HASH JOIN )

| MERGE

  • Adequado para joins onde ambas as colunas das tabelas envolvidas estejam indexadas.
use AdventureWorks2017

select NationalIDNumber, LoginID, JobTitle, BirthDate, HireDate, Name, GroupName
from HumanResources.Employee E
left merge join HumanResources.EmployeeDepartmentHistory EDH
	on E.BusinessEntityID = EDH.BusinessEntityID
left join HumanResources.Department D 
	ON EDH.DepartmentID = D.DepartmentID

 

| REMOTE

  • Sua utilização deve ser feita em tabelas que estão geograficamente distantes. Quando se trata de tabelas locais ele é ignorado.
  • Só funciona com Inner Joins.