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

Techniki materializacji T-SQL CTE nie działają na SQL Server 2012

Możesz spróbować za pomocą wieloetapowej funkcji wartości tabeli. W ten sposób serwer jest zmuszony do zmaterializowania wyników TVF w zmiennej tabeli. Możesz też spróbować używanie ograniczeń deklaratywnych podczas deklarowania tego typu tabeli (PRIMARY KEY, UNIQUE, CHECK) w celu poprawy wydajności końcowego zapytania:

CREATE FUNCTION CocoJamboSchema.CocoJamboFunction(@parameters ...)
RETURNS @Results TABLE (
    Col1 INT NOT NULL,
    Col2 VARCHAR(10) NULL,
    ...
    PRIMARY KEY(Col1)
)
AS
BEGIN
    WITH MyCTE (...)
    AS
    (
        ...
    )
    INSERT @Results (...)
        FROM MyCTE;

    RETURN;
END;

SELECT ...
FROM CocoJamboSchema.CocoJamboFunction(param values) f
INNER JOIN MySchema.MyTable t ON f.Col1=t.Col1
ORDER BY t.Col1;

Nie zapomnij dodać ORDER BY klauzula do końcowego zapytania.

Ostatnio wykorzystałem to rozwiązanie do optymalizacji widoku (ViewA, DISTINCT + LEFT JOIN + GETDATE()) używanego przez inne widoki (ViewB). W tym przypadku (ViewA) nie można było utworzyć widoku indeksowanego (z powodu DISTINCT + LEFT JOIN + GETDATE()). Zamiast tego stworzyłem wieloinstancyjny TVF, który poprawił wydajność poprzez zmniejszenie odczytów logicznych (w niektórych przypadkach drastycznie) końcowego zapytania.

Uwaga:oczywiście, możesz spróbować przy użyciu widoku indeksu .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj COLUMNPROPERTY(), aby zwrócić informacje o kolumnie lub parametrze w SQL Server

  2. Jak zwrócić zduplikowane klucze z dokumentu JSON w SQL Server

  3. Grupa użytkowników Charlotte SQL Server:Napraw wolne zapytania. Szybko.

  4. Wyniki dynamicznego SQL w tabeli tymczasowej w procedurze SQL Stored

  5. Jak wykorzystać zmienną do nazwy bazy danych w T-SQL?