sql >> Database teknologi >  >> RDS >> Sqlserver

Udføres WITH-sætning én gang pr. forespørgsel eller én gang pr. række?

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.




  1. Hvorfor den følgende SQL Server-forespørgsel returnerer 12 måneders data og ikke 14 måneders data

  2. Sådan listes alle lagrede procedurer i MariaDB

  3. sekvensen eksisterer ikke ORA-02289

  4. Adgang nægtet oprettelse af den første database – hvordan giver jeg den rigtige adgang?