Каков ваш рекомендуемый способ импорта CSV файлов в Microsoft SQL Server 2008 R2?
Мне бы хотелось что-то быстро, так как у меня есть каталог с большим количеством файлов .csv( > 500 МБ, распространяемых по 500 файлам .csv).
Я использую SQL Server 2008 R2 на Win 7 x64.
Обновление: решение
Вот как я решил проблему в конце:
- Я отказался от попыток использовать LINQ для Entities для выполнения этой задачи. Он работает - но он не поддерживает объемную вставку, поэтому ее примерно в 20 раз медленнее. Возможно, следующая версия LINQ to Entities будет поддерживать это.
- Взял совет, данный в этой теме, использовал объемную вставку.
- Я создал хранимую процедуру T-SQL, которая использует объемную вставку. Данные переходят в промежуточную таблицу, затем нормализуются, а затем копируются в целевые таблицы.
- Я отобразил хранимую процедуру на С#, используя структуру LINQ to Entities (есть видео на www.learnvisualstudio.net, показывающее, как это сделать).
- Я написал весь код для циклического использования файлов и т.д. на С#.
- Этот метод устраняет самое большое узкое место, которое считывает тонны данных с диска и вставляет их в базу данных.
Причина, по которой этот метод чрезвычайно быстрый при чтении CSV файлов? Microsoft SQL Server позволяет импортировать файлы непосредственно с жесткого диска прямо в базу данных, используя свои высоко оптимизированные подпрограммы. Большинство других решений на базе С# требуют гораздо больше кода, а некоторые (например, LINQ to Entities) вынуждены медленно передавать данные в базу данных по ссылке С# -to-SQL-server.
Да, я знаю, что было бы лучше иметь 100% -ный код С# для выполнения задания, но в конце:
- (a) Для этой конкретной проблемы использование T-SQL требует гораздо меньше кода по сравнению с С#, около 1/10, особенно для того, чтобы логика денормализовала данные из промежуточной таблицы. Это проще и удобнее обслуживать.
- (b) Использование T-SQL означает, что вы можете воспользоваться процедурами внутренней вставки вставки, что ускоряет работу с 20-минутного ожидания до 30-секундной паузы.