Linked Server в SQL Server – это мощный инструмент для запросов к удаленным базам данных. Однако, могут возникать ситуации, когда они не работают ожидаемым образом, особенно при выполнении запросов на обновление. В этой статье мы рассмотрим конкретный сценарий, когда некоторые запросы работают нормально, а другие вызывают проблемы. Мы также обсудим обходной путь для решения этой ситуации.
Сценарий
Допустим, у нас есть два экземпляра SQL Server: SERV1 и SERV2. У нас есть таблица “Update_Test” с 90 000 строк тестовых данных в базе данных “db1” на SERV1. Кроме того, мы создали связанный сервер с именем SERV1 на SERV2, который подключается к SERV1.
Когда мы выполняем запрос SELECT через связанный сервер, он выполняется менее чем за секунду, как и ожидалось. План выполнения подтверждает, что запрос отправляется на удаленный сервер и выполняется там.
Аналогично, когда мы выполняем запрос DELETE через связанный сервер, он также выполняется быстро без проблем.
Однако проблема возникает, когда мы пытаемся выполнить запрос UPDATE для определенных столбцов. Например, если мы обновляем столбец “bit”, запрос занимает значительно больше времени, около 30 секунд. План выполнения показывает, что выполняется удаленное сканирование с использованием курсора API Server, что объясняет задержку.
Мы столкнулись с аналогичной проблемой при обновлении столбца “nvarchar(max)”.
Обходное решение: Создание хранимой процедуры
Чтобы избежать проблемы с удаленным сканированием, мы реализовали обходное решение, создав хранимую процедуру на SERV1. Эта хранимая процедура принимает параметры “id” и “val” и соответствующим образом обновляет таблицу “Update_Test”.
Вот пример хранимой процедуры:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE Update_table (@id int, @val bit) AS BEGIN SET NOCOUNT ON UPDATE Update_Test SET val = @val WHERE id = @id END
Вызывая эту хранимую процедуру с SERV2 через связанный сервер, мы смогли обновить таблицу без проблем.
Например:
EXEC [SERV1].db1.dbo.Update_table 2954, 0
Вывод
Связанные серверы SQL Server предоставляют удобный способ для запросов к удаленным базам данных. Однако, при работе с запросами на обновление важно знать о возможных проблемах, которые могут возникнуть. В случаях, когда определенные столбцы вызывают задержки или неожиданное поведение, создание хранимой процедуры на удаленном сервере может служить обходным решением для преодоления этих проблем.
Реализуя это обходное решение, вы можете обеспечить эффективное и эффективное выполнение ваших запросов на обновление через связанные серверы.