置换 SQLite 视图 returns 没有 where 子句要调用的行太多

Permutative SQLite view which returns too many rows to be called without where clause

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

该程序支持合并文档的基本操作,该操作使用源文档中元素的并集创建新文档,并根据一组从源文档的边界中选择元素的新边界根据不同的合并类型而不同的规则。规则也存储在 table.

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

显然,此视图会 return 太多结果,无法直接 运行;按照 O(D*D*B*M) 的顺序,其中 D=count(Documents), B=count(Boundary elements), and M=count(MergeTypes)。但是我 认为 如果您在另一个查询中使用带有 where 子句的视图将结果过滤为 2 个文档和 1 个合并类型,则 SQLite 不会创建整个视图结果,而只会创建结果属于 where 子句。

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

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