Resposta Desafio SQL Server – Cadê o meu join?

Boa noite!

Quanto tempo não escrevo? Rs… Vamos tentar manter regularidade, né?

Bom, antes de responder o Desafio, quero deixar todos os créditos para o incrível Fabrício Catae e seu blog http://blogs.msdn.com/b/fcatae/archive/2012/01/23/desafio-cad-234-meu-join.aspx

O desafio foi criado por ele e não tenho nenhum crédito sobre isso. Só achei interessante repassar, pois a resposta dele é um excelente exemplo do funcionamento do optimizer do SQL Server.

O Optimizer do SQL é inteligente para saber que RegiaoID não pode ser NULL, então quando é feita uma consulta que foge uma FK ou uma check constraint (no exemplo em questão: “WHERE regiaoId IS NULL”) o optimizer nem precisa acessar a tabela para ter certeza que não vai retornar nenhuma linha.

Até a próxima!

Anúncios

Desafio SQL Server – Cadê meu JOIN?!

Achei esse desafio em um site(no qual não vou dizer agora pros espertinhos não procurarem a resposta; porém, darei todo o crédito ao responsável pelo desafio depois, ok?!), e resolvi compartilhar com vocês.

O nome do desafio é Cadê o meu JOIN?

A resposta estarei postando em breve ou comentarei quando alguém acertar! Abraço a todos os amantes do SQL Server!

Uma pessoa me apresentou uma consulta SQL que relacionava os dados de cliente com os endereços.

SELECT c.* FROM Clientes c LEFT OUTER JOIN Regioes r
ON c.regiaoId = r.regiaoId AND
r.regiaoId IS NULL

O interessante é que o plano de execução gerada não possui JOIN entre tabelas. Surge a pergunta: CADÊ MEU JOIN???

image

O problema fica mais interessante quando substituimos o LEFT OUTER JOIN por um INNER JOIN, pois o plano de execução não apresenta a leitura em nenhuma tabela.

SELECT c.* FROM Clientes c INNER JOIN Regioes r
ON c.regiaoId = r.regiaoId AND
r.regiaoId IS NULL

image

A pergunta desse Desafio Ninja é:

O que aconteceu com o Join de tabela e com a operação de Table Scan?

Fico aguardando as respostas nos comentários!

Script usado:

CREATE TABLE Regioes
(regiaoId INT PRIMARY KEY,
   local VARCHAR(100) NOT NULL)

CREATE TABLE Clientes
  (id INT,
nome VARCHAR(50),
regiaoId INT FOREIGN KEY REFERENCES Regioes(regiaoId))

INSERT Regioes VALUES (1, ‘Norte’), (2, ‘Sul’)
INSERT Clientes VALUES (1, ‘Cliente1’, 1), (2, ‘Cliente2’, 1)
GO

SELECT c.* FROM Clientes c LEFT JOIN Regioes r
ON    c.regiaoId = r.regiaoId AND
r.regiaoId IS NULL

SELECT c.* FROM Clientes c INNER JOIN Regioes r
ON    c.regiaoId = r.regiaoId AND
r.regiaoId IS NULL