Sqlite3 объемная вставка из C?

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

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

Следующая версия запроса ниже,

". import demotab.txt mytable"

Ответы

Ответ 1

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

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

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

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

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

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