Производительность связанного сервера и параметры

StackOverflow https://stackoverflow.com/questions/132305

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

Может ли кто-нибудь указать мне на хорошие статьи об использовании связанных серверов?Мне особенно интересно узнать, какие данные передаются между ними, поскольку обычно большая часть оператора sql может выполняться удаленно, но у меня такое ощущение, что это может быть передача полных таблиц, обычно это просто соединение с небольшим финалом. стол локально.

Также какие параметры связанного сервера у меня есть в настоящее время:

  • Совместимость с сортировкой True
  • Доступ к данным правда
  • Rpc Правда
  • Rpc Out True
  • Использовать удаленную сортировку False
  • Имя сопоставления (пусто)
  • Тайм-аут соединения 0
  • Тайм-аут запроса 0

РЕДАКТИРОВАТЬ:

Просто подумал, что обновлю этот пост. Я какое-то время использовал открытые запросы с динамическими параметрами для повышения производительности, спасибо за совет.Однако это может сделать запросы более запутанными, поскольку в конечном итоге вам придется иметь дело со строками.наконец, этим летом мы обновили SQL Server до 2008 года и внедрили зеркальное отображение данных в реальном времени.Честно говоря, скорость открытых запросов приближалась к скорости локальных запросов для моих задач, но зеркалирование определенно облегчило работу с sql.

Это было полезно?

Решение

Я бы посоветовал динамические открытые запросы в цикле курсора вместо связанных соединений.Это единственный способ воспроизвести производительность связанного соединения MS Access (по крайней мере, для отдельных удаленных таблиц)

Обычные связанные соединения в ms sql слишком неэффективны, поскольку все специально помещается в огромные таблицы.

-- Я хотел бы знать, что такого плохого в открытых запросах внутри курсорных циклов?если все сделано правильно, проблем с блокировкой не будет.

Другие советы

Избегайте соединений со связанными серверными таблицами.

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

Пример:

SELECT loc.field1, lnk.field1
FROM MyTable loc
INNER JOIN RemoteServer.Database.Schema.SomeTable lnk
  ON loc.id = lnk.id
  AND lnk.RecordDate = GETDATE()
WHERE loc.SalesDate = GETDATE()

Этот запрос также применяет критерии соединения, которые могут использоваться связанным сервером перед вычислением соединения.

Рекомендуемый метод — использование OPENQUERY.

Избегая соединения с использованием OPENQUERY, локальный сервер отправляет только запрос для удаленного выполнения вместо отправки набора идентификаторов для соединения.

Используйте ссылку, чтобы получить набор данных и выполнить вычисления локально.Либо используйте временную таблицу (для специальных запросов), либо вставьте строку в постоянную таблицу в ночном задании.

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

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

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

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

И ПОЖАЛУЙСТА!Никогда не помещайте OPENQUERY (или любой связанный сервер) внутри цикла!

Когда вы используете связанные серверы для подобных объединений, важно, чтобы сервер, к которому вы сразу подключаетесь («локальный»), был сервером с большей частью данных, тогда как связанный сервер предоставляет лишь небольшую часть данных. , в противном случае да, он извлечет столько данных, сколько необходимо для выполнения соединения.

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

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

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

Королевская боль

Раньше в нашем магазине было несколько связанных серверов, и оказалось, что это такая ПИТА.

Прежде всего, возникли серьезные проблемы с производительностью, подобные тем, которые вы описываете.Я был шокирован, когда увидел статистику сетевого ввода-вывода.Несмотря на все усилия, нам не удалось заставить SQL Server вести себя разумно.

Другая проблема заключалась в том, что в хранимых процедурах имена связанных серверов были жестко закодированы повсюду, и их нельзя было переопределить.Таким образом, разработчики не могли легко протестировать в своих изолированных программных средах любую функциональность, касающуюся связанных серверов.Это было серьезным препятствием для создания универсального набора модульных тестов.

В итоге мы полностью отказались от связанных серверов и перенесли синхронизацию данных на веб-сервисы.

Запросы, включающие полуобъединения на связанном сервере, как правило, не очень эффективны.Возможно, вам лучше использовать ОТКРЫТЫЙ ЗАПРОС для заполнения данных в локальной временной таблице и последующей работы с ними оттуда.

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

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

Отобразить план выполнения и показать предполагаемый план выполнения, как правило, помогали, хотя я не понимал многое из того, на что смотрел.

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

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

Я не знаю ни одной хорошей статьи, на которую можно было бы указать.Когда я писал более сложные приложения SQL Server, я начал думать, что мне нужно лучше понять, как работает SQL Server.С этой целью мы купили серию MS Press Inside Microsoft SQL Server 2005 под редакцией Кален Делани здесь, на работе.Том 1:С Storage Engine определенно стоит начать, но я не зашел так далеко в этом вопросе.Поскольку мои последние несколько проектов не задействовали SQL Server, мое изучение его стало слабым.

Есть ли возможность настроить на сервере отдельную базу данных вместо использования связанного сервера?

Это очень щедрая проблема, у которой может быть множество решений.Но мы были свидетелями того, как многие пользователи говорили, что они попробовали все.

Что решило мою проблему?..

Я обновил sql-сервер 2000 с SP2 до SP4, и если у вас уже есть SP4 на sql-сервере 2000, запустите Instcat.sql.По своему опыту я могу заверить вас, что это наверняка сработает, если вы устали от всех других обходных путей.

Спасибо, mithalesh mithalesh.gupta@gmail.com

Динамический SQL и функция могут использоваться, чтобы обойти жестко запрограммированный вопрос об имени.Например, я пробую реализацию, в которой функция ufn_linkeddatabase (@purpose nvarchar (255)) с вводом 'cpi.cpi' (цель CPI, submpurpose Defaul) возвращает '[server-name.domain.lcl, 2000]. [CPI] 'В производственной среде (где мы используем альтернативный номер порта для SQL Server, я не знаю, почему, в том числе в священном имени сервера).Затем команда SQL собирается в @template varchar (max) с выражением @{cpi.cpi}, представляющим связанный сервер и базу данных, а затем @WorkString = reply (@Template, n'@@cpi.cpi} ',. ..).То, как функция фактически получает имя базы данных, отличается от процедур — таблица поиска удобна.

Проблемы - выполнить OPENQUERY(), что, вероятно, все же лучше, по крайней мере, если для параметра связанного сервера «совместимость по сопоставлению» не установлено «истина», чтобы большая часть задач могла быть выполнена на связанном сервере - важно даже в быстрой сети, и внутренняя сеть нашей серверной достаточно быстра - чтобы выполнить OPENQUERY(), мне, вероятно, придется обрабатывать «cpi.cpi.server», «cpi.cpi.database» и «cpi.cpi.server.database» отдельно.И в конечном итоге я могу написать ровно одно приложение, используя этот дизайн, и в этом случае оно будет переработано.Тем не менее, это означает, что сама функция не должна представлять собой какую-то причудливую работу.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top