У меня есть списки из примерно 20 000 элементов, которые я хочу вставить в таблицу (с ней около 50 000 строк). Большинство из этих элементов обновляют определенные поля в существующих строках, а меньшинство вставляет совершенно новые строки.Оптимизация Sqlite3 для 20 000+ обновлений
Я обращаюсь к базе данных дважды за каждый элемент. Сначала выбирается запрос, который проверяет, существует ли строка. Затем я вставляю или обновляю строку в зависимости от результата запроса select. Я совершаю каждую транзакцию сразу после обновления/вставки.
Для первых нескольких тысяч записей я получаю около 3 или 4 элемента в секунду, затем он начинает замедляться. К концу он занимает больше 1/2 секунды для каждой итерации. Почему это может замедляться?
Мое среднее время: 0,5 секунды для всего прогона, разделенного как .18s на выбор запроса и .31s на вставку/обновление. Последнее 0,01 связано с несколькими неизмеримыми процессами, связанными с анализом данных перед входом в базу данных.
Update
Я комментировал все коммиты как испытание и не получил никаких изменений, так что это не так (любые больше мыслей по оптимальному совершающему бы приветствовать, хотя).
Что касается структуры стола: Каждая строка содержит двадцать столбцов. Первые четыре являются полями TEXT (все они установлены с первой вставкой), а 16 - это REAL-поля, одна из которых вводится с исходной инструкцией insert.
С течением времени «выдающиеся» REAL-поля будут заполнены процессом, который я пытаюсь оптимизировать здесь.
У меня нет явного индекса, хотя одно из полей является уникальным ключом для каждой строки.
Следует отметить, что по мере увеличения базы данных запросы SELECT и UPDATE занимают все больше времени, особенно заметно ухудшая производительность в операции SELECT.
Первоначально я думал, что это может быть какая-то структурная проблема с SQLITE (что бы это ни значило), но не смогли найти никакой документации в любом месте, что предполагает наличие естественных ограничений для программы.
База данных о 60ish megs, сейчас.
Вы можете настроить SQLite, используя «PRAGMAs», вести журнал и т. Д. –
Эти времена «априорно» ужасны, но нам нужно больше контекста, чтобы действительно иметь идею. Можете ли вы опубликовать структуру таблицы, а также образец типичных записей? –
Помогли ли вы вести журнал WAL? –