Избегать присоединений к связанным серверным таблицам.
Можно использовать именование из четырех частей для вашего объединения, но это дороже. Ваше объединение может содержать критерии, которые можно использовать для ограничения набора данных со связанного сервера и использования индексированных столбцов.
Пример:
SELECT loc.field1, lnk.field1
FROM MyTable loc
INNER JOIN RemoteServer.Database.Schema.SomeTable lnk
ON loc.id = lnk.id
AND lnk.RecordDate = GETDATE()
WHERE loc.SalesDate = GETDATE()
В этом запросе также применяется критерий в соединении, который может использоваться связанным сервером до расчета соединения.
Рекомендуемый метод - использование ОТКРЫТИЯ.
Избегая объединения с использованием OPENQUERY, локальный сервер отправляет запрос на выполнение только удаленно, а не отправляет набор идентификаторов для объединения.
Используйте ссылку, чтобы получить набор данных и выполнить вычисления локально. Либо используйте временную таблицу (для специальных запросов), либо вставьте строку в постоянную таблицу в ночное задание.
Начало транзакции может завершиться неудачно в зависимости от того, установлен ли удаленный координатор транзакций на любимом сервере Его использование потребляет больше ресурсов.
Также учтите, что вы работаете с рабочим сервером, на котором запущено приложение, хотя вы не указываете его, я думаю, можно с уверенностью предположить, что он использует тяжелые транзакции и выполняет вставки и обновления. Вы забираете ресурсы у приложения.
Ваша цель заключается в использовании данных для целей отчетности. На вашем сервере может быть установлен простой журнал, а не полный, что делает его более эффективным.
Вы также избежите отмены своих запросов из-за перемещения данных на связанном сервере. Всегда будьте внимательны при настройке правильного уровня изоляции для ваших запросов и табличных подсказок, таких как NOLOCK.
И ПОЖАЛУЙСТА! Никогда не помещайте OPENQUERY (или любой связанный сервер) внутри цикла!