2014-02-04 2 views
1

У меня есть две таблицы SQLite, которые действительно огромны (миллионы строк с геометрией внутри). Первый не изменяется (записи не обновляются и т. Д.). Второй обновляется (старые записи могут быть обновлены/удалены, новые могут быть добавлены).Обновление огромных баз данных SQLite

Время от времени мне нужно обновить 1-й стол, используя 2-й. Поскольку это очень большой объем данных, я должен обнаружить изменения, внесенные во вторую таблицу, и применить их к 1-му. Я также не могу сделать это в ОЗУ, потому что таблицы содержат геометрию, и они могут быть довольно тяжелыми.

Каков возможный способ достижения этого?

ответ

1

Простое решение: падение в первой таблице, то используйте выражение как

drop table table1; 
create table table1 as select * from table2; 

Более сложное решение: использовать пару движущихся «курсоры» - не базы данных курсоры, как в Oracle, но только некоторые переменные содержащие значения таблицы PK. Установите оба курсора на самый низкий идентификатор в обеих таблицах. Затем, просто следуйте простым правилам:

  1. Если запись из table1 существует в table2 и то же, пропустить, заранее оба курсора
  2. Если запись из table1 существует в table2 и не то же самое, обновить запись в table1, заранее оба курсора
  3. Если запись из table1 не существует в table2, удалите его, заранее table1 курсор
  4. Если запись из table2 не существует в table1, вставить его, заранее tABLE2 курсор

Таким образом, вы получаете линейный алгоритм O (N) с потребностями памяти O (1) (не учитывая сложность операций с БД).

Смежные вопросы