![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
IrinaLive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.2.2013 Репутация: нет Всего: нет |
Здравствуйте, подскажите, пожалуйста, может кто сталкивался...
У меня есть БД на сервере, мне необходимо некоторые данные из таблиц (не полностью таблицы, а отдельные столбцы) копировать в БД на другом сервере (оба сервера MS SQL 2008), причем объем БД источника большой, в некоторых таблицах миллионы записей. Выполнение подобного с помощью Insert...SELECT происходит в течении 30-40 мин. Каким образом можно это сделать эффективно, чтобы не так долго копировалось? Я пишу приложение на C# и с помощью него вызываю хранимую процедуру...может быть можно сделать копирование как-то с помощью приложения? |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Для начала попробуйте на целевом сервере с таблиц назначения убрать все связи, индексы и прочие наслоения. Именно они могут тормозить загрузку, воссоздадите потом.
Попробуйте создать на исходном сервере новую БД, выполнить локальное копирование в неё только нужных данных, потом отсоединить её, перенести файл на целевой сервер, там присоединить и забрать из него данные. При этом версии серверов, само собой, должны полностью совпадать. Попробуйте (особенно если версии не совпадают) выгрузить нужные данные на исходном сервере в XML, перенести файл на целевой сервер и там загрузить. Кстати, а почему время столь велико? точно из-за объёма? не из-за скорости передачи, блокировок и прочего... потому как если проблема исключительно в объёмах - вовсе не факт, что удастся ускорить процесс. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
IrinaLive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.2.2013 Репутация: нет Всего: нет |
Честно, это мои предположения, что из-за объема, хотя вполне возможно, что не оптимизирована хранимая процедура, я не сильна в T-SQL. Просто изначально стоит задача сделать возможным вызов обновления моей БД данными из другой БД (которая на другом сервере), вот я попыталась с помощью вызова хранимой процедуры, но пока это выполняется очень долго |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Показывайте DDL обновляемых таблиц и код процедуры (лишнее можно поскипать). Потому как по опыту - получение данных по быстрой сети с другого сервера через OPENDATASOURCE выполняется достаточно быстро, особенно если на время обновления поотрубать индексы, констрейнты, триггеры и прочую грязь. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
IrinaLive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.2.2013 Репутация: нет Всего: нет |
Вот так примерно я пытаюсь делать...не думаю, что это правильно, но я, так сказать, только учусь)
Я убрала таблицы, которые небольшого объема, но обновляю их по аналогии Это сообщение отредактировал(а) IrinaLive - 29.3.2013, 15:04 Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
Akina |
|
||||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Берём первую пачку запросов (для одной таблицы):
Вы выполняете целых ТРИ запроса для переноса данных - апдейт совпадающих, добавление недостающих, удаление лишних, со связываниями, выборками, проверками... когда достаточно было вульгарного
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
IrinaLive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.2.2013 Репутация: нет Всего: нет |
Спасибо, я убрала связи и магическим образом время сократилось до пяти минут, определенно лучше 30 мин)
Делала так, потому что предполагала, что первый раз (когда БД еще пуста) будет выполняться вставка, а в дальнейшем, при повторном вызове хр. процедуры, уже будет выполняться обновление |
|||
|
||||
IrinaLive |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 28.2.2013 Репутация: нет Всего: нет |
Хотела еще поинтересоваться, как вы считаете, может быть подобное обновление лучше выполнять с помощью BULK INSERT (или еще как-нибудь) или средствами приложения, а не хранимой процедурой?
|
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 25 Всего: 454 |
Попробуйте. Но полагаю, лучше не станет.
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |