@table_variable или #temp_table

11

У меня есть большая пользовательская переменная типа таблицы, которая имеет 129 столбцов. Я буду хранить около 2000-3000 записей в этой табличной переменной за раз и передавать ее различным хранимым процедурам и функциям для получения дополнительных данных и внесения изменений. Эти дополнительные данные и новые модификации будут затем сохранены в новой табличной переменной того же типа и возвращены в исходную хранимую процедуру через OUTPUTпараметр. (Это потому, что параметр типа таблицы может быть передан только как READONLY.)

Это мой псевдокод:

  SP1
  @tmp tableType
  {
        INSERT @tmp EXEC
        SP2 (@tmp)

        INSERT @tmp EXEC
        SP3 (@tmp)
  }

Должен ли я использовать @table_variableили #temp_table?

Срикумар П
источник

Ответы:

12

Есть два блога, которые вы должны посмотреть. Первый ( здесь ) - это сравнение переменных таблицы и временных таблиц. Это с 2008 года и остается актуальным для SQL Server 2008 R2.

Вторая запись в блоге ( здесь ) имеет дело с некоторыми заблуждениями (пропущенными понятиями) относительно переменных таблицы; включая индексацию табличной переменной.

Обе эти записи в блоге, статьи, написаны Гейл Шоу.

Я полагаю, что один интересный элемент, который вы ищете, - это переменная таблицы, которую нельзя передавать между хранимыми процедурами, в то время как временную таблицу можно передавать между хранимыми процедурами. Самая близкая переменная таблицы к переходу между хранимыми процедурами - это пользовательский тип таблицы.

Передача табличной переменной в виде TVP в хранимую процедуру требует, чтобы ее определяли как параметр READ-ONLY. Это означает, что будет несколько копий табличной переменной, если вы хотите вернуть ее измененную копию.

В общем, передача между хранимыми процедурами может лучше обслуживаться таблицей Temp, когда вы хотите вернуть переданную структуру с обновленными значениями.

Роберт Миллер
источник
5

Нет ничего лучше, чем попробовать оба, но я считаю, что #tempTables работает лучше, когда вы попадаете в сотни записей.

SqlACID
источник
3
Добавьте к этому тот факт, что временные таблицы могут иметь индексы, иметь статистику, в то время как переменные таблицы могут иметь только PK. У вас есть некоторые детали здесь .
Мариан