Мы использовали Пользовательские типы таблиц, чтобы передать список целых чисел в наши хранимые процедуры.
Затем мы используем их для присоединения к другим таблицам в наших хранимых запросах proc.
Например:
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
Мы видели очень низкую производительность при использовании больших наборов данных.
Один из подходов, который мы использовали для ускорения работы, - это сброс содержимого в временную таблицу и вместо этого слияние.
Например:
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
Это значительно улучшает производительность, но я хотел получить некоторые мнения по этому подходу и любые другие последствия, которые мы не рассмотрели. Также может быть полезно пояснить, почему это повышает производительность.
N.B. иногда нам может потребоваться передать больше, чем просто целое число, поэтому мы не используем список, разделенный запятыми, или что-то в этом роде.