Desafio: Cadê meu Join?

Dessa vez apresento um desafio curioso que recebi esses dias enquanto estava no escritório. Uma pessoa me apresentou uma consulta SQL que relacionava os dados de cliente com os endereços.

SELECT

c.*FROM Clientes c LEFT OUTERJOIN Regioes r
ON c.regiaoId = r.regiaoId AND
r.regiaoId ISNULL

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 INNERJOIN Regioes r
ON c.regiaoId = r.regiaoId AND
r.regiaoId ISNULL

image

A pergunta desse Desafio Ninja é:

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

Poste sua opinião e resposta na seção de 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