内容提要
本文探讨了Postgres 19中时间关系代数的优化问题。作者通过研究TQuel模型,发现传统代数恒等式(如笛卡尔积对差运算的分配律)在时间操作符下不成立,原因是保留输入有效时间会破坏代数性质。作者建议将有效时间视为属性限定符而非普通属性,并计划通过CustomScans实现更优的时间操作符执行。
延伸解读
有效时间应视为属性限定符
文章通过反例说明,若将输入有效时间作为普通属性保留在结果中,会导致笛卡尔积对差运算的分配律失效。作者因此认为,有效时间在语义上应作为其他属性的限定符,而非普通属性。这解释了为何SQL:2011的PERIOD类型不能像普通值那样被SELECT或传递,尽管这限制了组合性,但符合关系代数性质。
快照可归约性的实用价值
论文指出,对于同质关系,时间操作符具有快照可归约性:可以先对基表取快照再执行非时间操作,结果与先执行时间操作再取快照相同。这意味着现有应用迁移到时间表时,无需重写查询,只需定义视图过滤当前时间即可。这降低了采用时间功能的门槛,尤其适用于复杂报表。
时间操作符优化需谨慎
传统代数恒等式在时间操作符下并非全部成立,例如笛卡尔积对差运算的分配律失效。这给查询优化器带来挑战,因为基于该恒等式的变换可能导致错误结果。作者计划通过CustomScans实现专用执行节点,并借助relsim工具验证恒等式,为未来Postgres支持时间连接和集合操作奠定基础。
Q&A
TQuel模型中的有效时间是如何表示的?
TQuel模型中的有效时间不是区间,而是由多个时间片段(chronons)组成的集合,即多范围(multirange)。这种表示方式可以表达非连续的有效时间。
为什么笛卡尔积对差运算的分配律在时间操作符下不成立?
因为时间操作符会保留输入元组的有效时间,导致在计算差运算时,有效时间不匹配,从而破坏了代数恒等式。如果丢弃输入的有效时间,该分配律就成立。
TQuel中的有效时间与SQL:2011中的PERIOD有何不同?
TQuel的有效时间是每个属性独立的,且用多范围表示;而SQL:2011的PERIOD是元组级别的单一区间。但SQL:2011的元组可以转换为TQuel的格式,即把元组有效时间复制到每个属性上,形成同质关系。
什么是快照可归约性?它有什么实际应用?
快照可归约性是指对于同质关系,时间操作符可以先对基表取快照再执行非时间操作,结果与先执行时间操作再取快照相同。这意味着在查询某个时间点的数据时,可以通过视图过滤历史表,无需重写查询,也无需使用时间操作符。
作者计划如何优化Postgres中的时间操作符?
作者计划通过实现自定义扫描(CustomScans)来优化时间操作符的执行,并利用查询规划器进行变换。他开发了temporal_ops扩展,并希望注入CustomScans以实验规划器变换。
作者认为有效时间应该被视为什么?为什么?
作者认为有效时间应该被视为属性的限定符,而不是普通属性。因为保留输入有效时间会破坏代数性质,而将有效时间视为限定符可以保持代数恒等式成立。
作者使用relsim工具做了什么?
作者使用relsim(一个关系计算器)来探索时间关系代数中的恒等式,特别是找到了笛卡尔积对差运算分配律失效的反例,并逐步分析原因。