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.