Переваги використання З ТАБЛОК на ВСТУП


15

За певних обставин виконання INSERT INTO <tablename> (WITH TABLOCK)заповіту буде швидше за рахунок мінімального ведення журналу. Ці обставини включають наявність бази даних у BULK_LOGGEDмоделі відновлення.

Чи є якась інша корисна ефективність для використання WITH TABLOCKна INSERTпорожній таблиці, коли база даних ( tempdb ) використовує SIMPLEмодель відновлення?

Я працюю з SQL Server 2012 Standard Edition.

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

Я намагаюся побудувати випадок, щоб вимагати TABLOCK. Не здається, що це щось зашкодить, і може мати користь. Я намагаюся з’ясувати, чи є достатня потенційна користь, щоб додати її скрізь у всій нашій кодовій базі, де я впевнений, що немає іншого процесу, який хоче записати в таблицю.

Зазвичай я вставляю в щойно створену локальну таблицю темп з кластеризованою ПК, але іноді використовую купу.

Відповіді:


17

Я знаю кілька переваг, але вони переважно ситуативні.

  1. Використання TABLOCKзменшить паралельність, але негайно візьме блокування таблиці на цільовій таблиці. Поки ви можете гарантувати, що лише один сеанс буде вставлено в таблицю, це дозволить уникнути непотрібних блокувань рядків або сторінок і запобіжить ескалації блокування . Зрештою, якщо ви вставляєте стільки даних, що все одно ви отримаєте ескалацію блокування, чому б не зробити це наперед?
  2. Якщо ви вставляєте в порожню купу, стиснуту для сторінки, без TABLOCKусіх сторінок замість стиснення сторінки буде стиснення рядків :

Щойно вставлений рядок стискається на сторінці:

  • якщо новий рядок переходить на існуючу сторінку зі стисненням сторінки

  • якщо новий рядок буде вставлено через BULK INSERT з TABLOCK

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

В іншому випадку рядок стискається рядом.

  1. У SQL Server 2016 TABLOCKпідказка потрібна для отримання паралельних вставок у купи , ІСЦ (індекси кластерних стовпців стовпців) та локальні таблиці темпів . Існує маса обмежень, деякі з яких не документально підтверджені. Не може бути IDENTITYстовпця, вставка не може бути виконана через і OUTPUTт.д.

Дивіться також Посібник з продуктивності завантаження даних

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.