大多数数据库每次从头重新执行查询,使读取延迟与查询复杂度和数据大小成正比。Readyset采取不同的方法:它将每个查询编译成一个数据流图——一个操作符网络(连接、过滤、聚合、投影),随着数据变化持续维护查询结果。当上游插入、更新或删除一行时,更改通过图传播,缓存结果被增量更新。读取变成对预计算物化视图的查找,而不是完整的查询执行。
这种架构对SQL施加了结构约束。二元连接需要相等谓词;范围谓词或基于表达式的连接键不受支持。相关子查询必须重写为等效连接,因为数据流没有每外行执行。派生表受支持但编译为完全物化的中间节点;重写管道在安全的地方积极内联它们。
支持的连接类型包括INNER、LEFT OUTER和CROSS;RIGHT和FULL OUTER不受支持,因为跟踪缺失匹配的难度。聚合需要显式的GROUP BY列引用和至少一个聚合派生的投影。
权衡是查询必须以数据流引擎可以编译的形式表达——比标准SQL更严格——但回报是增量维护和更快的读取。
来源: Hacker News · 由HeadlinesBriefing整理摘要