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 失败了。
| 归档时间: |
|
| 查看次数: |
8496 次 |
| 最近记录: |