SelfJoin x CTE (Common Table Expression) 0
Depois de muito tempo, voltei … na verdade fiquei um tempinho em off pois estava estudando para tirar a certificação e preparar o meu treinamento de SQL Server. Mas a boa notícia que consegui tirar a certificação, com um Score de 970. Prestei a prova 70-433.
Agora mãos a obra …
Hoje iremos falar sobre CTE – Common Table Expression X SelfJoin.
O CTE é um recurso desde o SQL Server 2005. Se compararmos o código do Self-Join com o CTE , até parece complicado (Rs), mas ao decorrer do Post, veremos que fácil.
Antes de mais nada, Self Join é quando utilizamos a mesma tabela no FROM e no JOIN. É normal fazermos isso quando queremos por exemplo listar todos os funcionários e seus superiores. Antes do SQL Server 2005, esta era a forma que conseguíamos fazer esta junção.
SELECT E.EmployeeKey, e.FirstName + '' + E.LastName as 'Employee Name', ds.FirstName + '' + ds.LastName as 'Supervisor Name' FROM DimEmployee e INNER JOIN DimEmployee ds ON e.ParentEmployeeKey = ds.EmployeeKey ORDER BY e.EmployeeKey
Com esta query consigo pegar os funcionários e quem é seu supervisor.
Ao decorrer do Post, iremos ver várias maneiras da utilização do CTE. Lembrando que podemos utilizar no escopo de SELECT, INSERT, DELETE, MERGE ou DELETE.
Uma CTE pode se auto referenciar (CTE recursiva) e pode ser referenciada várias vezes na mesma query.
Sintaxe:
WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition )
Vou dar um exemplo simples da utilização:
WITH CTE_Simples (Id, Nome) AS
(
SELECT Id, Nome FROM Funcionario
)
SELECT * FROM CTE_Simples
ou até mesmo
WITH CTE_Simples (Id, Nome) AS
(
SELECT 1, 'Rafaela'
)
SELECT * FROM CTE_Simples
Simples não é mesmo ??? Claro, quando pensamos na utilização do CTE, pensamos em recursividade. Onde eu preciso chamar a minha CTE várias vezes, e isso cai no caso do exemplo que dei sobre Self-Join.
Vamos então utilizar o exemplo do Self-Join utilizando CTE.
Para trabalhar com CTE recursiva (Recursive CTE), tem uma query inicial, chamada de query âncora e uma segunda query que é liga a âncora, através do UNION ALL.
WITH Employee_CTE (employeeKey,Level, EmployeeName) AS ( SELECT e.EmployeeKey, 1, e.FirstName + '' + E.LastName as Name FROM DimEmployee e WHERE e.ParentEmployeeKey IS NULL UNION ALL SELECT e.EmployeeKey, cte.level + 1, e.FirstName + ' ' + E.LastName AS Name FROM DimEmployee e INNER JOIN Employee_CTE cte ON E.ParentEmployeeKey = cte.employeeKey ) SELECT * FROM Employee_CTE
Se executarmos as duas querys (Self-Join e CTE) o Execute Plan tratá os seguintes custos:
- Self-Join – 0.0642
- CTE – 0.0249.
Claro, temos que considerar que a tabela que estou utilizando tem apenas 296, mas a intensão é mostrar que temos um ganho de performance utilizando o CTE.
Bom espero que tenham gostado, e nos vemos na próxima.
por Rafaela Maion
leia também
