Leistung benutzerdefinierter Tabellentypen in SQL Server

Wir haben @ verwend Benutzerdefinierte Tabellentypen, um eine Liste von Ganzzahlen an unsere gespeicherten Prozeduren zu übergeben.

Wir verwenden diese dann, um andere Tabellen in unseren gespeicherten Prozessabfragen zu verknüpfen.

Beispielsweise

CREATE PROCEDURE [dbo].[sp_Name]
(
    @Ids [dbo].[OurTableType] READONLY  
)
AS
    SET Nocount ON

    SELECT
        *
    FROM
        SOMETABLE
        INNER JOIN @Ids [OurTableType] ON [OurTableType].Id = SOMETABLE.Id

Wir haben bei Verwendung größerer Datensätze eine sehr schlechte Leistung festgestellt.

Ein Ansatz, mit dem wir die Dinge beschleunigt haben, ist, den Inhalt in eine temporäre Tabelle zu kopieren und stattdessen abzuspielen.

Beispielsweise

CREATE PROCEDURE [dbo].[sp_Name]
(
    @Ids [dbo].[OurTableType] READONLY  
)
AS
    SET Nocount ON
    CREATE TABLE #TempTable(Id INT)
    INSERT INTO #TempTable
    SELECT Id from @Ids

    SELECT
        *
    FROM
        SOMETABLE
        INNER JOIN #TempTable ON #TempTable.Id = SOMETABLE.Id

    DROP TABLE #TempTable

Dies verbessert die Leistung erheblich, aber ich wollte einige Meinungen zu diesem Ansatz und anderen Konsequenzen einholen, die wir nicht berücksichtigt haben. Auch eine Erklärung, warum dies die Leistung verbessert, kann hilfreich sein.

N.B. Manchmal müssen wir möglicherweise mehr als nur eine Ganzzahl übergeben, weshalb wir keine durch Kommas getrennte Liste oder ähnliches verwenden.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage