sql >> Database >  >> RDS >> Sqlserver

T-SQL CTE materialiserende technieken werken niet op SQL Server 2012

Je zou kunnen proberen met behulp van een tabelwaardefunctie met meerdere stappen. Op deze manier wordt de server gedwongen om de resultaten van de TVF om te zetten in een tabelvariabele. Je kunt ook het proberen declaratieve beperkingen gebruiken bij het declareren van dit tabeltype (PRIMARY KEY, UNIQUE, CHECK) om de prestaties van de laatste query te verbeteren:

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;

Vergeet niet de ORDER BY . toe te voegen clausule toe aan uw laatste vraag.

Onlangs heb ik deze oplossing gebruikt om een ​​weergave te optimaliseren (ViewA, DISTINCT + LEFT JOIN + GETDATE()) die wordt gebruikt door een andere weergave (ViewB). In dit geval (ViewA) was het onmogelijk om een ​​geïndexeerde weergave te maken (vanwege DISTINCT + LEFT JOIN + GETDATE()). In plaats daarvan heb ik een TVF met meerdere instructies gemaakt die de prestaties verbeterde door de logische leesbewerkingen (in sommige gevallen drastisch) van de uiteindelijke query te verminderen.

Opmerking:je kunt het natuurlijk proberen met behulp van een indexweergave .




  1. Praag PostgreSQL Developer Day 2016

  2. Hoe mysql verbinden met swift?

  3. Hoe performant is uw ProxySQL-knooppunt?

  4. Mysql resulteert in PHP - arrays of objecten?