Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Копирование бол. объем данных из одной БД в другую 
:(
    Опции темы
IrinaLive
Дата 29.3.2013, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.2.2013

Репутация: нет
Всего: нет



Здравствуйте, подскажите, пожалуйста, может кто сталкивался...

У меня есть БД на сервере, мне необходимо некоторые данные из таблиц (не полностью таблицы, а отдельные столбцы) копировать в БД на другом сервере (оба сервера MS SQL 2008), причем объем БД источника большой, в некоторых таблицах миллионы записей. Выполнение подобного с помощью Insert...SELECT происходит в течении 30-40 мин. 

Каким образом можно это сделать эффективно, чтобы не так долго копировалось?

Я пишу приложение на C# и с помощью него вызываю хранимую процедуру...может быть можно сделать копирование как-то с помощью приложения?
PM MAIL   Вверх
Akina
Дата 29.3.2013, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



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

Попробуйте создать на исходном сервере новую БД, выполнить локальное копирование в неё только нужных данных, потом отсоединить её, перенести файл на целевой сервер, там присоединить и забрать из него данные. При этом версии серверов, само собой, должны полностью совпадать.

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

Кстати, а почему время столь велико? точно из-за объёма? не из-за скорости передачи, блокировок и прочего... потому как если проблема исключительно в объёмах - вовсе не факт, что удастся ускорить процесс.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
IrinaLive
Дата 29.3.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.2.2013

Репутация: нет
Всего: нет



Цитата

Кстати, а почему время столь велико? точно из-за объёма? не из-за скорости передачи, блокировок и прочего... потому как если проблема исключительно в объёмах - вовсе не факт, что удастся ускорить процесс.


Честно, это мои предположения, что из-за объема, хотя вполне возможно, что не оптимизирована хранимая процедура, я не сильна в T-SQL.

Просто изначально стоит задача сделать возможным вызов обновления моей БД данными из другой БД (которая на другом сервере), вот я попыталась с помощью вызова хранимой процедуры, но пока это выполняется очень долго
PM MAIL   Вверх
Akina
Дата 29.3.2013, 13:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Цитата(IrinaLive @  29.3.2013,  14:31 Найти цитируемый пост)
стоит задача сделать возможным вызов обновления моей БД данными из другой БД (которая на другом сервере)

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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
IrinaLive
Дата 29.3.2013, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.2.2013

Репутация: нет
Всего: нет



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

Я убрала таблицы, которые небольшого объема, но обновляю их по аналогии

Это сообщение отредактировал(а) IrinaLive - 29.3.2013, 15:04

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  script.sql 16,26 Kb
PM MAIL   Вверх
Akina
Дата 29.3.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Берём первую пачку запросов (для одной таблицы):

Код

UPDATE
  t2 
SET
  t2.GoodsId = t1.GoodsId
, t2.KindId = t1.KindId
, t2.GroupId = t1.GroupId
, t2.SubGroupId = t1.SubGroupId
, t2.Name = t1.Name
, t2.Price = t1.Price
, t2.ManufactureId = t1.ManufactureId
, t2.BrandId = t1.BrandId
, t2.CountryId = t1.CountryId
FROM ' + @ServDB2 + '.dbo.Goods_Com as t2
INNER JOIN [USER-ПК].TRADINGBASE.dbo.Goods_Com as t1
ON t2.GoodsId = t1.GoodsId;

INSERT ' + @ServDB2 + '.dbo.Goods_Com 
  (
    GoodsId
  , KindId
  , GroupId
  , SubGroupId
  , Name
  , Price
  , ManufactureId
  , BrandId
  , CountryId
  )
SELECT
  GoodsId
, KindId
, GroupId
, SubGroupId
, Name
, Price
, ManufactureId
, BrandId
, CountryId
FROM [USER-ПК].TRADINGBASE.dbo.Goods_Com AS t1
WHERE NOT EXISTS 
  (
    SELECT 1 
    FROM ' + @ServDB2 + '.dbo.Goods_Com WHERE  
    GoodsId = t1.GoodsId
  );

DELETE t2
FROM ' + @ServDB2 + '.dbo.Goods_Com AS t2
LEFT OUTER JOIN [USER-ПК].TRADINGBASE.dbo.Goods_Com AS t1
ON t2.GoodsId = t1.GoodsId
WHERE t1.GoodsId IS NULL;


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

Код

TRUNCATE TABLE @ServDB2.dbo.Goods_Com;
INSERT @ServDB2.dbo.Goods_Com (набор_полей) SELECT набор_полей FROM [USER-ПК].TRADINGBASE.dbo.Goods_Com;





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
IrinaLive
Дата 29.3.2013, 16:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.2.2013

Репутация: нет
Всего: нет



Спасибо, я убрала связи и магическим образом время сократилось до пяти минут, определенно лучше 30 мин)

Цитата

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


Делала так, потому что предполагала, что первый раз (когда БД еще пуста) будет выполняться вставка, а в дальнейшем, при повторном вызове хр. процедуры, уже будет выполняться обновление
PM MAIL   Вверх
IrinaLive
Дата 31.3.2013, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 28.2.2013

Репутация: нет
Всего: нет



Хотела еще поинтересоваться, как вы считаете, может быть подобное обновление лучше выполнять  с помощью BULK INSERT (или еще как-нибудь) или средствами приложения, а не хранимой процедурой?
PM MAIL   Вверх
Akina
Дата 31.3.2013, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 454



Попробуйте. Но полагаю, лучше не станет.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0864 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.