Блокировки таблиц SQL Server / блокировки - PullRequest
0 голосов
/ 07 ноября 2018

Учитывая приведенный ниже пример, предполагая, что TABLE1 содержит 1 миллион записей;

  1. SELECT * INTO TMP_TABLEA FROM TABLE1
  2. SELECT * INTO TMP_TABLEB FROM TABLE1
  3. INSERT INTO TMP_TABLEC (COLUMN1) SELECT COLUMN1 FROM TABLE1

Вопрос *; 1014 *

  1. Учитывая, что запросы выполнялись одновременно, будет ли заблокирован TABLE1? Или все равно вызовет блокировку?
  2. Значительно ли это влияет на производительность выполнения каждого запроса?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
  1. Учитывая, что запросы выполнялись одновременно, будет ли заблокирован TABLE1? Или все равно будет вызывать блокировку?

Ответ: Да, но общая блокировка (фактически блокировка Read Committed) будет применена к TABLE1, которая освобождается, когда строки читаются одна за другой. Поскольку это общая блокировка, это не блокирующая блокировка.

  1. Значительно ли это влияет на производительность выполнения каждого запроса?

Ответ: Да, это так. Но вы можете значительно улучшить производительность, используя некоторые разделы в TABLE1. Таким образом, он может использовать многоядерные процессоры, которые вы пытаетесь использовать. Также убедитесь, что вы правильно установили индексы для TABLE1.

0 голосов
/ 07 ноября 2018

Поскольку в TABLE1 нет операции записи, блокировка не будет выполняться.

во время операции чтения, общая блокировка. что означает отсутствие блока.

во время операции записи, эксклюзивная блокировка. что означает блок.

Но определенно вызовет медлительность. Поскольку TABLE1 делится своим доступным ресурсом с номером операции n.

0 голосов
/ 07 ноября 2018

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

Первый оператор будет блокировать исключительно TMP_TABLEA, но он установит общие блокировки на TABLE1 ниже уровня изоляции по умолчанию.

Второй оператор будет блокировать исключительно TMP_TABLEB, но он установит общие блокировки на TABLE1 ниже уровня изоляции по умолчанию.

Третий оператор установит эксклюзивные блокировки (строки, страницы или весь объект) TMP_TABLEC. но он установит общие блокировки на TABLE1 ниже уровня изоляции по умолчанию.

Очевидно, что это влияет на производительность, так как вы просите SQL Server выполнять три действия одновременно. Однако быстрее выполнить все три оператора одновременно, используя три соединения, чем выполнять их последовательно, используя только одно соединение.

...