SQLite - 从具有条件的视图中进行选择,何时对行进行过滤?

时间:2015-04-21 20:28:13

标签: sqlite

问题是关于SQLite。 假设我的视图是多个表连接的结果,表与外键约束链接并且所有索引都已到位,并且执行针对此类视图的select语句并且它使用仅选择的where条件可用行的子集。对于每个语句,视图必须是“物化的”(我不知道真正的单词是什么),但是它是否完全适用于所有行,然后从选择中进行过滤,或者视图是否在'智能的方式,它已经以某种方式预先过滤数据?它甚至重要吗?这是如何工作的?

1 个答案:

答案 0 :(得分:1)

当您查询这样的视图时:

SELECT ...
FROM MyView
WHERE ...

然后视图合并为子查询,如下所示:

SELECT ...
FROM (SELECT ...
      FROM ...
      WHERE ...)
WHERE ...

进一步处理是相同的,无论子查询来自视图还是在查询中明确写入。

如果可能,SQLite会尝试flatten the subquery,以便最终结果是一个简单的查询,并将所有连接和WHERE条件合并在一起。

如果不可能,SQLite会尝试将子查询实现为协程,即它执行内部查询,直到它获得一个行,然后将外部查询的任何处理应用于行;然后输出结果,如果有的话;然后重复。

仅当内部查询必须在返回第一行之前计算所有行时(例如,当使用无法展平的ORDER BY时),则无法使用协程,并且内部查询查询实际上已实现为临时表。