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