Inicial > SQL Server > Tipo de Joins no SQL Server

Tipo de Joins no SQL Server

Semana passada participei de um treinamento de SQL Server na empresa em que falamos sobre execution plan, durante o treinamento surgiram alguns operadores de joins em nossas consultas de exemplo e percebi a necessidade de falar mais sobre alguns tipos de joins, ou seja, assunto para o Blog.

 

Estou lendo o livro SQL Server 2005 Query Tunning and Optimization e vou aproveitar os excelentes exemplos e explicações de como os operadores de join funcionam.

 

Vamos nos basear na seguinte consulta para os exemplos:

 

Select codigo from tabela1

Inner join tabela2

  On tabela1.id = tabela2.id

Where tabela1.id = 10

  

Nested Loops Joins – Compara cada linha de uma tabela(também conhecido por OUTER TABLE(FROM)) com cada linha de outra tabela(também conhecido por inner table) procurando pelas linhas que satisfaçam o relacionamento.

Pseudo-Código:

 

for each row tabela1 in the outer table

  for each row tabela2 in the inner table

     if tabela1 joins with tabela2

        return(tabela1, tabela2)

 

Merge Join  – Trabalha em simultâneo lendo e comparando cada linha das duas tabelas ordenadas pelo relacionamento. Para cada etapa compara a linha atual para cada valor na tabela do join, se o valor for igual a entrada então ele retorna o join e continua a comparação. Se o valor não for igual ele descarta o resultado e continua a próxima leitura. Um Merge Join não necessariamente irá ler toda a tabela, quando a leitura chegar no fim de qualquer tabela envolvida no join o loop é parado.

Pseudo-Código:

 

Get first row tabela1 from input 1

Get first row tabela2 from input 1

While not at the end of either input

Begin

  If tabela1 joins with tabela2

  Begin

    Output(tabela1, tabela2)

    Get next row tabela2 from input 2

  end

  else if tabela1 < tabela2

    get next row tabela1 from input 1

  else

    get next row tabela2 form input 2

end

 

Hash Join – O hash join compartilha alguns conceitos do Merge Join, o algoritmo de Hash é executado em duas fases conhecidas por Build(Construção) e Probe(prova ou experimento). Durante a fase de Build o SQL irá ler todas as linhas do primeiro input(from) e criar uma tabela com os dados lidos mais o relacionamento gerando uma Hash Table em memória. Na fase do probe o SQL irá ler cada linha do segundo input(tabela do join) gerar o valor hash e verificar se o seu valor tem o mesmo valor da tabela Hash table recém criada retornando todas as linhas que tem o mesmo valor. É importante destacar que não necessariamente a Hash table sempre será gerada em memória pois o SQL irá reservar a quantidade de memória necessária para criação da tabela antes de cria-lá baseado nas statisticas geradas pelo otimizador. Caso durante e build o SQL necessite de mais memória para gerar a tabela Hash ele pode gravar os dados em um espaço temporário ou seja, TempDB.

Pseudo-Código:

 

For each row tabela1 in the build table

Begin

  Calculate hash value on tabela1 join key(s)

  Insert tabela1 into the appropriate hash bucket

End

For each row tabela2 in the probe table

Begin

  Calculate hash value on tabela2 join key(s)

  For each row tabela1 in the corresponding hash bucket

    If tabela1 with tabela2

      Ouput (tabela1, tabela2)

end

 

Cabe a dica que para os seus testes você pode forcar o SQL a usar um determinado tipo de join se os exemplos:

 

SELECT Tabela1.ID

FROM Tabela1

INNER LOOP JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

GO

SELECT Tabela1.ID

FROM Tabela1

INNER MERGE JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

GO

SELECT Tabela1.ID

FROM Tabela1

INNER HASH JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

 

Fonte – Inside SQL Servr 2005: Query Tunning and Optimization.

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário