Повысить производительность при удалении / вставке на удаленном сервере. - PullRequest
0 голосов
/ 17 сентября 2009

В этом сценарии есть два сервера базы данных: один находится в нашей локальной сети (сервер A), а другой - в нашем удаленном местоположении (сервер B).

Мы хотим перенести данные наших проектов с Сервера A на Сервер B. Для этого мы сначала удаляем существующие данные на Сервере B для определенного ProjectID, а затем просто вставляем данные с Сервера A на Сервер B. Все данные готовятся на сервере А.

Фактический объем передаваемых данных составляет приблизительно 2,5 МБ. С нашим 20MBit соединением это должно быть сделано в одно мгновение. Однако с SQL это занимает 30-40 секунд. На самом деле, если вы возьмете тот же объем данных и передадите его по FTP, это займет 4 секунды. :)

У меня установлено SET NO COUNT. Я читал, что это может сделать удаленные запросы быстрее.
Что может быть причиной такой медленной передачи?

EDIT:
SQL действительно должен быть причиной. Он ломается так:
- Выберите данные из всех видов баз данных и вставьте их в базу данных на сервере A
- Удалить с сервера БД, где ProjectID = x
- Вставить в БД сервера B - Выбрать * на БД сервера A, где ProjectID = x

Последние два шага занимают около 40 секунд. И, как вы можете видеть, все, что я делаю, это удаляю старые записи и вставляю новые. Нет соединений или сложный синтаксис t-sql.

Ответы [ 4 ]

1 голос
/ 17 сентября 2009

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

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

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

0 голосов
/ 17 сентября 2009

Вы проверили таблицу на сервере b, чтобы увидеть, есть ли у вас какие-либо триггеры? Perhpas они вызывают замедление.

0 голосов
/ 17 сентября 2009

Вы также можете использовать mysqldump:

mysqldump --complete-insert --create-options --add-locks --disable-keys --extended-insert --quick --quote-names -u $ user --password = $ password $ database | gzip --fast -c> {$ backupPath} / $ database. $ dateStr.sql.gz

Затем перенесите gzipped dump по сети и загрузите его обратно в новую базу данных.

0 голосов
/ 17 сентября 2009

Ты выбрать из A, вставить в B, удалить из A?

Вы можете просто выберите из A, вставьте в B и когда вы закончите, вы можете удалить

также вы можете использовать массовые операции (выбрать несколько идентификаторов ProjectID) и вставить их на другой сервер.

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

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

наконец, многопоточный или многопоточный процесс может дать вам некоторое преимущество (выберите сервер A при установке на сервер B).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...