Vertica SQL:;或;联合会导致经济大幅放缓吗?

Vertica SQL:;或;联合会导致经济大幅放缓吗?,sql,performance,join,vertica,Sql,Performance,Join,Vertica,我有一个类似的问题 select count(distinct tab1.id) from tab1 join tab2 on tab1.email = tab2.email_a 但是当我把它改成 select count(distinct tab1.id) from tab1 join tab2 on tab1.email = tab2.email_a or tab1.email = tab2.email_b 然后突然间,它不知何故变得极度低效。我知道我可以使用两条join语句编写查询,但

我有一个类似的问题

select count(distinct tab1.id)
from tab1 join tab2 on tab1.email = tab2.email_a
但是当我把它改成

select count(distinct tab1.id)
from tab1 join tab2 on tab1.email = tab2.email_a or tab1.email = tab2.email_b

然后突然间,它不知何故变得极度低效。我知道我可以使用两条join语句编写查询,但是Vertica在第二条语句中到底做了什么使它变得如此糟糕呢?

是性能杀手

这是怎么回事

select count(tab1.id)
from tab1 
where exists (select 1 from tab2 where tab1.email = tab2.email_a) or 
      exists (select 1 from tab2 where tab1.email = tab2.email_b);

我猜
tab1.id
是唯一的,所以您不需要
选择distinct

我实际上希望OR谓词执行得更差,不管DBMS是什么,实际上:

优化的连接操作至少在正常情况下依赖于至少部分支持此连接的物理设计(其他数据库中的索引、Vertica中的投影设计)

但是,在比较之前,只要在任何一个连接函数上应用任何表达式,这都会消失,其中包括类型转换、函数、数学运算,以及类似或的逻辑运算

到目前为止,我还没有发现在应用比较之前对联接操作数进行操作的任何情况,在这种情况下,混淆优化者选择更糟糕计划的风险不会太高

因此,我希望乐观主义者会采取一个不太理想的计划

@Hanmyo-你能找到一种方法来对你想要的查询运行解释吗-一次带或,一次不带或在谓词中,这样我们就可以得到说明的差异了

干杯-Marco

如果您在每个语句之前依次添加关键字“explain”,那么您将看到每个语句的查询计划。显示的成本数字显示了执行查询每个部分的相对复杂性。因此,在你看到后者成本更高的部分,这将给你一个指示,是什么导致它变慢

如果结果显示谓词超出范围,则意味着您没有为表收集任何统计信息,自上次更新以来,这些统计信息已过期,或者只是您要查找的值不存在。执行如下语句以更新统计信息: 选择“分析统计数据”(“表1”)

还可以更新表中单个列的统计信息,例如:
选择analyze_statistics('tab1.email')

请发布tab1和tab2投影定义。这看起来像是一个随机答案。你怎么能在既没有解释平面图也没有投影定义的情况下提出这样或那样的建议呢?@mauro。我对数据库的工作原理有很好的了解,不过老实说,我不能100%确定Vertica在这种情况下是如何工作的,因为我在这方面的经验比较有限。