Связанные серверы: сначала уменьшите передачу данных
Выясните место выполнения запроса, отфильтруйте данные на источнике и проверьте семантику, доступ и поведение при отказах.
Запрос между маленькой локальной и большой удалённой таблицами может выглядеть безобидно при проверке кода. Для связанного сервера стоимость часто определяется объёмом передачи и числом удалённых обращений. Небольшой конечный результат не доказывает, что источник отфильтровал данные эффективно. Выясните место фильтрации и агрегации до добавления локальных индексов или увеличения таймаутов.
Найдите дорогую границу
Получите фактический локальный план типичного выполнения. Изучите удалённый оператор и переданный текст. Сравните число поступивших строк с остатком после локальных фильтров. Если ради двухсот строк результата передаются миллионы широких записей, эта граница важнее локальной сортировки длительностью несколько миллисекунд.
Четырёхчастное имя не означает, что вся работа выполняется локально. SQL Server может передавать обработку источнику; размещение зависит от запроса, провайдера, доступных сведений и поддерживаемых операций. Удалённый оператор также не доказывает эффективность плана на источнике. Исследуйте тот экземпляр по собственным данным выполнения и индексам.
Измеряйте длительность, число обращений, ширину строк и нагрузку источника с одинаковыми параметрами. Вызов на каждую локальную строку может быть хуже одного ограниченного пакета, хотя отдельный вызов быстр. Проверяйте крупнейшего клиента, если именно на нём возникает производственная проблема. Учитывайте параллельный запуск отчётов несколькими пользователями, а не только одиночное выполнение ночью.
Явно задайте удалённую работу
Шаблон предполагает уже настроенный связанный SQL Server ReportingLink и удалённую базу Sales. Он не изменяет настройку или учётные данные. Адаптируйте схему в тестовой среде. Период и агрегация находятся внутри передаваемого текста, поэтому обратно возвращаются только суммы клиентов.
SELECT CustomerId, TotalAmount
FROM OPENQUERY([ReportingLink],
'SELECT CustomerId,
SUM(CONVERT(decimal(19,4), Amount)) AS TotalAmount
FROM Sales.dbo.Orders
WHERE OrderDate >= ''20260101''
AND OrderDate < ''20260201''
GROUP BY CustomerId');
Amount должен иметь нужный точный числовой тип и помещаться в десятичную агрегацию. Границы дат следуют документированной временной шкале удалённых данных. Сравните результат с надёжным локальным расчётом на небольшой выборке с граничными датами, несколькими заказами и отрицательными корректировками. Быстрый расчёт неправильного периода не улучшает отчёт.
OPENQUERY принимает буквальный текст, не поддерживает переменные в аргументах и ограничивает текст восемью килобайтами. Не обходите ограничение вставкой непроверенного пользовательского ввода во вложенные кавычки. Для переменных условий рассмотрите специально предоставленную удалённую процедуру с типизированными параметрами либо согласованный интерфейс промежуточных данных. Отдельно проверьте поддержку провайдера и необходимые настройки RPC.
Если выбор определяется локальными ключами, контролируемый набор на удалённой стороне может представить весь пакет. Назначьте идентификатор операции, очистку и разделение параллельных вызовов. Такой вариант требует записи и управления жизненным циклом. Это не бесплатная замена чтению через связанный сервер. Укажите также допустимый размер пакета, чтобы редкий огромный список не перегружал источник.
Сохраните смысл и границы отказа
Разные параметры сортировки и типы могут менять сравнения или вызывать преобразования. Проверьте регистр, акценты, Unicode, NULL и точность. Не объявляйте сортировки совместимыми ради красивого плана, если утверждение неверно. После изменения проверяйте сформированный удалённый текст и результаты на контрольных данных.
Используйте удалённую учётную запись с минимальным доступом и испытывайте запрос от настоящего логина приложения. Успех администратора не проверяет сопоставление или делегирование для службы. Не помещайте секреты в SQL и снимки экрана. Определите ответственных за провайдер и сертификаты, чтобы ошибки соединения имели понятный путь решения.
Наконец, различайте чтение и межсерверную запись. Запись внутри локальной транзакции может задействовать распределённую транзакцию в зависимости от операции и настроек. Отключение повышения ради устранения ошибки способно изменить обещанную атомарность. Испытайте обрыв и неопределённый результат, затем проектируйте повторы по реальной границе транзакции. Для частых больших отчётов обслуживаемая локальная копия иногда даёт более понятное и измеримое обязательство по свежести.
Техническая документация: Microsoft Learn: OPENQUERY · Microsoft Learn: Remote execution options · Microsoft Learn: Server options.