我有一个抽象语法树形式的 SQL 查询的解析表示。 我想将其转换为中间逻辑树表示,然后优化器可以将其扩展为候选物理操作树。
根据讨论该主题的各种资源(CMU 讲座、数据库管理系统、Dayal 1987 年关于嵌套子查询的论文),我设法将大部分查询转换为中间代数形式(例如
π_a(R⋈S)
),但我陷入翻译通用表表达式和横向连接。
SELECT *
FROM
(SELECT 1 id) A,
(
(SELECT 2) B
JOIN LATERAL (SELECT A.id) C ON TRUE
) D;
NAT. JOIN
├── A
└── LATERAL JOIN (D)
├── B
└── C <- should be able to reference A
这些约束可以用“代数运算”来表达吗?或者它们通常需要定制的数据结构吗?例如,CTE 的单独子树而不是整个逻辑计划的单个树 - 但是,优化器如何全局优化查询而不是单独优化每个子树? 更一般地说,为了查询优化的目的,是否有比代数树更好的中间表示?
例如:
有向无环图:DAG中的每个节点代表一个操作,边代表数据流。这允许操作之间存在更复杂的关系,例如引用前面的 FROM 项中的列的横向联接。
为了进一步阅读该主题,除了您已经提到的来源之外,我还推荐 Chamberlin, D.D. 等人所著的《System R: Relational Approach to Database Management》。其中讨论了 System R 项目及其内部结构,以及 Graefe, G 的“Volcano:可扩展并行查询评估系统”。