Eksempel:
SET NOCOUNT ON;
SET IMPLICIT_TRANSACTIONS ON;
CREATE TABLE MyTable (MyID INT PRIMARY KEY);
GO
INSERT MyTable (MyID)
VALUES (11), (22), (33), (44), (55);
PRINT 'Test MyCTE:';
WITH MyCTE
AS (
SELECT *, ROW_NUMBER()OVER(ORDER BY MyID) AS RowNum
FROM MyTable
)
SELECT *
FROM MyCTE crt
LEFT JOIN MyCTE prev ON crt.RowNum=prev.RowNum+1;
ROLLBACK;
Hvis du kører tidligere script i SSMS (tryk på Ctrl+M
-> Faktisk udførelsesplan), så får du denne udførelsesplan for den sidste forespørgsel:
I dette tilfælde udføres CTE én gang for crt
alias og fem (!) gange for prev
alias, én gang for hver række fra crt
.
Så svaret på dette spørgsmål
er both
:én gang pr. forespørgsel (crt
) og én gang pr. række (prev
:én gang for hver for fra crt
).
For at optimere denne forespørgsel, til at begynde med,1) Du kan prøve at gemme resultaterne fra CTE (MyCTE
eller Query
) ind i en tabelvariabel eller en midlertidig tabel
2) Definer den primære nøgle i denne tabel som sammenføjningskolonnen(e),
3) Omskriv den sidste forespørgsel for at bruge denne tabelvariabel eller midlertidige tabel.
Selvfølgelig kan du prøve at omskrive den endelige forespørgsel uden denne selvforbindelse mellem CTE.