Явно удалить временную таблицу или позволить SQL Server обрабатывать ее - PullRequest
41 голосов
/ 08 сентября 2011

Что является лучшей практикой для обработки сброса временной таблицы.Я прочитал, что вы должны явно обрабатывать отбрасывание, а также что SQL-сервер должен обрабатывать отбрасывание .... Каков правильный метод?У меня всегда было впечатление, что вы должны самостоятельно очистить временные таблицы, которые вы создаете в sproc, и т. Д. Но потом я обнаружил другие моменты, которые указывают на обратное.Я просто обеспокоен тем, что не следую рекомендациям по созданию временных таблиц, которые я создаю.

Спасибо,

S

Ответы [ 5 ]

26 голосов
/ 08 сентября 2011

На мой взгляд, сначала посмотрите, действительно ли вам нужна временная таблица или вы можете обойтись CTE.Во-вторых, я бы всегда бросал свои временные таблицы.Иногда вам нужно иметь временную таблицу, привязанную к соединению (например, ## temp), поэтому, если вы выполните запрос второй раз, и у вас есть явный код для создания временной таблицы, вы получите ошибку, которая говорит о том, что таблицауже существует.Очистка после себя ВСЕГДА хорошая практика программного обеспечения.

8 голосов
/ 29 октября 2013

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

2 голосов
/ 07 сентября 2018

Раньше я попал в толпу очистки объектов с помощью фоновых серверных процессов, однако недавние проблемы с чрезмерным ростом файла журнала TempDB изменили мое мнение.Я не уверен, что так было всегда с каждой версией SQL Server, но после перехода на SQL 2016 и размещения дисков в массиве PureStorage SSD дела идут немного по-другому.Процессы обычно связаны с процессором, а не с вводом / выводом, и явное удаление временных объектов не приводит к проблемам с ростом журнала.Несмотря на то, что я не слишком углубился в вопрос о том, почему, я подозреваю, что это не похоже на сборку мусора в мире .NET, где он синхронен при явном вызове и асинхронен при передаче в систему.Это будет иметь значение, потому что явное удаление освободит хранилище в файле журнала и сделает его доступным при следующем резервном копировании журнала, тогда как, по-видимому, это не тот случай, когда объект явно не отбрасывается.В большинстве систем это, вероятно, не является большой проблемой, но в системе, поддерживающей большое количество ERP и витрины с большим количеством одновременных транзакций и интенсивным использованием TempDB, это оказало большое влияние.Что касается того, почему в первую очередь создавать объекты TempDB с объемом данных в большинстве запросов, это все равно будет перетекать в хранилище TempDB, поэтому обычно более эффективно создать объект с необходимыми индексами, а не позволитьСистема обрабатывает это автоматически.

2 голосов
/ 26 июля 2012

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

0 голосов
/ 08 сентября 2011

На мой взгляд. Нет необходимости явно удалять временные таблицы. SQL-сервер будет обрабатывать удаление временных таблиц, хранящихся в temp db, в случае нехватки места для обработки запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...