我有两个非常大的SQLite
表(数百万行内有几何图形)。第一个是不变的(记录不更新等)。第二个更新(可以更新/删除旧记录,可以添加新记录)。
我不时需要使用第二个表来更新第一个表。由于数据量非常大,因此我必须检测第二张表中所做的更改并将其应用到第一张表中。我也无法在RAM中执行此操作,因为表包含几何形状,而且它们可能很重。
实现此目标的可能方法是什么?
最佳答案
简单的解决方案:删除第一个表,然后使用类似的表达式
drop table table1;
create table table1 as select * from table2;
更复杂的解决方案:使用一对移动的“游标”,而不是像Oracle中那样使用数据库游标,而仅使用一些包含表PK值的变量。
将两个光标都设置为两个表中的最低ID。然后,只需遵循简单的规则:
如果表1中的记录存在于表2中并且相同,则跳过并前进两个游标
如果来自表1的记录在表2中存在并且不相同,请更新表1中的记录,并向前移动两个游标
如果来自table1的记录在table2中不存在,则将其删除,使table1光标前进
如果table2中的记录不存在于table1中,则将其插入,前进table2光标
这样,您将获得具有O(1)内存需求的线性O(N)算法(不用考虑DB操作的复杂性)。
关于c# - 更新大型SQLite数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21552185/