Как предотвратить блокировки / задержки при запросе одних и тех же таблиц из разных процессов? - PullRequest
1 голос
/ 14 июня 2011

У меня проблема с тем, что люди не могут работать с приложением интрасети, которое запрашивает те же таблицы, что и я из SQL Server Management Studio. Они должны дождаться окончания запроса, что может длиться ~ 10 минут.

Я уже уменьшил приоритет взаимоблокировки SSMS , но это, похоже, не влияет на задержки.

Я думаю, что возможно, что SQL-Server сможет обрабатывать оба запроса параллельно или, по крайней мере, иметь возможность уменьшить приоритет SSMS. Так есть ли какой-нибудь способ / опция, гарантирующая, что некоторые процессы, такие как w3sp.exe, получают высокий приоритет, а другие "внутренние" (связанные с SSMS запросы) получают низкий приоритет во времени процессора? Сервер вообще не был занят, использовался только 6% CPU, почему это так? Кроме того, почему SQL-Server блокирует таблицы, которые запрашиваются без каких-либо изменений (обновления / удаления). Могу ли я избежать этого?

Заранее спасибо.

1 Ответ

3 голосов
/ 14 июня 2011

Возможно, вы могли бы снизить уровень изоляции транзакции для некоторых / всех операций только для чтения, выполняемых одним или обоими приложениями интрасети и вашими запросами SSMS. Но если вы сделаете это, вы должны быть осторожны с такими вещами, как грязное чтение (когда вы читаете одну или несколько строк из таблицы, и впоследствии эти строки оказываются не зафиксированными их собственной транзакцией).

Нет никаких настроек уровня приоритета для соединений в SQL Server (кроме того, что, как вы заметили, добровольно становитесь жертвой взаимоблокировки). Настройки уровня ОС (например, приоритеты процессов) не будут влиять на SQL Server - все, что его волнует, - это блокировки и совместимость этих блокировок между различными соединениями.


Вы можете использовать оператор SET TRANSACTION ISOLATION LEVEL, чтобы изменить изоляцию на уровне соединения, или вы можете использовать подсказки блокировки (например, WITH NOLOCK) для отдельных таблиц в выражениях иметь более детальный контроль над тем, какие блокировки принимаются.

Обратите внимание, что если вы выполняете операторы DML (например, INSERT или DELETE), они все равно должны будут принимать эксклюзивные блокировки, поэтому, если ваше приложение интрасети желает запрашивать те же таблицы, оно должно ждать DML заявление, чтобы закончить, или это должно быть изменено, чтобы отразить его изоляцию. Нет средств для определения поведения других соединений из ваших собственных запросов - они должны выбирать свои собственные настройки изоляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...