Как вставить 800000 записей в таблицу MS Access? - PullRequest
4 голосов
/ 06 февраля 2009

Мне нужно вставить 800000 записей в таблицу MS Access. Я использую Delphi 2007 и компоненты TAdoXxxx. Таблица содержит несколько целочисленных полей, одно поле с плавающей запятой и одно текстовое поле с одним символом. Существует первичный ключ в одном из целочисленных полей (который не является автоинкейном) и два индекса в другом целом числе и поле с плавающей запятой.

Вставка данных с использованием AdoTable.AppendRecord(...) занимает> 10 минут, что недопустимо, поскольку это происходит каждый раз, когда пользователь начинает использовать новую базу данных с программой. Я не могу предварительно заполнить таблицу, поскольку данные поступают из другой базы данных (которая не доступна через ADO).

Мне удалось получить около 1 минуты, записав записи в текстовый файл с разделителями табуляции и используя объект tAdoCommand для выполнения

insert into table (...) select * from [filename.txt] in "c:\somedir" "Text;HDR=Yes"

Но мне не нравятся накладные расходы.

Наверное, должен быть лучший путь.

EDIT:

Некоторая дополнительная информация:

  • MS Access был выбран, потому что он не требует какой-либо дополнительной установки на целевой машине (машинах), и вся база данных содержится в одном файле, который можно легко скопировать.
  • Это однопользовательское приложение.
  • Данные будут вставлены только один раз и не будут изменяться в течение всего срока службы базы данных. Тем не менее, таблица содержит одно дополнительное поле, которое используется в качестве флага для указания того, что соответствующая запись в другой базе данных была обработана пользователем.
  • Одна минута приемлема (до 3 минут тоже будет), и мое решение работает, но оно кажется мне слишком сложным, поэтому я подумал, что должен быть более простой способ сделать это.
  • После того, как данные были вставлены, производительность таблицы довольно хорошая.
  • Когда я начал планировать / реализовывать функцию программы, работающей с базой данных Access, таблица не требовалась. Это стало необходимым позже, когда заказчик запросил другую функцию. (Разве это не всегда так?)

EDIT:

Из всех ответов, которые я получил до сих пор, кажется, что у меня уже есть самый быстрый способ для вставки такого количества данных в таблицу Access. Спасибо всем, я ценю вашу помощь.

Ответы [ 16 ]

0 голосов
/ 14 сентября 2010

HI Лучший способ - это Bulk Insert from txt File, как они сказали Вы должны вставить свои записи в текстовый файл, а затем массово вставить текстовый файл в таблицу это время должно быть меньше 3 секунд.

0 голосов
/ 09 февраля 2009

Как быстро крутится ваш диск? Если это 7200 об / мин, то 800 000 строк за 3 минуты - это еще 37 строк на оборот диска. Я не думаю, что ты будешь делать намного лучше, чем это.

Между тем, если цель состоит в том, чтобы упростить процесс, как на счет ссылки на таблицу?

Вы говорите, что не можете получить доступ к исходной базе данных через ADO. Можете ли вы настроить привязку таблицы в MS Access к таблице или представлению в исходной базе данных? Затем простой запрос на добавление из ссылки на таблицу скопирует данные из исходной базы данных в целевую базу данных для вас. Я не уверен, но я думаю, что это будет довольно быстро.

Если вы не можете установить ссылку на таблицу до времени выполнения, возможно, вы могли бы построить ссылку на таблицу программно с помощью ADO, затем построить запрос на добавление программно, а затем вызвать запрос на добавление.

0 голосов
/ 07 февраля 2009

Насколько 800 000 записей изменяются от одного создания к другому? Можно ли было предварительно заполнить записи, а затем просто обновить те, которые изменились во внешней базе данных при создании новой базы данных?

Это может позволить вам быстрее создать новый файл базы данных.

0 голосов
/ 07 февраля 2009

Если это исходит от dbase, можете ли вы просто скопировать данные и индексные файлы и прикрепить напрямую без загрузки? Должно быть довольно эффективным (от людей, которые приносят вам FoxPro.) Я думаю, что он будет использовать и существующие индексы.

По крайней мере, это должен быть довольно эффективный импорт с одной командой.

0 голосов
/ 07 февраля 2009

Также проверьте, сколько времени занимает копирование файла. Это будет нижняя граница того, как быстро вы можете записывать данные. В db, как в SQL, обычно требуется утилита массовой загрузки, чтобы приблизиться к этой скорости. Насколько я знаю, MS никогда не создавала инструмент для прямой записи в таблицы MS Access, как это делает bcp. Специализированные инструменты ETL также оптимизируют некоторые этапы, связанные со вставкой, такие как способ, которым SSIS выполняет преобразования в памяти, DTS также имеет некоторые оптимизации.

0 голосов
/ 06 февраля 2009

Возможно, вы могли бы открыть набор записей ADO для таблицы с режимом блокировки adLockBatchOptimistic и CursorLocation adUseClient, записать все данные в набор записей и выполнить пакетное обновление (rs.UpdateBatch).

...