Соединение таблиц из разных БД на разных серверах: решение
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы объединить таблицы, которые локализованы на разных серверах, воспользуйтесь функциональностью связанных серверов или методом OPENQUERY. Предлагаю вашему вниманию пример конфигурации связанного сервера для последующего использования в запросе:
-- Начинаем работу
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.
Пошаговая процедура
Создание связанных серверов
Сначала добавьте связанный сервер с помощью sp_addlinkedserver
. Это дает возможность обращаться к нему столь же просто, как и к локальному:
-- Кто там?
EXEC sp_addlinkedserver @server='RemoteServer'; -- Ваш новенький связанный сервер!
Уделяйте особое внимание вопросам прав доступа и безопасности при работе со связанными серверами. Здесь вам сможет пригодиться помощь администратора базы данных.
Оптимизация производительности запросов с использованием функции OPENQUERY
Применяйте OPENQUERY
для улучшения производительности запросов. Эта функция позволяет отфильтровать данные до момента их отправки:
-- Сначала мы фильтруем данные на удаленном сервере
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; -- До свидания, ненужные передачи данных!
При таком подходе снижается объем сетевого трафика и предотвращается его перегруженность.
Применение временных таблиц
Для упрощения проведения регулярных сложных процедур слияния можно использовать временные таблицы:
-- Создаем временную таблицу
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-процедур или копирования таблиц, особенно если на повестке дня дельта-обновления. Учитывайте величину передаваемых данных и сетевой трафик. Представьте себе сеть как автомагистраль в час пик.
Визуализация
Представьте себе, что запросы между двумя базами данных — это встреча двух космонавтов из разных стран, вооруженных желанием общаться данными в безграничном пространстве:
Космическая станция Альфа (🛰️ A): Хранит базу данных А 📄🗂️
Космическая станция Браво (🛰️ B): Хранит базу данных B 📄🗂️
Связь между ними реализована через Межзвездную Сеть (🔗):
🛰️ A 🔗 🛰️ B
# Надежный канал связи установлен между двумя космическими станциями (серверами)
SQL-запрос действует как специализированный робот, который осуществляет слияние данных:
SELECT *
FROM [ServerA].[DatabaseA].[dbo].[TableA] A
INNER JOIN [ServerB].[DatabaseB].[dbo].[TableB] B
ON A.Key = B.Key -- Работа робота во всей красе!
Профессиональные рекомендации по улучшению запросов
- Четко и конкретно указывайте полные наименования — исключите возможность двусмысленности.
- Регулярно проверяйте синтаксис SQL, чтобы предотвратить ошибки.
- Для выполнения одиночных запросов без создания связанного сервера используйте OPENROWSET.
- Заранее продумайте меры безопасности при конфигурации удаленных подключений.
- Объединяйте только те элементы таблиц, которые действительно необходимы для оптимизации обработки запросов.
Полезные материалы
- Создание связанных серверов – SQL Server | Microsoft Learn — детальное руководство по работе со связанными серверами в SQL Server.
- OPENQUERY (Transact-SQL) – SQL Server | Microsoft Learn — инструкция по применению функции OPENQUERY в контексте работы со связанными серверами.
- sp_addlinkedserver (Transact-SQL) – SQL Server | Microsoft Learn — пошаговое руководство к использованию sp_addlinkedserver для добавления связанных серверов.
- SQL-соединение между базами данных на разных серверах — опыт сообщества Stack Overflow в вопросах SQL-объединения между разными базами данных.
- Клонирование SQL Server Login со всеми разрешениями с помощью PowerShell — руководство по управлению правами доступа в SQL Server в связи с безопасностью при выполнении кросс-базовых запросов.