查看此问题底部的更新,下面提到的查询时间意外差异的原因已被确定为 sqliteman 怪癖的结果
我在 SQLite 数据库中有以下两个表(我知道该结构可能看起来毫无意义,但请耐心等待)
+-----------------------+
| source |
+-----------------------+
| item_id | time | data |
+-----------------------+
+----------------+
| target |
+----------------+
| item_id | time |
+----------------+
--Both tables have a multi column index on item_id and time
Run Code Online (Sandbox Code Playgroud)
源表包含大约 500,000 行,目标表中永远不会有超过一条匹配记录,实际上,几乎所有源行都可能有一个匹配的目标行。
我正在尝试执行相当标准的反连接来查找源中的所有记录,而目标中没有相应的行,但我发现很难创建具有可接受的执行时间的查询。
我正在使用的查询是:
SELECT
source.item_id,
source.time,
source.data
FROM source
LEFT JOIN target USING (item_id, time)
WHERE target.item_id IS NULL;
Run Code Online (Sandbox Code Playgroud)
仅不带 WHERE 子句的 LEFT JOIN 就需要大约 200 毫秒才能完成,有了它,该时间就会增加到 5000 毫秒。
虽然我最初注意到消费应用程序中的查询速度很慢,但上面的计时是通过直接从 sqliteman 中执行语句获得的。
这个看似简单的子句会如此显着地增加执行时间,是否有特殊原因?是否有某种方法可以重构此查询来改进它?
我也尝试过以下方法,结果相同。(我想底层查询计划是相同的)
SELECT
source.item_id,
source.time, …
Run Code Online (Sandbox Code Playgroud)