c# - 更新大型SQLite数据库

标签 c# sql sqlite

我有两个非常大的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/

相关文章:

php - 将多个产品添加到一个购物车中

sqlite - 如何从配置文件获取路径

c# - 游戏循环内的 Monogame XAML 读出文本框

sql - 使用带或不带关键字 AS 的列别名更好吗?

C# 序列化对象集合

sql - 如何在 Visual Studio 中使用 SSDT 重命名表

android - 安卓应用数据库

java - 如何将我的第一行和后续行插入到我的 Android 项目数据库中

c# 多个类在单独的文件中?

c# - 如何在 UWP/RT XAML 中声明系统数据类型?