2012-01-30 3 views
5

Я уверен, что если у меня есть хранимые процедуры с использованием tempdb для записи временной таблицы, мне бы лучше переключить их на переменные таблицы, чтобы получить лучшую производительность?Использует переменные таблицы быстрее, чем временные таблицы

+1

Сколько записей будет в временных таблицах, какова конфигурация вашего сервера, например, как табличные переменные могут быть перенесены на tempdb. http://blogs.msdn.com/b/sqlserverstorageengine/archive/2008/03/30/sql-server-table-variable-vs-local-temporary-table.aspx – Kane

+0

Данные различаются, но это хорошая точка , Если переменная таблицы будет более эффективной с небольшим количеством данных, я перейду на нее. –

+0

Возможный дубликат [В чем разница между таблицей temp и табличной переменной в SQL Server?] (Http://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-andtabletable -variable-in-sql-server) или это: http: // stackoverflow.com/questions/6991511/sql-server-temp-table-vs-table-variable и, возможно, больше – gbn

ответ

1

Таблицы темпов лучше работают. Если вы используете переменную таблицы и данные в переменной становятся слишком большими, SQL Server автоматически преобразует переменную в временную таблицу.

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

Так что я отвечу, попробуйте и посмотрите на план выполнения. Используйте самый быстрый способ с минимальными затратами.

+0

Имеет ли смысл мой комментарий наверху, и я должен переключиться? –

+0

Трудно сказать, переключиться или нет. Если вы хотите вернуть переменную таблицы, и ваши действия будут быстрыми в обоих направлениях, да, я бы переключил. Вы действительно должны попробовать. Например, на прошлой неделе я оптимизировал запрос, который становится настолько медленным. 20 часов назад, теперь 2 минуты. Я изменил только переменную таблицы на временную таблицу. Возвращенные данные были не большими, всего 2000 строк, но много операций и фильтров. – dknaack

+3

«Если вы используете переменную таблицы и данные в переменной становятся слишком большими, SQL Server автоматически преобразует переменную в временную таблицу». Это утверждение полностью неверно. –

1

@Table может быть быстрее, так как там меньше «время установки», так как объект находится в памяти только.

@ В таблицах много уловов.

У вас может быть первичный ключ в @Table, но об этом. Другие индексы Clustered NonClustered для комбинаций столбцов невозможны.

Также, если ваша таблица будет содержать любые реальные тома данных (более 200, может быть, 1000 строк), доступ к таблице будет медленнее. Особенно, когда у вас, вероятно, не будет полезного индекса на нем.

# Таблицы - это боль в procs, поскольку их необходимо отбрасывать при отладке, им требуется больше времени для создания. и они занимают больше времени, чтобы настроить, поскольку вам нужно добавить индексы в качестве второго шага. Но если у вас много данных, тогда их #tables каждый раз.

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

Таким образом, я использую @Tables большую часть времени для упрощения при выполнении простой proc и т. Д. Но все, что нужно выполнить, должно быть #Table.

+0

Я тоже верил в эту басню, пока я недавно не застрял в очистке запроса и (одна из последних вещей, которые я сделал), тот же самый запрос (протестированный несколько раз, используя те же параметры), вернувшийся через 5 секунд, используя '# TempTable' против 16 секунд с использованием '@ TableVar' – Jason

0

@ Таблицы не имеют статистики, поэтому план выполнения влечет за собой дополнительные догадки. Следовательно, рекомендуется верхний предел 1000-ичных строк. # Таблицы имеют статистику, но эти can be cached между вызовами. Если ваши мощности существенно различаются каждый раз, когда SP запускается, вы каждый раз должны получать REBUILD и RECOMPILE. Разумеется, это накладные расходы, но они должны быть сбалансированы с расходами на мусорный план.

Оба типа будут делать IO to TempDB.

Таким образом, нет, @ Таблицы не являются панацеей.

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