如何优化这个令人难以置信的慢左外连接sqlite查询?

时间:2014-01-25 19:18:17

标签: 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)

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

基本上,Event可以有嵌套的事件。生成的树没有深度限制(尽管此刻它并不是非常深)。

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

ID | Guid | Time | ParentIndex | ParentGuid

我还完全期望根级事件将具有null 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;

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

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

1 个答案:

答案 0 :(得分:4)

分析EXPLAIN QUERY PLAN的输出以查看正在使用的索引(如果有)。