众所周知,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不能解决这个问题吗?
答案 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/