我被困于优化关系代数中的这个SQL-查询:
SELECT * FROM R1, R2, R3, R4
WHERE (R1.A = '1' OR (R2.B = '2' AND R3.C = R4.C)) AND R4.D = '4'我把它翻译成以下关系代数声明:
σ{R1.A='1' ∨ (R2.B='2' ∧ R3.C=R4.C) ∧ R4.D='4'}(R1 × R2 × R3 × R4)我的问题是,我不知道如何优化where语句。我知道我可以将最后一个条件转换为σ{R4.D='4'}(R4),并将它直接移动到树下R4。有一些优化规则,但是我真的不知道如何处理OR。逻辑查询优化规则
,但我如何优化其馀的where呢?,我考虑使用分布规则将其转换为KNF,
(R1.A='1' ∨ R2.B='2') ∧ (R1.A='1' ∨ R3.C=R4.C) 这样我就可以独立处理这两条条款了。但我不知道如何继续,特别是我应该加入或制造笛卡儿产品的顺序。
这是操作符树,我画:

发布于 2015-06-29 10:24:52
Union是不可能的,因为它需要相同类型的列。我现在从我的导师那里得到了一个正式的解决方案。正如我已经考虑过的,需要使用分配规则将其转换为KNF,这样我就有了两个单独的子句。

发布于 2015-06-22 19:17:15
在查询优化过程中,一种很好的方法是将选择条件转换为析取范式(DNF),然后将选择条件重写为选择的合并(每个析取一个)。
即在这里适用第2条规则:条件
由于查询优化中的大多数技巧在某些情况下运行良好,而在其他情况下则不然--这就是SQL优化器搜索计划空间的原因,它们试图想出一个合适的计划。
https://stackoverflow.com/questions/30662546
复制相似问题