Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Производительность связанного сервера SQL Server

Автор вопроса: George2Ответов: 6

Я использую SQL Server 2008 Enterprise. И я использую технологии Linked Server, чтобы связать другой экземпляр SQL Server 2008 Enterprise с другого сервера. Я пишу TSQL для управления объектами (например, таблицами) с обоих экземпляров сервера.

Мой вопрос: для связанного сервера есть большая проблема с производительностью? Если да, каковы основные узкие места в производительности и рекомендации, которым мы должны следовать?

заранее спасибо, Джордж

sqlsql-serversql-server-2008

Ответы

Ответ 1 · рейтинг 17 · Sam Saffron

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

Есть ряд проблем, которые вы должны иметь в виду:

  • Если вы будете соединять 2 таблицы из DB1 с 2 таблицами из DB2, а таблицы большие, все может получиться некрасиво. В конце дня запросы где-то будут выполняться. БД должна будет вытащить все результаты в основную БД и поддерживать целостность транзакций в основной БД. Это может быть очень дорого.
  • Если вы начнете выполнять распределенные транзакции, вещи могут стать ужасными, и быстро.
  • При объединении материалов между серверами ваши индексы на удаленном сервере могут оказаться бесполезными. Все данные должны куда-то перемещаться для соединений.
  • Ссылки на связанные серверы могут отключаться в неожиданное время и приводить к труднодиагностируемым ошибкам.

В прошлом я сталкивался с ситуациями, когда было на несколько порядков быстрее перемещать удаленные данные локально и индексировать их перед присоединением к ним.

Ответ 2 · рейтинг 5 · Mitch Wheat

Это зависит от того, что вы делаете.

Если вы выполняете запросы, соединяющие таблицы в двух экземплярах сервера, и передаете большие объемы данных, у вас есть узкое место, о котором вам нужно знать.

Если серверы находятся в своей собственной подсети с каналом 1 ГБ, вам не о чем беспокоиться. Я был бы обеспокоен, если бы два сервера были соединены общим медленным каналом.

Ответ 3 · рейтинг 2 · Eric

Вам придется немного потрудиться, чтобы дважды передать результаты по сети (связанный сервер с SQL Server на вашем компьютере). Во-вторых, он должен разрешить имя и войти в систему, что не является большим успехом, но, тем не менее, является успехом.

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

Ответ 4 · рейтинг 2 · Raspin

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

Один совет, который я нашел, но, возможно, не подходит для других, заключался в том, чтобы запускать любые процедуры на сервере, который имеет больше всего данных или выполняет наибольшее количество обновлений/вставок. Например, у меня есть процедура, которая сравнивает две таблицы и вставляет/обновляет из A в B. Если бы я запускал ее на сервере A, это заняло бы во много раз больше времени, чем выполнение процедуры на B. Если у вас нет выбора, где запустить наш код, и вы застряли, скажем, на сервере А, то этот совет может не помочь.

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

Ответ 5 · рейтинг 1 · mattmc3

Я обнаружил, что если вы выполняете внешние соединения (влево/вправо), производительность быстро снижается. Иногда быстрее выбрать данные с удаленного сервера во временную таблицу и проиндексировать ее, чем объединять по сети. В большинстве случаев лучшая стратегия состоит в том, чтобы написать запрос так, как он имеет смысл, а затем настраивать его только в том случае, если производительность является реальной проблемой.

Ответ 6 · Ivan

@George2,

Сэм Саффрон прав в этом случае. Когда соединение выполняется локально, SQL Server использует индексы для выполнения соединения, а затем выполняет поиск столбцов, не включенных в определение индекса.

С подключенным сервером для выполнения соединения необходимо сначала перенести всю таблицу с удаленного сервера, а затем выполнить соединение. Это бутылочное горлышко. Если вы можете предварительно отфильтровать все удаленные таблицы, прежде чем присоединять их к локальным таблицам, это значительно улучшит производительность (например, выберите в #temp таблицы с хорошим фильтром, чтобы уменьшить количество строк), тогда, если вам нужно выполнить несколько операций с этой таблицей, вы лучше сразу создать индекс.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы