2009-10-15 4 views

ответ

3

В хранимой процедуре, вы часто необходимость хранения набора данных в процедура, без , обязательно требует, чтобы данные до сохранялись за пределами процедуры . Если вам действительно нужна структура таблицы, есть в основном четыре способа вы можете «магазин» этот данные: локальных временных таблиц (#table_name), глобальных временные таблицы (## table_name), постоянные таблицы (table_name), и переменные таблицы (@table_name).

Should I use a #temp table or a @table variable?

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

В отличие от локальных и глобальных временных таблиц , переменные таблицы не могут иметь Созданные на них индексы. Исключением является то, что переменные таблицы могут иметь первичный ключ , определенный при создании , используя команду DECLARE @Variable TABLE . Затем будет создан кластерный или некластеризованный индекс на переменной таблицы. Команда CREATE INDEX не распознает переменные таблицы . Поэтому единственным доступным вам индексом является индекс, который сопровождает первичный ключ и составляет , созданный по переменной таблицы . Журналы транзакций также не записываются для переменных таблицы. Следовательно, они не входят в сферу действия механизма транзакции.

0

«#myTable - временная таблица и может быть полезной при наличии ограничений и индексов и т. Д. И использует больше ресурсов.

@myTable - это переменная таблицы, которую вы определяете как имеющую один или несколько столбцов. Они используют меньше ресурсов и привязаны к процедуре, в которой вы их используете.

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

1

Пожалуйста, см:

Часто говорят, что @Table переменные сохраняются в памяти, в отличие от TempDb; это не обязательно правильно.

Переменные таблицы не имеют статистики, и это может повлиять на производительность в определенных ситуациях.

+0

Таблицы Temp ведут себя так же, как и w.r.t. память/диск. В памяти, где это возможно, сохраняется на диске, если он слишком большой, DDL, созданный в базе данных TempDB. – GilaMonster

0

Таблица #tabel1 является локальной временной таблицей, хранящейся в tempdb. ##table1 - глобальная временная таблица, хранящаяся в tempdb.

и @table - переменная таблицы.

Регулярно проверяйте link для их различий

1

Табличных переменных являются все хорошо, когда речь идет о сравнительно небольших наборах данных, но следует помнить, что они не очень хорошо масштабируются. В частности, изменение поведения SQL Server 2000 и SQL Server 2005 привело к снижению производительности через пол с большими наборами данных.

Это было особенно неприятно для меня в один конкретный случай с очень сложной хранимой процедурой на SQL Server 2000. Исследования и тестирование показали, что использование табличных переменных было более эффективным. Однако после обновления до SQL Server 2008 производительность ухудшилась значительно. Потребовалось некоторое время для хлопка, чтобы использовать переменные таблицы в качестве виновника, потому что все предыдущие тесты и т. Д. Исключали временные таблицы как бы более быстрые. Однако из-за этого изменения между версиями SQL Server обратное было правдивым и после значительного рефакторинга, то, что прошло хорошо, в двухзначные часы, чтобы завершить начатое завершение через пару минут!

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

Прочитайте эту статью для получения более подробной информации и образцов тайминги - http://www.sql-server-performance.com/articles/per/temp_tables_vs_variables_p1.aspx

Update: На отдельной ноте, следует помнить, что есть и третий тип временной таблицы - ## хуг. Они являются глобальными и видимыми для всех подключений SQL Server и не привязаны к текущему соединению, как обычные временные таблицы. Они удаляются только тогда, когда окончательное соединение, доступное к нему, закрывается.

Смежные вопросы