Sqlite3 медленное ОБНОВЛЕНИЕ
У меня есть этот огромный (8 ГБ /14126762 строк) с двумя таблицами, table1 (очень большой) и table2 (намного меньше), на котором мне нужно уменьшить значение из table1 с помощью таблицы2 vakyes.
Хотя я провел несколько тестов, используя меньшую базу данных (5 МБ), все было хорошо. Но теперь, когда я использую его в большей базе данных, это занимает вечность, и я не знаю, работает ли это вообще.
Например, создание базы данных с помощью команды INSERT занимает 12 минут.
Проблемная транзакция заключается в следующем:
UPDATE table1
SET vl_empenho = vl_empenho -
(SELECT vl_estorno
FROM table2 WHERE table1.cd_ugestora =
table2.cd_ugestora AND table1.dt_ano =
table2.dt_ano AND table1.nu_empenho =
table2.nu_empenho)
WHERE cd_ugestora IN (SELECT table2.cd_ugestora FROM
table2 WHERE table1.dt_ano =
table2.dt_ano AND table1.nu_empenho =
table2.nu_empenho);
Я не разбираюсь в Sqlite, и транзакция дала то, что я хотел, но я не знаю, является ли она излишней.
Спасибо за любую помощь!
1 ответ
После прочтения комментариев и других вопросов, связанных со стековым потоком, я сделал индекс для каждого столбца в запросе, а также установил:
PRAGMA synchronize = OFF;
PRAGMA jorunal_mode = MEMORY;
После этого мне потребовалось около 20 минут, чтобы выполнить вышеуказанное ОБНОВЛЕНИЕ, и 6 минут для команды INSERT, что я считаю подходящим, учитывая размер файла (на самом деле 10 ГБ).
Спасибо за все внимание!
РЕДАКТИРОВАТЬ: Что касается комментария от Дэвида Стейна, это правда! Вы не можете легко испортить вашу базу данных с этими опциями. В моем случае это была очень заменяемая база данных с возможностью восстановления, не содержащая конфиденциальных данных. Я перестраивал его в любое время, когда хотел, и был единственным его пользователем. Так что мне нужно это было невероятно быстро! Может быть, это не ваша ситуация.