Соединение таблиц из разных БД на разных серверах: решение

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Чтобы объединить таблицы, которые локализованы на разных серверах, воспользуйтесь функциональностью связанных серверов или методом OPENQUERY. Предлагаю вашему вниманию пример конфигурации связанного сервера для последующего использования в запросе:

SQL
Скопировать код
-- Начинаем работу
EXEC sp_addlinkedserver @server='RemoteServer'; -- Добавляем связанный сервер

-- Переходим к объединению таблиц
SELECT l.Name, r.SalesAmount
FROM localDB.dbo.Customers l
JOIN RemoteServer.remoteDB.dbo.Sales r
  ON l.CustomerID = r.CustomerID; -- И все это окунуто в SQL!

Пожалуйста, убедитесь, что имена серверов, баз данных и таблиц соответствуют вашим рабочим условиям. Для установления постоянной связи предпочтительно использовать связанные серверы, а для выполнения единичных запросов к удаленным серверам пользуйтесь методом OPENQUERY.

Кинга Идем в IT: пошаговый план для смены профессии

Пошаговая процедура

Создание связанных серверов

Сначала добавьте связанный сервер с помощью sp_addlinkedserver. Это дает возможность обращаться к нему столь же просто, как и к локальному:

SQL
Скопировать код
-- Кто там?
EXEC sp_addlinkedserver @server='RemoteServer'; -- Ваш новенький связанный сервер!

Уделяйте особое внимание вопросам прав доступа и безопасности при работе со связанными серверами. Здесь вам сможет пригодиться помощь администратора базы данных.

Оптимизация производительности запросов с использованием функции OPENQUERY

Применяйте OPENQUERY для улучшения производительности запросов. Эта функция позволяет отфильтровать данные до момента их отправки:

SQL
Скопировать код
-- Сначала мы фильтруем данные на удаленном сервере
SELECT *
FROM OPENQUERY(RemoteServer, 'SELECT SalesID, SalesAmount FROM remoteDB.dbo.Sales WHERE SalesDate > ''20230101''') AS r
JOIN localDB.dbo.Customers l
  ON l.CustomerID = r.SalesID; -- До свидания, ненужные передачи данных!

При таком подходе снижается объем сетевого трафика и предотвращается его перегруженность.

Применение временных таблиц

Для упрощения проведения регулярных сложных процедур слияния можно использовать временные таблицы:

SQL
Скопировать код
-- Создаем временную таблицу
SELECT *
INTO #LocalSalesData
FROM OPENQUERY(RemoteServer, 'SELECT SalesID, SalesAmount FROM remoteDB.dbo.Sales');

-- Основной запрос
SELECT l.Name, s.SalesAmount
FROM localDB.dbo.Customers l
JOIN #LocalSalesData s
  ON l.CustomerID = s.SalesID; -- Приятного аппетита!

Стратегии обработки больших объемов данных

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

Визуализация

Представьте себе, что запросы между двумя базами данных — это встреча двух космонавтов из разных стран, вооруженных желанием общаться данными в безграничном пространстве:

Markdown
Скопировать код
Космическая станция Альфа (🛰️ A): Хранит базу данных А 📄🗂️
Космическая станция Браво (🛰️ B): Хранит базу данных B 📄🗂️

Связь между ними реализована через Межзвездную Сеть (🔗):

Markdown
Скопировать код
🛰️ A 🔗 🛰️ B
# Надежный канал связи установлен между двумя космическими станциями (серверами)

SQL-запрос действует как специализированный робот, который осуществляет слияние данных:

SQL
Скопировать код
SELECT *
FROM [ServerA].[DatabaseA].[dbo].[TableA] A
INNER JOIN [ServerB].[DatabaseB].[dbo].[TableB] B
ON A.Key = B.Key -- Работа робота во всей красе!

Профессиональные рекомендации по улучшению запросов

  • Четко и конкретно указывайте полные наименования — исключите возможность двусмысленности.
  • Регулярно проверяйте синтаксис SQL, чтобы предотвратить ошибки.
  • Для выполнения одиночных запросов без создания связанного сервера используйте OPENROWSET.
  • Заранее продумайте меры безопасности при конфигурации удаленных подключений.
  • Объединяйте только те элементы таблиц, которые действительно необходимы для оптимизации обработки запросов.

Полезные материалы

  1. Создание связанных серверов – SQL Server | Microsoft Learn — детальное руководство по работе со связанными серверами в SQL Server.
  2. OPENQUERY (Transact-SQL) – SQL Server | Microsoft Learn — инструкция по применению функции OPENQUERY в контексте работы со связанными серверами.
  3. sp_addlinkedserver (Transact-SQL) – SQL Server | Microsoft Learn — пошаговое руководство к использованию sp_addlinkedserver для добавления связанных серверов.
  4. SQL-соединение между базами данных на разных серверах — опыт сообщества Stack Overflow в вопросах SQL-объединения между разными базами данных.
  5. Клонирование SQL Server Login со всеми разрешениями с помощью PowerShell — руководство по управлению правами доступа в SQL Server в связи с безопасностью при выполнении кросс-базовых запросов.