优化此插入SQL查询

优化此插入SQL查询,sql,performance,sqlite,select,insert,Sql,Performance,Sqlite,Select,Insert,我一直在试图找出为什么我的SQLite数据库执行得比较慢(插入1500条记录需要4秒),我想我已经把范围缩小到了这个查询。有没有办法优化这一点 "INSERT OR REPLACE INTO MainFrame(WID,PName,PAlias,PModel,FriendID, UniverseID, GalaxyID) VALUES ((SELECT WID FROM Worlds WHERE WName= ?), @pname, @palias, @pmodel, (S

我一直在试图找出为什么我的SQLite数据库执行得比较慢(插入1500条记录需要4秒),我想我已经把范围缩小到了这个查询。有没有办法优化这一点

 "INSERT OR REPLACE INTO MainFrame(WID,PName,PAlias,PModel,FriendID, UniverseID, GalaxyID) VALUES
  ((SELECT WID FROM Worlds WHERE WName= ?),
  @pname,
  @palias,
  @pmodel,
  (SELECT FriendID FROM Friend WHERE FriendName = @eFriend),
  (SELECT UniverseID FROM Universes WHERE UniverseName = @eUniverse),
  (SELECT GalaxyID FROM Galaxies WHERE GalaxyName = @eGalaxy ))";

如您所见,insert查询中使用了一些
选择。这是因为循环将数据插入到其他表中(
WID
FriendID
UniverseID
GalaxyID
),所以在插入数据之前,我没有这些数据。我需要将这些数据插入到大型机
表中,但这感觉像是一种蛮力方法。有什么建议吗?

如果您的ID字段是自动递增的,您可以通过调用C API或您的语言中的相应函数,在插入相应记录后立即获取它们的值


(对所有插入也使用一个事务。)

您是否已将问题缩小到查询的哪一部分?ie让您自己运行select,看看它返回的速度有多快。如果选择速度慢,可以查看索引。如果select很快,可能是它在大型机表上的索引减慢了插入速度。

您是否已将其缩小到查询的哪一部分?ie让您自己运行select,看看它返回的速度有多快。如果选择速度慢,可以查看索引。如果select很快,可能是它在大型机表上的索引减慢了插入速度。@DavidOsborne-我又进行了一些测试,但似乎即使从大型机上删除了索引,仍然需要4秒或更长的时间。单个select语句速度足够快。@DavidOsborne-I从第一个值为列
WName
编制了索引,现在它的速度提高到了500ms。我担心空间问题,但现在应该足够了。如果您愿意,您可以将其作为答案发布,因为这是检查select是否慢的建议。它们是自动递增的,但它们使用了ignore的
插入命令,因此没有重复的。这将抛出
sqlite3\u last\u insert\u rowid()
值。