Почему этот оператор SELECT блокируется на SQL Server? - PullRequest
5 голосов
/ 18 ноября 2009

У меня есть простой запрос, подобный этому

SELECT * FROM MY_TABLE;

При запуске SQL Server Management Studio зависает.

Другие таблицы и представления работают нормально.

Что может вызвать это? У меня были блокировки во время выполнения операторов UPDATE, и я знаю, как подойти к ним. Но что может вызвать блокировку SELECT?

Я запустил отчет «Все блокирующие транзакции», в котором говорится, что их нет.

Ответы [ 5 ]

10 голосов
/ 18 ноября 2009

Вероятно, блокируется не select, а какой-то другой процесс, который редактирует (удаляет / удаляет / вставляет) таблицу, вызывающую блокировки.

Вы можете просмотреть, какой процесс блокируется, запустив exec sp_who2 на вашем SQL Server.

В качестве альтернативы, если вы в порядке с грязным чтением, вы можете сделать одну из двух вещей

SELECT * FROM Table WITH (NOLOCK)

OR

SET Transaction Isolation Level Read Uncommitted
SELECT * FROM Table 
3 голосов
/ 18 ноября 2009

Если происходит много других действий, что-то еще может вызывать блокировки, и ваш SELECT может быть жертвой тупика. если вы выполните следующее

SELECT * FROM my_table WITH(nolock)

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

Кроме того, если такой запрос приводит к зависанию Management Studio, ваша таблица может использовать некоторую оптимизацию

3 голосов
/ 18 ноября 2009

Используйте это:

SELECT * FROM MY_TABLE with (NOLOCK)
1 голос
/ 18 ноября 2009

MY_TABLE также может быть заблокировано какой-то незафиксированной транзакцией - т. Е. Скрипт / хранимая процедура, запущенная (или не выполненная во время работы) в другом окне MSMM.

1 голос
/ 18 ноября 2009

Две возможности:

  1. Это действительно массивная таблица, и вы пытаетесь вернуть 500-метровые строки.
  2. У какого-то другого процесса есть блокировка на столе, не позволяющая вашему выбору пройти, пока эта блокировка не будет снята.
...