Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Техниките за материализиране на T-SQL CTE не работят на SQL Server 2012

Вие можете да опитате с помощта на многоетапна функция с таблица. По този начин сървърът е принуден да материализира резултатите от TVF в таблична променлива. Също така, можете да опитате използване на декларативни ограничения при деклариране на този тип таблица (PRIMARY KEY, UNIQUE, CHECK) за подобряване на производителността на крайната заявка:

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;

Не забравяйте да добавите ORDER BY клауза към окончателната ви заявка.

Наскоро използвах това решение за оптимизиране на изглед (ViewA, DISTINCT + LEFT JOIN + GETDATE()), използван от други изгледи (ViewB). В този случай (ViewA) беше невъзможно да се създаде индексиран изглед (поради DISTINCT + LEFT JOIN + GETDATE()). Вместо това създадох TVF с множество изрази, който подобри производителността, като намали логическите четения (в някои случаи драстично) на крайната заявка.

Забележка:Разбира се, можете да опитате използване на индексен изглед .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на планове за поддръжка в SQL Server

  2. Не може да се премахне схемата, защото тя не съществува или нямате разрешение. - SQL Server / TSQL урок, част 29

  3. Как OBJECTPROPERTY() работи в SQL Server

  4. Как да предотвратите атаки с инжектиране на SQL чрез Secure

  5. Как мога да избера първия ден от месеца в SQL?