Массовая вставка sqlite3 из C?

Я наткнулся на команду .import для этого (массовая вставка), но есть ли версия запроса, которую я могу выполнить с помощью sqlite3_exec().

Я просто хотел бы скопировать содержимое небольшого текстового файла в таблицу.

Версия запроса этого ниже,

".import demotab.txt mytable"


person Community    schedule 31.08.2009    source источник


Ответы (1)


Производительность Sqlite не улучшается при массовой вставке. Простое выполнение вставок по отдельности (но в рамках одной транзакции!) обеспечивает очень хорошую производительность.

Вы можете извлечь выгоду из увеличения размера кеша страницы sqlite; это зависит от количества индексов и/или порядка вставки данных. Если у вас нет индексов, для чистой вставки размер кеша, скорее всего, не имеет большого значения.

Обязательно используйте подготовленный запрос, а не перегенерируйте план запроса в самом внутреннем цикле. Чрезвычайно важно заключать операторы в транзакцию, поскольку это избавляет файловую систему от необходимости синхронизировать базу данных с диском — в конце концов, частично записанная транзакция в любом случае прерывается атомарно, а это означает, что все fsync() откладываются до завершения транзакции. .

Наконец, индексы будут ограничивать производительность вставки, поскольку их создание требует больших затрат. Если вы действительно имеете дело с большим количеством данных и начинаете с пустой таблицы, может быть полезно добавить индексы после данных, хотя это не является важным фактором.

О, и вы, возможно, захотите получить один из этих твердотельных накопителей Intel X25-E и убедиться, что у вас есть контроллер AHCI ;-).

Я поддерживаю приложение с sqlite db с примерно 500000000 строк (распределенных по нескольким таблицам), большая часть которых была вставлена ​​​​с использованием простого старого begin-insert-commit: он отлично работает.

person Eamon Nerbonne    schedule 31.08.2009