переменная @table или таблица #temp: производительность - PullRequest
5 голосов
/ 25 июля 2011

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

Это мой алгоритм.

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

        INSERT @tmp EXEC
        SP3 (@tmp)

  }

Какой я должен использовать @table varible или #temp table

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

Здесь есть полезная статья , в которой говорится:

Как и во многих других областях техники, здесь нет «правильного» ответа. Для данных, которые не предназначены для сохранения за рамками процедуры, вы обычно выбираете между таблицами #temp и переменными таблиц. Ваше окончательное решение должно зависеть от производительности и разумного нагрузочного тестирования. По мере увеличения размера данных и / или увеличения повторного использования временных данных вы обнаружите, что использование таблиц #temp имеет больше смысла. В зависимости от вашей среды этот порог может быть где угодно - однако вам, очевидно, потребуется использовать таблицы #temp, если какое-либо из вышеуказанных ограничений представляет собой существенное препятствие.

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

Полагаю, вы просто опробуете оба варианта и посмотрите на SQL Profiler, чтобы увидеть, какие из вариантов обеспечивают наилучшую производительность.

2 голосов
/ 25 июля 2011

Если #tmp будет использоваться просто как куча для временного хранения данных, тогда я не думаю, что @ vs # будет иметь значение, особенно для таблицы, содержащей только несколько тысяч строк.

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

Кроме того, как ни странно, я никогда не находил временную таблицу, превосходящую переменную таблицы, или наоборот.

...