Voorbeeld:
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;
Als u het vorige script in SSMS uitvoert (druk op Ctrl+M
-> Werkelijk uitvoeringsplan) dan krijgt u dit uitvoeringsplan voor de laatste vraag:
In dit geval wordt de CTE één keer uitgevoerd voor crt
alias en vijf (!) keer voor prev
alias, één keer voor elke rij van crt
.
Dus het antwoord op deze vraag
is both
:eenmaal per zoekopdracht (crt
) en eenmaal per rij (prev
:eens voor elke voor van crt
).
Om deze zoekopdracht te optimaliseren, om te beginnen, 1) U kunt proberen de resultaten van CTE op te slaan (MyCTE
of Query
) in een tabelvariabele of een tijdelijke tabel
2) Definieer de primaire sleutel van deze tabel als de join-kolom(men),
3) Herschrijf de laatste query om deze tabelvariabele of tijdelijke tabel te gebruiken.
Natuurlijk kunt u proberen de laatste query te herschrijven zonder deze self-join tussen CTE.