【问题标题】:SQL query in SQLite doesn't terminateSQLite 中的 SQL 查询不会终止
【发布时间】: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 &lt; 10 上的 JOIN 似乎正在消耗。您可以在Timestamp 上添加索引并检查结果的差异(BI、Excel、编程语言等...)
  • 我已经尝试在 Timestamp 上添加一个索引,这加快了对 4000 行表的查询,但没有注意到与更大的表有任何区别,因为查询永远不会终止。问题可能是特定于 SQLite 的吗?在文档中,提到它们应该扩展到 TB 大型数据库,但此查询并非如此。

标签: sql database performance sqlite inner-join


【解决方案1】:

事实证明,程序终止所需的时间呈指数增长。尝试较小的数据集效果很好。尽管无法过滤输入,但可以想办法以某种方式拆分它。到目前为止,添加索引改善了结果,但它仍然不是所有输入的神奇解决方案。

【讨论】:

    猜你喜欢
    • 2012-07-14
    • 2014-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    相关资源
    最近更新 更多