Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Быстрый способ загрузки данных в MS SQL


Автор: amarenkov 27.7.2009, 11:04
Добрый день.

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

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

Заранее спасибо smile.

Автор: Gluttton 27.7.2009, 13:08
http://msdn.microsoft.com/ru-ru/library/ms175915.aspx.

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

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


Выхухоль, нет, надо из приложения программными средствами smile.

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

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

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

Автор: Gluttton 27.7.2009, 15:58
Цитата

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


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

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

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

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

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

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

Автор: jonie 29.7.2009, 18:20
Цитата
Множество инсёртов - в любом случае неоптимально.

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

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

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

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

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

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)