2017-07-03 82 views
0

使用仅包含特定表中的VARCHAR值的数据库时,如何在更新此类表时提高性能?如何在SQLite上处理仅具有VARCHAR值的数据时提高性能?

我更新这样的表的问题是,当获取新数据时,必须决定是否要INSERTUPDATE这样的行,但是对于至少有1000行以上的大表可以做什么?

如果表格很小,我会发现只需执行SQL查询就可以轻松查找新值是否已存在,并根据结果找到INSERTUPDATE。但是,如果你获得100多条新的数据行,其中一些可能已经或可能不在数据库中,有些可能是全新的,但我担心这么多的查询会花费不必要的时间完成。

可以删除数据库中共享某个值的所有内容,比如说相同的日期,因为新数据可能比单独查询每行更好?

实施例:

 1 2 3 ... 20 
01/01 A1 A2 A3 ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z2 Z3 ... Z20 

更新后:

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 

实施例2:

 1 2 3 ... 20 
01/01 A1   ... A20 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1  Z3 ... Z20 

实施例2更新后:

 1 2 3 ... 20 
01/01 A4 A5 A6 ... A23 
01/02 B1 B2 B3 ... B20 
... 
01/31 Z1 Z5 Z6 ... Z20 
+1

使用'INSERT OR REPLACE'。 – CommonsWare

+1

进一步使用基于事务的操作,因此您不必为插入/替换的每个项目打开/关闭 – tyczj

+0

另一种方法是添加时间戳列,仅返回最后一行(针对每行),无需更新命令,并最终执行一个过程以除去每条记录的最后一个时间戳。 –

回答

0

写入比读取更糟糕(因为数据库在修改表之前也必须读取一些页面),所以您应该避免执行实际上不需要的DELETE或REPLACE。

(替换语句总是删除旧行(如果存在的话)插入新的人之前,所以它是作为DELETE那样糟糕。)

不要紧是否REPLACE语句或您自己的查询搜索对于旧的行,所以如果不需要,可以自己去做,以避免INSERT。

当表正确时indexed的查找速度非常快,即在其值为搜索使用的列上有索引时。

+0

这是我的第一个想法,但我不确定它是否会用我构建的编译语句来处理事务中的所有事情。我发现它已经比使用单独的INSERT更快,但我仍然需要选择是“更新”还是“插入”。 – user1676874

+0

你的问题没有提到已编译的语句或事务。 –

+0

我知道,有人在对另一个答案的评论中提出了建议。我对此抱歉抱歉。 – user1676874

相关问题