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 ГБ).

Спасибо за все внимание!

РЕДАКТИРОВАТЬ: Что касается комментария от Дэвида Стейна, это правда! Вы не можете легко испортить вашу базу данных с этими опциями. В моем случае это была очень заменяемая база данных с возможностью восстановления, не содержащая конфиденциальных данных. Я перестраивал его в любое время, когда хотел, и был единственным его пользователем. Так что мне нужно это было невероятно быстро! Может быть, это не ваша ситуация.

Другие вопросы по тегам