Это продолжение моего первого вопроса «Перенос экспорта «SQL» в T-SQL».
Я работаю со сторонней программой, которую не могу контролировать и не могу изменить. Эта программа экспортирует свою внутреннюю базу данных в набор из .sql
каждого в формате:
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField], [BinaryField])
VALUES
(1 , 'Some Text' , 0x123456),
(2 , 'B' , NULL),
--(SNIP, it does this for 1000 records)
(999, 'E' , null);
(1000 , 'F' , null);
INSERT INTO [ExampleDB] ( [IntField] , [VarcharField] , BinaryField)
VALUES
(1001 , 'asdg', null),
(1002 , 'asdf' , 0xdeadbeef),
(1003 , 'dfghdfhg' , null),
(1004 , 'sfdhsdhdshd' , null),
--(SNIP 1000 more lines)
Этот шаблон продолжается до тех пор, пока файл .sql
не достигнет размера файла, установленного во время экспорта, файлы экспорта группируются по EXPORT_PATH\%Table_Name%\Export#.sql
, где # — это счетчик, начинающийся с 1.
В настоящее время у меня около 1,3 ГБ данных, и я экспортирую их фрагментами по 1 МБ (1407 файлов в 26 таблицах, во всех таблицах, кроме 5, есть только один файл, в самой большой таблице 207 файлов).
Прямо сейчас у меня есть простая программа на C#, которая считывает каждый файл в оперативную память, а затем вызывает ExecuteNonQuery. Проблема в том, что я усредняю 60 секунд на файл, что означает, что для всего экспорта потребуется около 23 часов.
Я предполагаю, что если бы я каким-то образом мог отформатировать файлы для загрузки с помощью BULK INSERT вместо INSERT INTO, это могло бы работать намного быстрее. Есть ли какой-нибудь простой способ сделать это или мне нужно написать что-то вроде «Найти и заменить» и держать пальцы скрещенными, чтобы он не вышел из строя в каком-то крайнем случае и не взорвал мои данные.
Любые другие предложения о том, как ускорить вставку, также будут оценены.
ОБНОВЛЕНИЕ:
В итоге я выбрал анализ и метод SqlBulkCopy. Пошло от 1 файла/мин. до 1 файла/сек.
INSERT INTO
, но… то есть убедитесь, что проблема вызвана тем, что сначала не используется TDS. Может быть, проще всего сначала взять данные и преобразовать их в CSV, поскольку большинство инструментов (включая массовые данные/слияние) понимают CSV. Также убедитесь, что выбранный кластер не является глупым и не перегружает ввод-вывод при вставках. - person   schedule 04.04.2012INSERT INTO
на 1000 строк, как если вы попытаетесь вставить больше, чем это, вы получите ошибкуThe number of row value expressions in the INSERT statement exceeds the maximum allowed number of 1000 row values.
. Мой конкретный вопрос: Есть ли простой способ конвертировать в CSV или мне нужно написать что-то вроде «Найти и заменить» и держать пальцы скрещенными, чтобы он не дал сбой в каком-то крайнем случае и не взорвал мои данные. я>. - person Scott Chamberlain   schedule 04.04.2012'
и заканчивается знаком'
not, за которым следует другим'
). Написание должно занять около 10 минут. - person   schedule 04.04.2012