Очень медленное обновление SQL с использованием связанного сервера - PullRequest
3 голосов
/ 17 января 2011

У меня есть скрипт sql, работающий на сервере (ServerA) Этот сервер имеет настройку связанного сервера (ServerB) - он находится за пределами сайта в центре обработки данных.

Этот запрос работает относительно быстро:

SELECT OrderID
FROM [ServerB].[DBName].[dbo].[MyTable]
WHERE Transferred = 0

Однако при обновлении той же таблицы с помощью этого запроса:

UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1

Требуется> 1 минута для завершения (даже если есть только 1 столбец, где Transferred = 0)

Есть ли причина, по которой это будет действовать так медленно? Должен ли я иметь индекс на MyTable для столбца «Передано»?

Ответы [ 3 ]

9 голосов
/ 17 января 2011

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

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

3 голосов
/ 17 января 2011
UPDATE [ServerB].[DBName].[dbo].[MyTable]
SET Transferred = 1
WHERE Transferred = 0   -- missing this condition?
0 голосов
/ 17 января 2011

Как часто эта таблица используется?

Если эта таблица используется многими пользователями одновременно, у вас может быть проблема с блокировкой / блокировкой.

Каждый раз, когда какой-либо процесс обновляет таблицу без фильтрации записей, вся таблица блокируется транзакцией, а другие процессы, которым требуется обновить таблицу, ожидают ожидания.

В этом случае вы можете ждать, пока какой-нибудь другой процесс разблокирует таблицу.

...