为什么Redshift不支持DOES EXIST相关的子查询?

时间:2016-03-05 22:25:27

标签: sql amazon-redshift

众所周知,RedShift有一组相关的子查询可以解相关,从而使查询运行得更快。

为什么Redshift不能解除常见DOES NOT EXIST子查询的相关性?例如,下面的查询基本上是:

SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId) 

有人可以解释为什么Redshift不能解决这个问题吗?

3 个答案:

答案 0 :(得分:1)

我在RedShift documentation中看不到任何排除这种情况的内容。但是,很容易表达为LEFT JOIN

SELECT p.*
FROM Products p LEFT JOIN
     [Order Details] od
     ON p.ProductId = od.ProductId
WHERE od.ProductId IS NULL;

至于为什么亚马逊选择了特定功能,您必须询问他们的开发人员或营销人员。

答案 1 :(得分:1)

我不清楚为什么做出这个决定,但这可能是由于效率。执行NOT EXISTS表示数据库必须扫描整个子查询以查找记录的不存在。这非常低效,应该尽可能避免 - 特别是在处理大数据时。

我注意到您要检索Orders中的所有列,其中只需要ProductId。鉴于Redshift是一个柱状数据库,选择所需的最小列数效率更高。

看起来您正在尝试查找任何订单上不存在的产品,请尝试:

SELECT
  ProductID,
  ProductName
FROM
  Products
WHERE
  ProductID NOT IN (SELECT DISTINCT ProductId from Orders)

在英语中,这表示“选择任何不在订单上的产品”。

答案 2 :(得分:0)

Redshift并非在亚马逊开发,而是以ParAccel的投资换取(自其他人收购后)。 ParAccel显然急需现金,并将家庭白银卖给亚马逊。

Redshift是ParAccel在投资时提供的数据库的一部分(假设是大部分数据但从未明确定义)。亚马逊没有收购任何工程师 - 只是代码。

在Redshift的早期,我们只看到了产品的非常浅薄的变化。他们似乎很难安全地做出深刻的改变。他们现在拥有一支坚实的工程团队,对代码有很多了解,并且改进正在以适当的速度推进。

所有这些实际上是一种冗长的方式,说数据库引擎是一个非常复杂和昂贵的软件。亚马逊是出了名的,呃,简约"我认为建立这个团队/经验的成本是我们没有(并且不会)看到产品降价的原因。

Curt Monash说:
" 规则1:开发一个好的DBMS需要5到7年和数千万美元。如果事情进展顺利,那就是这样 规则2:您不是规则1的例外。"
http://www.dbms2.com/2013/03/18/dbms-development-marklogic-hadoop/