首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在关系代数(OR in WHERE)中坚持逻辑SQL查询优化

在关系代数(OR in WHERE)中坚持逻辑SQL查询优化
EN

Stack Overflow用户
提问于 2015-06-05 09:06:38
回答 2查看 428关注 0票数 3

我被困于优化关系代数中的这个SQL-查询:

代码语言:javascript
复制
SELECT * FROM R1, R2, R3, R4 
WHERE (R1.A = '1' OR (R2.B = '2' AND R3.C = R4.C)) AND R4.D = '4'

我把它翻译成以下关系代数声明:

代码语言:javascript
复制
σ{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,

代码语言:javascript
复制
(R1.A='1' ∨ R2.B='2')  ∧ (R1.A='1'  ∨  R3.C=R4.C) 

这样我就可以独立处理这两条条款了。但我不知道如何继续,特别是我应该加入或制造笛卡儿产品的顺序。

这是操作符树,我画:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-29 10:24:52

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

票数 1
EN

Stack Overflow用户

发布于 2015-06-22 19:17:15

在查询优化过程中,一种很好的方法是将选择条件转换为析取范式(DNF),然后将选择条件重写为选择的合并(每个析取一个)。

即在这里适用第2条规则:条件

由于查询优化中的大多数技巧在某些情况下运行良好,而在其他情况下则不然--这就是SQL优化器搜索计划空间的原因,它们试图想出一个合适的计划。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30662546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档