Осторожно: запросы с LinkedServer | OTUS
🚀 OTUS Fest 2021
Бесплатная образовательная онлайн-конференция для IT-специалистов.
Подробнее

Курсы

Программирование
Backend-разработчик на PHP
-9%
Алгоритмы и структуры данных
-9%
Team Lead
-6%
Архитектура и шаблоны проектирования Разработчик IoT
-13%
C# Developer. Professional
-9%
HTML/CSS
-11%
C# ASP.NET Core разработчик
-5%
Kotlin Backend Developer
-8%
iOS Developer. Professional
-8%
Java Developer. Basic C++ Developer. Professional Web-разработчик на Python MS SQL Server Developer Android Developer. Basic Разработчик программных роботов (RPA) на базе UiPath и PIX Microservice Architecture Unity Game Developer. Basic Разработчик голосовых ассистентов и чат-ботов React.js Developer Node.js Developer Интенсив «Оптимизация в Java» Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes JavaScript Developer. Basic Unity Game Developer. Professional Супер-интенсив Azure
Инфраструктура
Экспресс-курс «IaC Ansible»
-10%
Administrator Linux.Basic
-10%
Мониторинг и логирование: Zabbix, Prometheus, ELK
-10%
Экспресс-курс «CI/CD или Непрерывная поставка с Docker и Kubernetes»
-30%
Administrator Linux. Professional
-6%
Дизайн сетей ЦОД
-13%
NoSQL Основы Windows Server MS SQL Server Developer Инфраструктурная платформа на основе Kubernetes Cloud Solution Architecture Highload Architect Разработчик голосовых ассистентов и чат-ботов VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Супер-интенсив "Tarantool"
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Осторожно: запросы с LinkedServer

SQL_Deep_23.1_site-5020-b3411a.png

Обычная история. У вас несколько серверов БД, и вдруг вы понимаете, что нужны данные с другого сервера. LinkedServer — прекрасное решение. Вы подключаете БД и можете делать выборки так, как будто эта таблица находится на вашем сервере! Все счастливы и работают дальше.

Так всё и работает, пока у вас таблица на втором сервере не вырастает до внушительных размеров (например, 10 млн. записей и более). В какой-то момент выборка начинает тормозить, и вы решаете посмотреть план. И что же вы там видите?

О, ужас! SQL Server тянет все 10 млн. записей на местный сервер и тут делает JOIN с местными таблицами, и на выходе у вас получается 100 записей.

Ну-ну, не спешите огорчаться! Конечно, сервер и оптимизатор умные, но иногда случаются проколы при использовании соединений с таблицами с других серверов.

Что же делать?

Вызов хранимой процедуры Вы создаёте хранимую процедуру на сервере с удалённой таблицей и передаёте туда фильтр, который поможет вам уменьшить количество записей в результатах. Иногда, к сожалению, вам нужен именно JOIN с местной таблицей, но в 90% случаях это закроет проблему.

Затем вы делаете на местном сервере вызов процедуры с удалённого сервера, а результаты сохраняете во временную таблицу. Далее вы делаете JOIN с местными таблицами и получаете результат.

Репликация Если таблица на удалённом сервере не очень большая (тут всё относительно ваших объёмов и возможностей), а данные из неё вам нужны очень часто, и меняются они при этом очень редко, то присмотритесь к репликации. Да, это некоторое дублирование, но если чтений много, это поможет сэкономить вам много ресурсов, даже несмотря на затраченное дополнительное место на диске.

Вы реплицируете нужную таблицу на местный сервер, все изменения будут доставляться на него автоматически. На местном сервере уже работаете с копией таблицы и можете выбирать оттуда данные, это будет быстрее и эффективнее удалённого вызова.

Вывод

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

А как вы используете LinkedServer? Пишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться