Получите минимальное ведение журнала при загрузке данных во временные таблицы

10

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

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

Является ли временная таблица кандидатом на минимальное ведение журнала, и если да, то стоит ли добавлять подсказку TABLOCK, как рекомендуется для постоянных таблиц?

Pixelated
источник

Ответы:

18

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

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

Обратите внимание, что даже там, где полная минимальная оптимизация журналирования не применяется, таблицы, созданные в tempdbрезультате других оптимизаций, например, не нуждаются в регистрации REDOинформации. Вы можете проверить, регистрируются ли строки или страницы, используя недокументированные документы sys.fn_dblog. Регулярное ведение журнала будет включать записи в журнале строк, как LOP_INSERT_ROWS.


Обратите внимание, что добавление TABLOCKв локальную временную таблицу требуется для параллельного выполнения INSERT...SELECTзапросов в SQL Server 2016, см. Статью базы знаний Майкрософт:

Низкая производительность при выполнении операций INSERT .. SELECT в SQL Server 2016

Пол Уайт 9
источник