【发布时间】:2018-11-22 21:31:05
【问题描述】:
如何快速查询与 rowid 列表匹配的记录?我的 iOS 应用中有一个查询,如下所示:
SELECT rowid, category_id
FROM items
WHERE rowid in (2, 4, 89, 4243, 44, 555, ...)
rowid 列表可能有点长 - 几百个项目就是一个典型示例。
奇怪的是,这个查询需要几秒钟才能运行——在某些情况下可能长达 12 秒。无论是在 SQLite shell 中运行还是在我的应用程序中运行,都会很慢。
但是,如果我将这个查询替换为:
SELECT rowid, category_id
FROM items
所以我检索表中的每一项(在我的测试用例中,大约 1000 行),只是让我的应用程序忽略它不需要的 rowid,查询仅在几百毫秒内执行。它还在 SQLite shell 中快速响应。
这里发生了什么? rowid 是一个主键,所以这应该是一个快速的索引查找。有没有更快的方法来运行这样的查询?我会认为是解析查询字符串会有所不同,但分析显示几乎所有时间都花在了sqlite3_step。
【问题讨论】:
-
嗯,与其他解决方案相比,
WHERE rowid in(.....)的性能应该相当不错。该查询之外是否有任何内容可能会减慢您的查询响应速度? -
WHERE...IN不适用于大型列表,因为 在内部 它将被视为无法优化的大型 OR 列表好吧。但是您可以尝试这种方法:xaprb.com/blog/2006/06/28/why-large-in-clauses-are-problematic -
@Martin 我不这么认为,因为我在 SQLite shell 中看到了问题
-
@AndreasOetjen 所以基本上,使用临时表?
-
@Bill 是的,可以加入。根据您的用例 - 也许您的 id 列表不会经常更改 - 持久的 id 表也可能是一个很好的解决方案。