Tenho as seguintes consultas para selecionar o pedido mais recente de cada usuário. Existe alguma vantagem de performance na consulta utilizando CTE? Para minhas tabelas atuais, ambas estão fornecendo o mesmo plano e tempo de execução.
Obs: Estou usando o SQL Server 2012
DECLARE @Person TABLE (PersonId INT, NameFirst VARCHAR(100), NameLast VARCHAR(100))
DECLARE @Order TABLE (OrderId INT, PersonId INT, OrderDateTime DATETIME)
--Query1
SELECT A.PersonID,A.NameFirst,A.NameLast, A.OrderID AS LastOrderID,A.OrderDateTime AS LastOrderDateTime
FROM
(
SELECT P.PersonID,P.NameFirst,P.NameLast,O.OrderID,O.OrderDateTime,
ROW_NUMBER() OVER(PARTITION BY O.PersonID ORDER BY O.PersonID,O.OrderDateTime DESC) AS RowNumber
FROM @Person P
LEFT OUTER JOIN @Order O
ON P.PersonId = O.PersonId
)A
WHERE RowNumber = 1
ORDER BY PersonID
--Query2
;WITH CTE AS
(
SELECT P.PersonID,P.NameFirst,NameLast,O.OrderID AS LastOrderID,O.OrderDateTime AS LastOrderDateTime,
ROW_NUMBER() OVER(PARTITION BY O.PersonID ORDER BY O.OrderDateTime DESC) AS RowNumber
FROM @Person P
LEFT OUTER JOIN @Order O
ON P.PersonId = O.PersonId
)
SELECT A.PersonID,A.NameFirst,A.NameLast, A.LastOrderID, A.LastOrderDateTime
FROM CTE A
WHERE RowNumber = 1
ORDER BY PersonID
A resposta está na sua pergunta:
Quando dois planos são idênticos, nenhuma das consultas que os produziram pode ter qualquer vantagem de desempenho sobre a outra. Os tempos sendo idênticos no seu caso também apenas confirmam isso.
O que foi dito acima deve pelo menos ser verdadeiro para planos reais (em oposição aos estimados ), mas acredito que seja perfeitamente seguro assumir que simplesmente reescrever uma tabela derivada como uma Expressão de Tabela Comum sem incorrer em nenhuma outra alteração não irá acelerar ou reduza um pouco a velocidade de sua consulta no SQL Server.
Isso não quer dizer que um CTE não possa ter vantagens de outra natureza. Uma das vantagens mais comumente (embora, talvez, ainda não universalmente) reconhecidas de um CTE sobre uma tabela derivada é a legibilidade. Não entrarei em muitos detalhes aqui, pois isso está além do escopo da pergunta, mas basicamente, um CTE permite que você divida sua consulta em etapas lógicas de maneira mais clara, além de permitir que você siga a lógica de um script desconhecido com mais naturalidade.