【问题标题】:Optimize this insert SQL Query优化这个插入 SQL Query
【发布时间】:2012-10-16 22:42:40
【问题描述】:

我一直试图找出为什么我的 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 ))";

如您所见,插入查询中使用了一些Selects。这样做的原因是因为循环将数据插入到其他表中(WIDFriendIDUniverseIDGalaxyID)所以在插入之前我没有这些数据。我需要将这些数据插入到MainFrame 表中,但这感觉像是一种蛮力方法。有什么建议吗?

【问题讨论】:

  • 您是否已将问题范围缩小到查询的哪一部分?即,您是否自行运行选择以查看它返回的速度。如果选择很慢,也许看看索引。如果 select 很快,可能它在 MainFrame 表上的索引会减慢插入速度。
  • @DavidOsborne - 我又进行了几次测试,但似乎即使从 MainFrame 中删除索引后,它仍然需要 4 秒或更长时间。单独的 select 语句足够快。
  • @DavidOsborne - 我从第一个值中索引了WName 列,现在它的速度提高到了 500 毫秒。我担心空间问题,但现在应该足够了。如果您愿意,可以将其作为答案发布,因为建议检查选择是否缓慢。

标签: sql performance sqlite select insert


【解决方案1】:

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

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

【讨论】:

  • 它们是自动递增的,但它们使用insert of ignore 命令,因此没有重复。这会抛出 sqlite3_last_insert_rowid() 值。
【解决方案2】:

您是否已将问题范围缩小到查询的哪一部分?即,您是否自行运行选择以查看它返回的速度。如果选择很慢,也许看看索引。如果 select 很快,可能它在 MainFrame 表上的索引会减慢插入速度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 2011-09-20
    • 2011-05-06
    • 1970-01-01
    相关资源
    最近更新 更多