Управление операциями блокировки при массовом импорте

Команды bcp и инструкции BULK INSERT и INSERT ... SELECT * FROM OPENROWSET(BULK...) позволяют указать, что на время выполнения операции массового импорта таблица будет блокирована. Блокировка используется в компоненте SQL Server Database Engine для синхронизации одновременного доступа нескольких пользователей к одному и тому же фрагменту данных. При изменении фрагмента данных транзакция удерживает блокировку, защищая изменения до конца транзакции. Если указана блокировка таблицы для операции массового импорта, то к таблице применяется блокировка массового обновления (BU) на время выполнения операции массового импорта. Блокировка BU позволяет одновременно выполнять массовый импорт данных в одну и ту же таблицу нескольким потокам и вместе с тем предотвращает доступ к таблице других процессов, не осуществляющих массовый импорт данных. Блокировка таблицы может повысить производительность массового импорта, снизив конкуренцию за эту таблицу.

Если не указана блокировка таблицы, по умолчанию используются блокировки на уровне строк, если параметр table lock on bulk load не установлен в значение on. Установка параметра table lock on bulk load хранимой процедурой sp_tableoption включает режим табличной блокировки при выполнении массового импорта.

Блокировка таблицы при массовом импорте

Режим блокировки таблицы

OFF

Используется блокировка на уровне строк

ON

Используется блокировка таблицы

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

ПримечаниеПримечание

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

Квалификаторы команд

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

Команда

Квалификатор

Тип квалификатора

bcp

-h"TABLOCK"

Подсказка

BULK INSERT

TABLOCK

Аргумент

INSERT ... SELECT * FROM OPENROWSET(BULK...)

WITH(TABLOCK)

Табличная подсказка

ПримечаниеПримечание

В SQL Server 2005 и более поздних версиях, если для таблицы с кластеризованным индексом указана подсказка TABLOCK, параллельное выполнение массового импорта данных будет запрещено. Если в этом случае необходимо параллельное выполнение массового импорта, не указывайте подсказку TABLOCK. Дополнительные сведения о параллельном выполнении массовой загрузки см. в разделе Рекомендации по оптимизации массового импорта данных.