2009-12-20 3 views
2

У нас есть база данных (назовем ее базой данных A), которая становится непригодной для использования через несколько дней, и мы должны ее перезапустить. Когда я говорю непригодным, все приложения, использующие его, просто блокируются там, ожидая ответа базы данных, но это никогда не происходит.SQL Server 2005 блокируется без блокировки или блокировки

К счастью было замечено, что выполнение инструкции SELECT в отношении конкретной таблицы с использованием SQL Server Management Studio, похоже, приносит некоторые записи, но в какой-то момент блокирует.

Самое смешное, что в конкретной базе данных отсутствуют процессы LOCKED или LOCKING. Я узнал, что приложение использует следующую изоляцию транзакций:

ALLOW_SNAPSHOT_ISOLATION ON 

, который объясняет, почему мы не можем видеть блокированные или блокировки процессов правильно?

У нас есть другая база данных (назовем ее базой данных B), которая фактически имеет ту же схему, и у нас никогда не было этой проблемы. Единственная разница между этими базами данных - это изоляция, о которой я упоминал ранее. В этом случае используется изоляция транзакций по умолчанию, и у нас никогда не было этой необычной блокировки базы данных. Но и в базе данных A есть намного больше операций открытия в день; гораздо больше. Так что я могу думать о том, что SNAPSHOT ISOLATION следует избегать для большого количества параллельных транзакций в этом случае.

Может кто-нибудь подтвердить, что, скорее всего, это проблема SNAPSHOT ISOLATION, вызывающая проблемы? Я имею в виду, что у нас нет блокировок, и у нас просто есть блокировка базы данных без каких-либо фактических исключений или что-то, что поможет нам обнаружить основную причину проблемы.

Являются ли мои предположения правильными? Надеюсь, что так.

ответ

2

Вы пытались контролировать использование вашего tempdb? (AFAIK, ALLOWSNAPSHOT_ISOLATION ON в значительной степени зависит от данных TempDb, что это не так для стандартных стратегий запирающих)

This MS technet page дает несколько советов о том, как это сделать (смотрите раздел «Космический мониторинг»)

вы можете также используйте этот быстрый запрос, чтобы проверить, что ваш tempdb не заполнен:

use tempdb 
    exec sp_spaceused 
+0

Можете ли вы дать мне несколько советов о том, что мне следует отслеживать на tempdb? – DaTroop

+0

только что обновил мой ответ ... – Brann

+0

Как это могло бы помочь? Вот документ для этого sp: Отображает количество строк, зарезервированное место на диске и пространство на диске, используемое таблицей, индексированным представлением или очередью Service Broker в текущей базе данных, или отображает зарезервированное и используемое дисковое пространство по всей базе данных Я имею в виду, что это покажет мне пространство, выделенное tempdb. Я имею в виду, что еще я могу сделать, чтобы контролировать, что делает базу данных A очень медленной? – DaTroop