组合数据库:识别常见记录 - 最有效的方式

时间:2016-10-07 09:43:12

标签: python database performance sqlite

我有一组20个sqlite数据库(每个50个表,每个数据库总共大约10万个记录)。 我想将这20个数据库组合成一个主数据库。 这个概念是有一个额外的列,它指示记录适用于哪个域。

例如:

表A

FRUIT | COLOR  | SHAPE
----------------------
apple | red    | round 
banana| yellow | curved

表B

FRUIT | COLOR  | SHAPE
----------------------
apple | red    | round 
banana| yellow | curved

表C

FRUIT | COLOR  | SHAPE
----------------------
apple | red    | round 
banana| blue   | straight

这些表(A,B和C)将组合成一个主表:

主表

FRUIT | COLOR  | SHAPE   | DOMAIN
---------------------------------
apple | red    | round   | 0b111
banana| yellow | curved  | 0b110
banana| blue   | straight| 0b001

我有文本文件格式的数据库(即标签分隔列表)。我使用Python将它们导入我的sqlite DB。 我如何最有效地进行此合并过程?

我有两个想法:

  1. 将第一个数据库导入主数据库。导入下一个DB时,请检查是否存在完整记录。如果是,请在适用性列上运行SQL UPDATE查询。如果没有,请使用INSERT创建新记录。

  2. 对于每种类型的表,加载python中的20个域表中的每一个,并查看每个域或子集上是否存在记录。然后将具有适用性的记录导入主数据库。

  3. 我想知道是否有一种有效的方法来执行这些操作。由于每个数据库的大小以及必须多次执行此导入的要求,我需要尽可能加快进程。

1 个答案:

答案 0 :(得分:0)

为每个记录*域进行单独选择和更新比在内存中合并记录要慢。

将20个表加载到内存中。在内存中创建完整的记录列表。批量插入DB。

合并的速度效率可能是这样的:

将(键,值) - >(域代码,现在为null)加载到一个集合中,并将key->值单独加载到域表字典中。

然后通过(key,value)设置,在每个域字典中查找值并在主字典中形成域代码。

然后浏览上一步的结果并执行批量插入,每1000条记录提交一次。