1

好的,我是 SQLite 的新手,并且已经使用以下查询成功地做到了这一点:

 UPDATE stuff
 SET UserName = (SELECT UserName FROM Temp_Stuff WHERE Temp_Stuff.EmpID = stuff.EmployeeID

stuff有 4995 行和Temp_Stuff1814 行并在大约 2 秒内执行时,这很有效。

stuff当我在有 60,000 行和55,000 行时尝试这个完全相同的查询时Temp_Stuff,它似乎在查询期间被锁定并且不处理任何东西(我等了 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)
4

1 回答 1

1

查询计划显示对Temp_Stuff表中的每条记录都进行了完全扫描。stuff

在列上添加索引,EmpID以便查找运行得更快。(为了获得稍高的性能,请在EmpIDUserName列上使用覆盖索引。)

SQLite 从不自动为命名表创建索引;您必须使用UNIQUEPRIMARY KEY约束显式或隐式定义它们。

于 2013-03-15T18:39:46.110 回答