Eu tenho uma consulta que calcula row_Number()
. A tabela tem um índice clusterizado nas mesmas colunas (e ordem) que o particionamento e a ordenação do número da linha.
Ao usar uma junção de mesclagem (muitos para um), uma classificação é necessária, mesmo que o índice clusterizado esteja na ordem correta. A remoção da junção também remove a operação de classificação.
O índice clusterizado que deve alimentar o cálculo row_number:
create clustered index [ClusteredIndex_e060df3fbf464a8eb9b6ea5d46a9a5f5] on [dbo].[log1]
(
[client] asc,
[orderId] asc,
[campaign] asc,
[id] asc,
[DateStamp] asc
)
create clustered index [ClusteredIndex_dd0ee53e050d436cba2cab7c678a39e5] on [dbo].[LiveReference]
(
[client] asc,
[orderId] asc,
[campaign] asc
)
A pergunta:
with cr as
(
select distinct client, orderId,campaign
from LiveReference
)
select e.[DateStamp]
,e.[campaign]
,e.[client]
,e.[orderId]
,e.[ad]
,e.[id]
,e.[source]
,row_number() over (partition by e.[client] ,
e.[orderId] ,
e.[campaign] ,
e.[id]
order by e.[DateStamp]) as num
from [dbo].[log1] e
inner join cr on
e.client = cr.client
and e.campaign = cr.campaign
and e.orderId = cr.orderId
A remoção da junção também remove a classificação:
select e.[DateStamp]
,e.[campaign]
,e.[client]
,e.[orderId]
,e.[ad]
,e.[id]
,e.[source]
,row_number() over (partition by e.[client] ,
e.[orderId] ,
e.[campaign] ,
e.[id]
order by e.[DateStamp]) as num
from [dbo].[log1] e
(Eu sei que isso também remove a filtragem realizada pela junção, mas isso não explica por que a exclusão dessas linhas altera a ordem)
Por que os resultados de uma junção ordenada não estariam na ordem correta?
De um modo geral, a junção de mesclagem (incluindo a concatenação de junção de mesclagem) preserva apenas a ordem de classificação das chaves de junção.
As chaves de junção de mesclagem são
client, campaign, orderId
. A ordem de classificação de entrada necessária para a função de janela éclient, orderId, campaign, id , datestamp
.A junção de mesclagem não pode, portanto, fornecer a ordem de classificação exigida pela sua função de janela. Você pode evitar a classificação com uma junção de loops aninhados (por exemplo, usando uma dica).
Escrevi sobre os detalhes em Evitar classificações com a concatenação de junção de mesclagem .
A consulta pode ser reescrita como,
Então não precisa
CTE
edistinct