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

SQL_Deep_23.1_site-5020-b3411a.png

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

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

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

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

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

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

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

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

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

Вывод

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

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

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