У меня есть большая пользовательская переменная типа таблицы, которая имеет 129 столбцов. Я буду хранить около 2000-3000 записей в этой табличной переменной за раз и передавать ее различным хранимым процедурам и функциям для получения дополнительных данных и внесения изменений. Эти дополнительные данные и новые модификации будут затем сохранены в новой табличной переменной того же типа и возвращены в исходную хранимую процедуру через OUTPUT
параметр. (Это потому, что параметр типа таблицы может быть передан только как READONLY
.)
Это мой псевдокод:
SP1
@tmp tableType
{
INSERT @tmp EXEC
SP2 (@tmp)
INSERT @tmp EXEC
SP3 (@tmp)
}
Должен ли я использовать @table_variable
или #temp_table
?
sql-server
sql-server-2008
performance
Срикумар П
источник
источник
Ответы:
Есть два блога, которые вы должны посмотреть. Первый ( здесь ) - это сравнение переменных таблицы и временных таблиц. Это с 2008 года и остается актуальным для SQL Server 2008 R2.
Вторая запись в блоге ( здесь ) имеет дело с некоторыми заблуждениями (пропущенными понятиями) относительно переменных таблицы; включая индексацию табличной переменной.
Обе эти записи в блоге, статьи, написаны Гейл Шоу.
Я полагаю, что один интересный элемент, который вы ищете, - это переменная таблицы, которую нельзя передавать между хранимыми процедурами, в то время как временную таблицу можно передавать между хранимыми процедурами. Самая близкая переменная таблицы к переходу между хранимыми процедурами - это пользовательский тип таблицы.
Передача табличной переменной в виде TVP в хранимую процедуру требует, чтобы ее определяли как параметр READ-ONLY. Это означает, что будет несколько копий табличной переменной, если вы хотите вернуть ее измененную копию.
В общем, передача между хранимыми процедурами может лучше обслуживаться таблицей Temp, когда вы хотите вернуть переданную структуру с обновленными значениями.
источник
Нет ничего лучше, чем попробовать оба, но я считаю, что #tempTables работает лучше, когда вы попадаете в сотни записей.
источник