Самый быстрый способ вставить в SQLite, используя C API? - PullRequest
2 голосов
/ 01 декабря 2009

Я хочу сделать как можно больше вставок (скажем, несколько миллионов) в базу данных. Поскольку я звоню из C, я подумал, что для этого может быть ярлык в API. Я не могу не чувствовать, что создание строк из данных и SQLite анализируют строки, все в одном вызове, менее эффективно, чем могло бы быть.

Есть ли способ вставить данные без необходимости создания строк SQL? Готовые заявления - единственный путь?

Я ищу специфичные для C способы вставки данных наиболее эффективным способом, а не общие советы по базе данных

Ответы [ 3 ]

6 голосов
/ 01 декабря 2009

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

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

4 голосов
/ 01 декабря 2009

ИНДЕКС КАПЛИ, ВСТАВКА, ИНДЕКС ДОБАВЛЕНИЯ / ПЕРЕЗАГРУЗКИ

Еще один общий метод SQL для больших вставок - удалить индекс, вставить записи x000 и затем перестроить индекс. Если у вас есть достаточно записей, вы можете найти это значительно быстрее. Вам может потребоваться сравнить это с вашей базой данных, чтобы выяснить, является ли это быстрым для вашей настройки.

2 голосов
/ 07 декабря 2009

Можно достичь более 90 000 операций вставки в секунду с SQLite и C (это число уменьшается примерно до 60 000 операций вставки в секунду, если у вас есть индекс). Вы должны:

  • Использовать одну транзакцию
  • Использовать подготовленные операторы и методы связывания
  • Поместить журнал отката в память (если можете)
  • Удалить индекс и переиндексировать после вставки данных
  • Прочтите этот вопрос SO для более подробной информации: «Как улучшить производительность SQLite?» *

    * Бесстыдный плагин: у меня было много таких же вопросов производительности, когда я начал использовать SQLite - поэтому я попытался создать тщательную запись вики (с реальными тестами и реальным кодом C) на основе моего опыта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...