N style="mso-spacerun: yes">capaSQL19.jpg

Clique aqui para ler todos os artigos desta edição

Otimizando performance de queries

Tuning de joins

por Paulo Ribeiro

Leitura obrigatória: SQL Magazine 19, Estatísticas de Distribuição de Dados no SQL Server 2000.

Ao escrever um join estamos informando ao otimizador quais são as colunas que desejamos visualizar e qual a lógica que deve ser empregada no relacionamento entre as tabelas. A não ser que utilizemos hints, não induzimos o otimizador a utilizar um plano de Nested Loop quando a opção inicial seria utilizar um Hash Join. Em outras palavras, ao escrever uma query não informamos como o otimizador deverá processar a query; deixamos a cargo dele a escolha do melhor plano.

O objetivo dessa matéria será estudar a fundo o funcionamento de joins no SQL Server 2000. Começaremos com os tipos básicos de join utilizados em queries (inner, left, right, full e o cross join). No decorrer do artigo a discussão será ampliada para dicas de tuning de queries, com foco sobre os modelos físicos de join (nested loop, merge e hash).

O que existe de comum entre a teoria dos conjuntos e os tipos de join

Lembram-se da velha teoria dos conjuntos? Pois os cinco tipos de join existem para reproduzir no mundo dos SGBD´s relacionais os modelos matemáticos que regem essa teoria.

Para explicar as diferenças existentes entre inner join, left join, right join, full outer join e cross join, vou fazer um paralelo com a teoria dos conjuntos. Considere a união (ASIMBOLO01.GIFB) entre os conjuntos A={1,2,3,4} e B={4,5,6,7}, cuja representação gráfica pode ser visualizada na Figura 1.

 

IMG01.JPG 

Figura 1. Representação gráfica da união entre os conjuntos A e B (ASIMBOLO01.GIFB).

 

Dando continuidade a nossa analogia, poderíamos transpor o conjunto A para a tabela de nome tab_A, o mesmo acontecendo para o conjunto B, que assumiria tab_B. O script da Listagem 1 irá criar e popular as duas tabelas.

 

Listagem 1. Script para criar e popular as tabelas.

use NorthWind

go

 

create table tab_a (elemento tinyint primary key clustered)

create table tab_b (elemento tinyint primary key clustered)

 

insert into tab_a values (1)

insert into tab_a values (2)

insert into tab_a values (3)

insert into tab_a values (4)

 

insert into tab_b values (4)

insert into tab_b values (5)

insert into tab_b values (6)

insert into tab_b values (7)

 

Formatado o ambiente, vamos reproduzir alguns relacionamentos comparando-os com modelos de join:

1.      Criar uma query para listar o elemento 4, resultado da intersecção entre os conjuntos A e B (ASIMBOLO01.GIFB = {4}).

 

O inner join é o modelo que devemos utilizar para identificar as linhas que possuem relação de igualdade entre duas tabelas. O select da Listagem 2 expressa esse relacionamento.

 

Listagem 2. Inner join.

select a.elemento

from tab_A a

INNER join

     tab_B b

on a.elemento = b.elemento

-------------------------------------------------------------------------------------------

 

elemento

-------------

4

...

Quer ler esse conteúdo completo? Tenha acesso completo