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

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

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

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


person George2    schedule 08.08.2009    source источник


Ответы (6)


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

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

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

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

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

person Sam Saffron    schedule 08.08.2009
comment
1. База данных должна будет переносить все результаты в основную базу данных и поддерживать целостность транзакций на основной базе данных. Я думаю, что SQL Server должен поддерживать целостность данных для обоих серверов, почему вы просто упомянули здесь основной сервер базы данных? 2. Если я просто выполняю некоторые запросы/вставки с/на удаленный сервер связанной базы данных, могу ли я понять это простым способом -- единственная разница между локальным объектом и объектом на связанном сервере заключается в том, что нам нужна сетевая связь, кроме доступа к локальной памяти для объекты доступа, для прочего, почти одинаковы? - person George2; 08.08.2009
comment
Как упоминалось в постере, связанные серверы могут передавать только данные, но не индексы. По сути, если вы соединяете локальную таблицу с таблицей на удаленном сервере, например, это будет так, как если бы индексы на удаленном сервере не существовали. В зависимости от вашего запроса это может привести к снижению производительности, которое намного превосходит все остальные соображения. - person Nimrand; 06.05.2013

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

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

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

person Mitch Wheat    schedule 08.08.2009
comment
Спасибо, Митч, могу ли я таким образом понять, что единственная разница между локальным объектом и объектом на связанном сервере заключается в том, что нам нужна сетевая связь, отличная от доступа к локальной памяти, для доступа к объектам, для других вещей почти то же самое? - person George2; 08.08.2009
comment
Кстати: как насчет вашего ответа на мой вопрос здесь, Митч гуру? :-) stackoverflow .com/questions/1248450/ Я разместил свой последний вопрос в комментариях к вашему ответу. - person George2; 08.08.2009

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

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

person Eric    schedule 08.08.2009
comment
Спасибо, Эрик, 1. но не понимаю, зачем передавать результаты по сети дважды -- зачем передавать дважды? Например, если я выбираю из таблицы на связанном сервере, я думаю, что просто нужно перенести записи со связанного сервера на мой сервер. Так что только один раз, а не два. 2. нужно разрешить имя и войти в систему - только один раз или каждый раз, когда мы общаемся со связанным сервером? - person George2; 08.08.2009
comment
@George: Предполагая, что вы не выполняете запросы на сервере, вам нужно передать результаты со связанного сервера на ваш сервер (один!), а затем с вашего сервера на машину (два!). С какой стороны ни посмотри, это дополнительный прыжок. Что касается соединения, то да, оно держится, но иногда многие люди подключаются к связанному серверу, что может привести к снижению производительности. Вот почему я упомянул об этом, но только как небольшой хит. - person Eric; 08.08.2009
comment
Спасибо Эрик, 1. к вашему серверу -- сервер означает сервер базы данных, который связывает другой сервер базы данных? сервер к машине - машина означает клиента, который вызывает службы с сервера базы данных? 2. Что касается связи, то да, она держится -- можно по-другому, пожалуйста? палка значит? Извините, английский не мой родной язык. :-) - person George2; 08.08.2009
comment
@George: 1: Ты прав. 2: Упорствовать, оставаться, оставаться постоянным. Сеанс одинаков для каждого пользователя, так что им нужно подключиться только один раз. - person Eric; 08.08.2009
comment
Спасибо, Эрик. Если я просто выполняю некоторые запросы/вставки с/на удаленный связанный сервер базы данных, могу ли я понять это простым способом -- единственная разница между локальным объектом и объектом на связанном сервере заключается в том, что нам нужна сетевая связь, отличная от доступа к локальной памяти для доступа к объектам, для прочего, почти то же самое? - person George2; 08.08.2009

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

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

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

person Raspin    schedule 28.08.2009

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

person mattmc3    schedule 17.10.2009

@George2,

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

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

person Ivan    schedule 19.10.2011