置换SQLite视图,返回太多行,无需where子句即可调用

时间:2016-07-28 16:16:45

标签: sqlite views

我正在开发一个由SQLite数据库支持的C ++程序。数据库包含文档,文档元素和文档边界(位于文档边界的文档元素集)的表。文档是在运行时创建的。

该程序支持合并文档的基本操作,它创建一个新文档,其中包含源文档中元素的并集,以及一个新的边界,其元素是从源文档中选择的。根据一组根据不同合并类型而不同的规则的边界。规则也存储在表格中。

当我处理数据库模式时,我意识到我可以创建一个SQLite视图,它将规则表连接到边界表,并生成所有边界元素的列表,如果您将每个文档连接到每个边界元素根据每个合并计划的其他文件。

显然,这个视图会返回太多结果直接运行;大约O(D*D*B*M) D=count(Documents), B=count(Boundary elements), and M=count(MergeTypes)的顺序。但是,我认为如果你在另一个查询中使用了带有where子句的视图,将结果过滤为2个文档和1个合并类型,那么SQLite将不会创建整个视图结果,只会创建与where子句。

这是正确的假设吗?或者仅仅存在具有潜在巨大结果集的视图会导致数据库出现问题吗?

1 个答案:

答案 0 :(得分:1)

在读取结果之前必须完全计算查询(例如,使用ORDER BY的查询)。 但是如果可能的话,查询优化器会尝试将视图合并到外部查询中,即合并到flatten