Сохраняет ли SQL Server 2k5 подсказки о блокировке для связанных серверов? - PullRequest
1 голос
/ 28 августа 2009

Я суетился вокруг себя - и я сам не администратор базы данных, - но мне стало любопытно, когда я пытался найти решение проблем с особенно дорогим (и нечастым) запросом, который выполняет внешнее соединение на связанном сервере (от 2k5 до 2k5, разные БД на разных физических машинах). Проблема, как правило, не в времени выполнения, а скорее в блокировке, поскольку внешнее объединение против довольно массового чтения / записи в db, и было интересно, будет ли добавление подсказки NOLOCK в оператор соединения бесполезным жестом.

Я уже нашел эту ссылку MSDN Social (и проверил наличие существующих вопросов SO), но модераторы догадаются об одном (подсказки не передаются по проводам), а позже задает вопрос эмпирически что он видит сохраненные намеки. Я подумал, что ТАК поможет мне найти более точный ответ!

Ответы [ 2 ]

3 голосов
/ 28 августа 2009

Я только что проверил это в сценарии, который вы описали (от 2k5 до 2k5, разные базы данных на разных физических машинах), используя подсказку NOLOCK, когда SQL Profiler запущен на компьютере, на который указывает связанный сервер. Трассировка показывает, что подсказка сохраняется в запросе, выполненном на связанном сервере.

Я побежал

select 1 from server.master.dbo.sysobjects with (nolock)

и обнаружил следующее в следе:

declare @p1 int
set @p1=4
exec sp_prepexec @p1 output,NULL,N'SELECT (1) "Expr1003" FROM "master"."dbo"."sysobjects" "Tbl1002" WITH (NOLOCK)'
select @p1

Я подозреваю, что это особенность драйвера SQLNCLI, нового в SQL 2005, поскольку подсказки, безусловно, не сохранялись в запросах связанных серверов в SQL 2000.

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

1 голос
/ 28 августа 2009

Хороший вопрос, и я собираюсь пойти дальше, а не отвечать на него и сказать, что вам следует рассмотреть , установив для READ_COMMITTED_SNAPSHOT значение ON в своих базах данных. Это предотвратит блокировку транзакций, использующих уровень изоляции READ_COMMITTED, по умолчанию. Вы, возможно, захотите ознакомиться с настройкой, прежде чем устанавливать ее, поскольку вам необходимо понять, каков ваш профиль загрузки, и ваш администратор БД должен будет убедиться, что размер базы данных tempdb соответствует этому.

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