Operador do dia – Concatenation
O operador de hoje é o concatenetion, seu comportamento é bem simples, ele recebe vários inputs, concatena tudo e retorna cada linha lida. Ele pode ser visualizado quando utilizado o comando UNION ALL.
É um exemplo clássico de operadores que recebem mais de um input, e tem mais de um filho.
Antes de iniciar a falar sobre ele vamos entender alguns pontos importantes em relação aos operadores dos Planos de Execução.
Todos os operadores executam os mesmos comandos de Init(), GetNext() e Close(), e estes operadores podem receber um ou mais filhos como input, vamos ver alguns exemplos.
Script para criação de tabela de teste.
USE tempdb
GO
CREATE TABLE TABTeste(ID Int Identity(1,1) PRIMARY KEY,
Nome VarChar(250) DEFAULT NewID())
GO
SET NOCOUNT ON
GO
INSERT INTO TABTeste DEFAULT VALUES
GO 10000
O comando acima cria uma tabela e inclui 10000 registros.
SELECT *
FROM TABTeste a
INNER JOIN TABTeste b
ON a.ID = b.ID
Plano de execução estimado:
SELECT * FROM TABTeste a INNER JOIN TABTeste b ON a.ID = b.ID
|–Merge Join(Inner Join, MERGE:([b].[ID])=([a].[ID]), RESIDUAL:([tempdb].[dbo].[TABTeste].[ID] as [b].[ID]=[tempdb].[dbo].[TABTeste].[ID] as [a].[ID]))
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD] AS [b]), ORDERED FORWARD)
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD] AS [a]), ORDERED FORWARD)
Como podemos observar, na consulta acima o SQL utilizou o operador de MERGE para fazer a operação de Join entre as tabelas do select, e neste caso ele está recebendo dois filhos(duas vezes a tabela TABTeste) como input.
O operador de hoje, o Concatenation é um exemplo de operadores que tem mais de um filho como input.
SELECT * FROM TABTeste
UNION ALL
SELECT * FROM TABTeste
UNION ALL
SELECT * FROM TABTeste
UNION ALL
SELECT * FROM TABTeste
SELECT * FROM TABTeste UNION ALL SELECT * FROM TABTeste UNION ALL SELECT * FROM TABTeste UNION ALL SELECT * FROM TABTeste
|–Concatenation
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD]))
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD]))
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD]))
|–Clustered Index Scan(OBJECT:([tempdb].[dbo].[TABTeste].[PK__TABTeste__3214EC2743869CDD]))
O operador Concatenation recebe o resultado dos scans efetuados pelo Clustered Index Scan e copia as linhas lidas para o Outupt, e repete este processo para todos os Inputs.
O SQL irá executar este processo na ordem que é exibido o
plano, neste caso, o primeiro scan é o acima e o ultimo é o abaixo.