sql >> Database >  >> RDS >> Sqlserver

Wordt de instructie WITH één keer per query of één keer per rij uitgevoerd?

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.




  1. Pl/SQL- Krijg kolomnamen uit een query

  2. join op de kolom van twee verschillende tabellen sqlite3

  3. varchar(max) overal?

  4. PostgreSQL-protocolfout. Sessie-instelling mislukt.. fout