Почему этот оператор SELECT заперся бы на SQL Server?

Существуют недостатки использования подсчета ссылок. Один из наиболее упомянутых является циклическими ссылками: Предположим ссылки B, B ссылки C и ссылки C B. Если A должны были отбросить его ссылку на B, и B и C будут все еще иметь подсчет ссылок 1 и не будут удалены с традиционным подсчетом ссылок. CPython (подсчет ссылок не является частью самого Python, но частью реализации C этого) ловит циклические ссылки с отдельной стандартной программой сборки "мусора", которую это периодически выполняет...

Другой недостаток: Подсчет ссылок может сделать выполнение медленнее. Каждый раз, когда на объект ссылаются и разыменовывают, interpreter/VM должен проверить, чтобы видеть, снизилось ли количество 0 (и затем освободите, если это сделало). Сборка "мусора" не должна делать этого.

кроме того, Сборка "мусора" может быть сделана в отдельном потоке (хотя это может быть немного хитро). На машинах с большим количеством RAM и для процессов, которые используют память только медленно, Вы не могли бы хотеть делать GC вообще! Подсчет ссылок был бы определенным недостатком там с точки зрения производительности...

5
задан JosephStyons 18 November 2009 в 13:59
поделиться

5 ответов

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

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

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

SELECT * FROM Table WITH (NOLOCK)

ИЛИ

SET Transaction Isolation Level Read Uncommitted
SELECT * FROM Table 
11
ответ дан 18 December 2019 в 08:28
поделиться

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

SELECT * FROM my_table WITH(nolock)

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

Кроме того, если такой запрос вызывает Management studio, чтобы повесить, ваш стол может потребовать некоторой оптимизации

3
ответ дан 18 December 2019 в 08:28
поделиться

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

SELECT * FROM MY_TABLE with (NOLOCK)
3
ответ дан 18 December 2019 в 08:28
поделиться

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

  1. Это действительно огромная таблица, и вы пытаетесь вернуть 500 миллионов строк.
  2. У какого-то другого процесса есть блокировка таблицы,предотвращение прохождения вашего выбора до тех пор, пока эта блокировка не будет снята.
1
ответ дан 18 December 2019 в 08:28
поделиться

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

1
ответ дан 18 December 2019 в 08:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: