如何优化这个非常慢的左外连接 sqlite 查询?

0 sql sqlite optimization left-join outer-join

我遇到了一个 SQL 查询问题,该问题基本上慢到需要大约 17 分钟以上的时间。我很确定这仅仅是因为外连接和纯数据量使这个查询变得很糟糕。不幸的是,我没有看到重写它以获得我想要的东西的好方法

我有以下表格(为简洁起见省略了一些列):

Events
ID (AUTOINCREMENT INTEGER PRIMARY KEY) | Guid (16 Byte BLOB) | Time (FLOAT)


Relationships
ID (AUTOINCREMENT INTEGER PRIMARY KEY) | Parent (INTEGER) | Child (INTEGER) | ParentTable (INTEGER) | ChildTable (INTEGER)
Run Code Online (Sandbox Code Playgroud)

事件表有大约 25k 行(这可能是实际的四倍数据的)。关系表有大约 212k 行(同样,可能会翻两番)。

本质上,事件可以嵌套事件。生成的树没有深度限制(尽管目前还不是很深)。

选择事件记录时,我的目标是返回提供以下数据的数据行:

ID | Guid | Time | ParentIndex | ParentGuid
Run Code Online (Sandbox Code Playgroud)

我也完全期望根级事件将具有空的 ParentID 和 ParentGuid 列(这是我采用外连接方法的原因之一)。

我的查询(无约束)如下所示:

SELECT E.*, R.Parent as 'ParentIndex', PE.Guid AS 'ParentGuid' FROM Events AS E
LEFT OUTER JOIN Relationships AS R ON R.Child = E.ID AND R.ChildTable = 0
LEFT OUTER JOIN Events AS PE ON R.Parent = PE.ID ORDER BY E.Time;
Run Code Online (Sandbox Code Playgroud)

如果我使用过滤大多数返回的事件的 WHERE 子句约束此查询,我会得到一行正是我想要的数据。但是,如果没有严格的约束,执行时间会很短。

我认为有更好的方法来编写此查询以获得相同类型的结果行,但我的 Sql-fu 失败了。