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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Быстрый способ загрузки данных в MS SQL, Из произвольного источника 
:(
    Опции темы
amarenkov
Дата 27.7.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



Добрый день.

Необходимо загрузить много данных из какого-либо источника (в данном случае это XML, но не принципиально) на сервер MS SQL Server 2008 из C#.

Каким образом это можно сделать максимально быстро? При помощи SqlConnection, SqlCommand? Есть ли какие-то хитрости (пакетная засылка данных, буффер, еще что-то)?

Заранее спасибо smile.
PM MAIL ICQ   Вверх
Gluttton
Дата 27.7.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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





--------------------
Слава Україні!
PM MAIL   Вверх
Выхухоль
Дата 27.7.2009, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 85
Регистрация: 9.10.2008
Где: Ташкент

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



Если это xml, то это вообще можно сделать при помощи MSSQL сервера, без других программных средств.

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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



Gluttton, насколько я понял, это работает для файлов разных форматов. Мне же нужен метод записи данных на сервер из приложения. Причем создавать файлы доступные с сервера я не могу. Вообщем, я имел в виду, как программно я могу максимально быстро это сделать.


Выхухоль, нет, надо из приложения программными средствами smile.
PM MAIL ICQ   Вверх
Gluttton
Дата 27.7.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



А каких объемах данных (количество записей), с какой частотой и каким количеством пользователей идет речь?


--------------------
Слава Україні!
PM MAIL   Вверх
amarenkov
Дата 27.7.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



Объем данных: примерно по 600 000 тыс. записей в 5 таблицах.
Частота: редко.
Пользователей: такую операцию осуществляет один пользователь.

Проблема в том, что сейчас я использовал Entity Framework. Потребление памяти росло с огромной скоростью, производительность с той же скоростью падало (возможно, я что-то не так делал). Вот я и задался вопросом, как это можно сделать оптимально?
PM MAIL ICQ   Вверх
Gluttton
Дата 27.7.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

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



Цитата

Проблема в том, что сейчас я использовал Entity Framework. Потребление памяти росло с огромной скоростью, производительность с той же скоростью падало (возможно, я что-то не так делал). Вот я и задался вопросом, как это можно сделать оптимально?


Непосредсвенно с Entity Framework работать не приходилось, но проводя аналогию может "подлечить" периодический COMMIT, в данном контексте это может быть закрытие и повторное октрытие соединения через каждые например 10 000 записей (а может и 1 000). Но это уже так сказать эксперименты smile , я не уверен в том что это поможет smile ...

Хотя с другой стороны, если бы это помогало, наверное об этом бы пИсали smile ...

А индексы в БД есть? Может их нужно перед началом вставки блока данных удалять, а потом (после завершения операции вставки) по новой создавать?

Это сообщение отредактировал(а) Gluttton - 27.7.2009, 16:03


--------------------
Слава Україні!
PM MAIL   Вверх
Любитель
Дата 27.7.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Наиболее оптимально - либо OPENROWSET (с ADO=шными провайдерами), либо сериализовать данные в XML и распарсерить на стороне сервера. Множество инсёртов - в любом случае неоптимально.

Добавлено через 1 минуту и 32 секунды
Цитата(Gluttton @  27.7.2009,  15:58 Найти цитируемый пост)
А индексы в БД есть? Может их нужно перед началом вставки блока данных удалять, а потом (после завершения операции вставки) по новой создавать?

Сурово... Только это займёт больше времени smile 


--------------------
PM MAIL ICQ Skype   Вверх
jonie
Дата 29.7.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



Цитата
Множество инсёртов - в любом случае неоптимально.

один запрос позволяет сделать несколько инсертов. Даже без "два раза insert" например:
Код

insert into t (field)
select 1
union all
select 2
....

ну и два инсерта подряд тоже вполне себе работают за один "ExecuteNonQuery".

ну и вообще про bulk insert почитать стоит все же.

Добавлено через 2 минуты и 23 секунды
Цитата
А индексы в БД есть? Может их нужно перед началом вставки блока данных удалять, а потом (после завершения операции вставки) по новой создавать?

их можно отключить вроде, а потом DBCC reindex table ну или конкретный индекс реиндексировать... впрочем таже фигня что и банальное пересоздание. Можно эту операцию сделать job-ом и запускать его (правда таблица будет залочена).


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Любитель
Дата 29.7.2009, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Цитата(jonie @  29.7.2009,  18:20 Найти цитируемый пост)
Даже без "два раза insert" например:

Получим строковое формирование SQL-а. Что не есть хорошо (по крайней мере в данном случае).


--------------------
PM MAIL ICQ Skype   Вверх
jonie
Дата 29.7.2009, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



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


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Любитель
Дата 29.7.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

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



Эээ.. Речь о том, чтобы отсылать один и тот же SQL всегда (скорее даже просто вызов нужной хранимки).


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

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

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


 




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


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

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