Преимущества использования WITH TABLOCK на INSERT

15

При некоторых обстоятельствах выполнение INSERT INTO <tablename> (WITH TABLOCK)будет быстрее из-за минимальной регистрации. К таким обстоятельствам относится наличие базы данных в BULK_LOGGEDмодели восстановления.

Есть ли другие потенциальные выгоды производительности для использования WITH TABLOCKна условиях INSERTна пустом столе , когда база данных ( Tempdb ) использует SIMPLEмодель восстановления?

Я работаю с SQL Server 2012 Standard Edition.

Мой вариант использования для создания и последующего немедленного заполнения временной таблицы в хранимой процедуре с использованием переменной INSERT...SELECT, которая может содержать до нескольких миллионов строк. Я стараюсь избегать такого рода злоупотреблений tempdb , но иногда это необходимо.

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

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

Марк Фриман
источник

Ответы:

17

Я знаю несколько преимуществ, но они в основном ситуативные.

  1. Использование TABLOCKуменьшит параллелизм, но немедленно приведет к блокировке таблицы на целевой таблице. Пока вы можете гарантировать, что в таблицу будет вставлен только один сеанс, это предотвратит ненужные блокировки строк или страниц и предотвратит эскалацию блокировки . В конце концов, если вы вставляете так много данных, что все равно получите повышение блокировки, почему бы не сделать это заранее?
  2. Если вы вставляете в пустую кучу со сжатием страницы без TABLOCKвсех страниц будет сжатие строк вместо сжатия страниц :

Вновь вставленная строка сжата страницей:

  • если новая строка переходит на существующую страницу со сжатием страницы

  • если новая строка вставляется через BULK INSERT с помощью TABLOCK

  • если новая строка вставляется через INSERT INTO ... (TABLOCK) SELECT FROM

В противном случае строка является сжатой строкой.

  1. В SQL Server 2016 TABLOCKподсказка требуется для параллельной вставки в кучи , CCI (индексы кластерного хранилища столбцов) и локальные временные таблицы . Есть много ограничений, некоторые из которых не задокументированы. Не может быть IDENTITYстолбца, вставка не может быть выполнена через и OUTPUTт. Д.

Смотрите также Руководство по производительности загрузки данных.

Джо Оббиш
источник