2009-06-30 8 views
0

приведенный ниже код отлично работает, но требуется абсолютный возраст для запуска. Как я могу ускорить это?Проблема с распределенными запросами

Фон: я связал свой локальный сервер с моим удаленным сервером. С моего локального сервера мне нужно вставить данные с удаленного сервера на локальный сервер, а затем обновить таблицу на удаленном сервере. См. Фрагмент для получения точных данных.

DECLARE @temp1 TABLE 
(LoginID INT PRIMARY KEY, 
UserID UNIQUEIDENTIFIER, 
Message NCHAR(1000)) 

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message) 
OUTPUT INSERTED.LoginID, INSERTED.UserID, INSERTED.Message INTO @temp1 
SELECT LoginID, UserID, Message 
FROM [Remote Server].[Remote DB Name].dbo.Login2 
WHERE Date IS NULL 

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE() 
FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z 
WHERE EXISTS (SELECT 1 FROM @temp1 AS x WHERE z.Date IS NULL AND x.LoginID = z.LoginID) 

РЕДАКТИРОВАТЬ:

Кроме того, есть в любом случае можно сжать/ZIP данные отправляются туда и обратно?

ответ

2

Является ли INSERT или UPDATE виновником, или они оба плохи?

Вы вводите строки с значениями NULL для даты с удаленного сервера, а затем отправляете эти значения обратно в инструкции UPDATE. Вы могли бы сохранить трафик, выбрав обновленные строки и введя их локально. Похоже, что вы могли бы сделать это (извините, нет MS SQL Server доступен не для проверки против), говоря

INSERT INTO [My Local Server].[DB Name].dbo.Login 
(LoginID, UserID, Message) 
SELECT * 
FROM 
    UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
    SET Date = GETDATE() 
    OUTPUT LoginID, UserID, Message 
    WHERE Date IS NULL 

Смотрите MSDN INSERT docs и OUTPUT docs для деталей.

Или, может быть, выход в это путь:

UPDATE [Remote Server].[Remote DB Name].dbo.Login2 
SET Date = GETDATE() 
OUTPUT LoginID, UserID, Message 
INTO [My Local Server].[DB Name].dbo.Login (LoginID, UserID, Message) 
WHERE Date IS NULL 
+0

К сожалению, забыл упомянуть об этом. INSERT терпимо. Его обновление медленное. Вы правы, я хочу уменьшить трафик. К сожалению, я не могу проверить ваш сценарий, поскольку сейчас я просто выхожу из офиса. Но спасибо за ваш вклад. Я попробую завтра и отправлю результаты. – super9

+0

Вы изначально вытаскиваете строки, где Date IS NULL с удаленного сервера, но затем UPDATE столбец Date для строк, где DateCollected IS NULL. Это означает, что вы можете вставить другой набор строк локально, чем вы обновляете. Это специально? –

+0

OH dear, DateCollected был опечаткой с моей стороны. Это должно быть дата. Таким образом, чтобы ответить на ваш вопрос, это тот же набор данных, которые я вставляю и обновляю. – super9

0

Кажется, что UPDATE должен тянуть всю удаленную таблицу снова, сканировать записи и сделать вложенный взгляд вверх в @ temp1, корабль назад обновления. Это просто предположение, без дополнительной информации. Вы должны посмотреть на фактический план выполнения и трассировку, где потрачено время. Также может помочь использование STATISTICS IO ON.

Это действительно просто выстрел в темноте, но, возможно, вы можете попробовать присоединиться вместо EXISTS:

WITH cte_remote AS (
    SELECT z.Date 
    FROM [Remote Server].[Remote DB Name].dbo.Login2 AS z 
    JOIN @temp1 AS x ON z.DateCollected IS NULL AND x.LoginID = z.LoginID) 
UPDATE cte_remote 
    SET Date = GETDATE(); 
+1

Ну, я обошел эту проблему. Я не выполняю удаленный SP, который обновляет мою удаленную таблицу, а не использует распределенные запросы. МНОГО БОЛЬШЕ. Спасибо за ваше предложение! – super9