Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy instrukcja WITH jest wykonywana raz na zapytanie, czy raz na wiersz?

Przykład:

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;

Jeśli uruchamiasz poprzedni skrypt w SSMS (naciśnij Ctrl+M -> Actual Execution Plan) to otrzymasz ten plan wykonania dla ostatniego zapytania:

W tym przypadku CTE jest wykonywane jeden raz dla crt alias i pięć (!) razy dla prev alias, raz na każdy wiersz z crt .

Tak więc odpowiedź na to pytanie

to both :raz na zapytanie (crt ) i raz na wiersz (prev :raz na każdy dla od crt ).

Aby zoptymalizować to zapytanie, na początek1) Możesz spróbować zapisać wyniki z CTE (MyCTE lub Query ) do zmiennej tabeli lub tabeli tymczasowej

2) Zdefiniuj klucz podstawowy tej tabeli jako kolumny łączenia,

3) Przepisz ostatnie zapytanie, aby użyć tej zmiennej tabeli lub tabeli tymczasowej.

Oczywiście możesz spróbować przepisać ostatnie zapytanie bez tego samodzielnego łączenia między CTE.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tabela transpozycji

  2. Co mogę zrobić, aby poprawić wydajność mojej czystej funkcji zdefiniowanej przez użytkownika w programie SQL Server?

  3. Jak podzielić wartość oddzieloną przecinkami na kolumny?

  4. .NET Core nie może połączyć się ze zdalną bazą danych SQL Server

  5. SQL Server 2016:Importuj dane