2013-09-13 3 views
3

Ниже приведен пример запроса, рассмотримБлокировка SQL Server Таблица во время массовой вставки

INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1 
Select A.Col1,B.Col2,A.Col3,C.Col4  ----------------Statement#2 
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK) 
    ON A.Id = B.ID 
    LEFT JOIN C WITH NOLOCK 
    ON C.Id = B.ID 
Where A.Id = 11 

На каком этапе блокировка будет применяться на столе [монопольная блокировка?], Как SQL собирается выполнить запрос?

  1. Результат будет получен из таблиц A, B и C на основе ссылки join и where.
  2. При получении результата вставьте данные в таблицу и одновременно примените блокировку на таблице.

Так что, когда фактические данные записываются на странице таблицы, они заблокированы, но не во время выбора, даже если это INSERT INTO с SELECT?

ответ

2

Тех два этапа являются логическими шагами для выполнения запроса. То, что SQL Server может делать/делать на физическом уровне, - это еще одна история. На данный момент:

INSERT INTO Target (Col1,Col2,Col3,Col4) ----------------Statement#1 
Select A.Col1,B.Col2,A.Col3,C.Col4  ----------------Statement#2 
FROM A WITH(NOLOCK) INNER JOIN B WITH(NOLOCK) 
    ON A.Id = B.ID 
    LEFT JOIN C WITH NOLOCK 
    ON C.Id = B.ID 
Where A.Id = 11 

для каждой выходной записи (см SELECT положения) он принимает X lock на RID или KEY в пределах целевой таблицы (RID для кучи/KEY для кластерного индекса), и он вставляет, что запись. Эти шаги повторяются для каждой выходной записи. Таким образом, он не считывает все записи из исходных таблиц и только после этого шага начинает вставлять записи в целевую таблицу. Из-за NOLOCK таблицы подсказки на исходной таблице потребуются только блокировки Sch-S (стабильность схемы) в этих таблицах.

Если вы хотите взять блокировку X на целевой таблице, то вы можете использовать

INSERT INTO Target WITH(TABLOCKX) (Col1,Col2,Col3,Col4) 
SELECT ... 

Если вы хотите минимально регистрируемые вставки, пожалуйста, прочитайте эту article.

+0

Хорошо, его строка за строкой выборки и вставка? Это то, что вы хотите сказать? И какова будет продолжительность блокировки на целевой таблице, если запрос Select займет 500 мс, чтобы получить результат? – Hi10

+0

1 & 2) В принципе, да. 3) С момента, когда X-блокировка будет получена до конца транзакции (если у вас есть [явная транзакция] (http://technet.microsoft.com/en-us/library/ms175127 (v = sql.105). aspx): COMMIT/ROLLBACK) или до конца выполнения оператора ([автоматическая фиксация транзакции] (http://technet.microsoft.com/en-us/library/ms187878 (v = sql.105) .aspx)) , Без 'TABLOCKX' блокировка X (на уровне записи: RID/KEY) приобретается непосредственно перед вставкой каждой записи в целевую таблицу. С подсказкой 'TABLOCKX' X-блокировка приобретается (на уровне таблицы) один раз в начале выполнения инструкции. –

+1

Оцените свой ответ. – Hi10

0

Вы указали какой-либо подсказку «Столовый замок». Если вы хотите блокировать уровень строки, установите «Столблок» в положение «выключено».

или проверить это, это поможет вам ...

http://technet.microsoft.com/en-us/library/ms180876(v=sql.105).aspx

+0

Нет, я не указал, что мой вопрос заключается в том, как будет блокироваться блокировка времени, как только будет обнаружен оператор вставки или после выбора, когда происходит фактическая вставка? – Hi10

Смежные вопросы