好的,我是SQLite的新手,并已使用以下查询成功完成此操作:
UPDATE stuff
SET UserName = (SELECT UserName FROM Temp_Stuff WHERE Temp_Stuff.EmpID = stuff.EmployeeID
当stuff
有4995行且Temp_Stuff
有1814行并且在大约2秒内执行时,此功能非常有效。
当stuff
有60,000行且Temp_Stuff
有55,000行时,我尝试这个完全相同的查询时,它似乎在查询期间锁定并且不处理任何内容(我等了20多分钟。 )
我正在使用vb.net实现这一点,并在事务中包装了ExecuteNonQuery方法,如果发生任何错误,我会回滚事务(我没有达到这一点。)是否有更有效的方法来实现这一点在SQLite?我已经尝试并意识到Update语句中不允许使用连接,因此该想法被抛弃了。这似乎是一个特定于SQLite的问题。
* 查询计划: *
0 0 0 SCAN TABLE stuff(~1000000 rows)
0 0 0 EXECUTE CORRELATED SCALAR SUBQUERY 0
0 0 0 SCAN TABLE Temp_Stuff(~100000 rows)
答案 0 :(得分:1)
查询计划显示Temp_Stuff
表完全扫描 stuff
表中的每个记录。
在EmpID
列上添加索引,以便查找运行得更快。
(要获得稍高的性能,请在EmpID
和UserName
列上使用覆盖索引。)
SQLite永远不会自动为命名表创建索引;您必须明确定义它们,或者使用UNIQUE
或PRIMARY KEY
约束隐式定义它们。