【发布时间】:2021-11-08 20:52:25
【问题描述】:
我在 SQLite 数据库中有一个表格,格式如下:
| Timestamp | fst_field | ... | fifth_field |
|---|---|---|---|
| 10001 | X | ... | ... |
| 10003 | Y | ... | ... |
| 10005 | Z | ... | ... |
| 10020 | W | ... | ... |
它没有任何主键,所有字段都是文本类型,除了时间戳(int)
以下查询:
SELECT s.Timestamp, s.fst_field , ..., s.fifth_field, p.Timestamp, p.fst_field, ..., p.fifth_field
FROM table s JOIN table p ON s.Timestamp < p.Timestamp AND p.Timestamp - s.Timestamp < 10
应在阈值(此处为 10)内输出其所有后续行旁边的每一行。
输出如下所示:
| s.Timestamp | s.fst_field | ... | s.fifth_field | p.Timestamp | p.fst_field | ... | p.fifth_field |
|---|---|---|---|---|---|---|---|
| 10001 | X | ... | ... | 10003 | Y | ... | |
| 10001 | X | ... | ... | 10005 | Z | ... | |
| ... | ... | ... | ... |
该查询适用于具有 4000 行的表。但是,当我尝试使用具有 2200 万行(1.4 GB 文件)的表时,它会持续运行数天而不会停止。我尝试添加索引,甚至添加到每个属性,以使查询更快,但这并没有帮助。我在 Linux 和 Windows 上都运行了代码。
知道为什么这不起作用吗?
【问题讨论】:
-
这可能是因为您没有使用 JOIN 而是使用 CROSS JOIN(在表名之间放置逗号时隐含),这不是一个很好的语句性能。请描述您的表定义以及您想要的结果,或在查询中添加显式连接子句
-
请解释您要做什么。可能有更简单的方法。
-
是的,即使使用 JOIN 它仍然不会终止。我希望初始表的结构和结果现在清楚了
-
2200 万行足以优化您的 SQL 查询。
p.Timestamp - s.Timestamp < 10上的JOIN似乎正在消耗。您可以在Timestamp上添加索引并检查结果的差异(BI、Excel、编程语言等...) -
我已经尝试在 Timestamp 上添加一个索引,这加快了对 4000 行表的查询,但没有注意到与更大的表有任何区别,因为查询永远不会终止。问题可能是特定于 SQLite 的吗?在文档中,提到它们应该扩展到 TB 大型数据库,但此查询并非如此。
标签: sql database performance sqlite inner-join