2017-01-30 105 views
1

我有两个表在结构上相同的,每个大约10K行:SQLite的提高查询效率

db1.people   db2.people 
*************** *************** 
name | number name | number 
--------------- --------------- 
mike |   bob | 
john |   Kev | 45 
mark |   mark | 16 
*************** *************** 

我的目标是找同一个人在两个表中,并从DB2复制值DB1 。它采取了一些黑客攻击,但我认为我有这样的工作:

UPDATE people SET number = (SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name); 

而且,它的工作,但它非常重。我认为它做以下几点:

  • 经过在db1.people.names所有10K名
  • 发现在db2.people.names同名
  • 如果db2.people.number填充它把将值转换为main.people.number

该捕获仅在db2中的10k行中有大约200个。人们用一个数字填充。

这就是我脱离我的联盟;我如何限制上述查询只打扰运行在db2.people.number中具有相应数值的名称?

这应该带给我的10K^10K到200^10K

感谢,

+0

是否有某种方式把一个UPDATE子查询在SELECT语句的WHERE db2.people号> 0?与我目前的声明相反:通过db2.people.number,并且只有在db2.people.number被填充时才查看db1.people.name? – apeg

回答

1

由于SQLite不支持更新连接语法,你可能会坚持当前的做法涉及相关子查询。话虽如此,如果您在其两列上添加索引到db2.people表,它可能会显着加快更新速度。如果您在namenumber上添加索引,那么在更新过程中,这可以为db1.people中的每一行提供更快的查找时间。

1

我读SQLite支持的存在条款

UPDATE people 
SET number = 
(SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name) 
where exists 
(SELECT number FROM db2.people WHERE number > 0 AND name = main.people.name); 
+0

感谢Danny,它的效果很好,但我很惊讶地发现只有大约15%的性能提升? – apeg

+0

希望我可以在我的储蓄上赚15℅。真棒。 – danny117

+0

哈哈真的,生病了吧!谢谢 – apeg