众所周知,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不能解除这个查询的关联吗?
发布于 2016-03-06 12:37:28
我不明白为什么会做出这样的决定,但这可能是因为效率。执行NOT EXISTS意味着数据库必须扫描整个子查询来查找不存在的记录。这是非常低效的,应该尽可能避免--特别是在处理大数据时。
我注意到您正在从Orders检索所有列,其中只需要ProductId。考虑到Redshift是一个列式数据库,选择所需的最小列数会更有效。
看起来您正在尝试查找任何订单上都不存在的产品,因此请尝试:
SELECT
ProductID,
ProductName
FROM
Products
WHERE
ProductID NOT IN (SELECT DISTINCT ProductId from Orders)在英语中,这是“选择任何不在订单上的产品”。
发布于 2016-03-06 07:25:16
我在RedShift documentation中看不到任何排除这一点的东西。但是,将其表示为LEFT JOIN非常容易。
SELECT p.*
FROM Products p LEFT JOIN
[Order Details] od
ON p.ProductId = od.ProductId
WHERE od.ProductId IS NULL;至于为什么亚马逊选择了特定的功能,你必须去问他们的开发人员或营销人员。
发布于 2016-03-07 23:34:23
Redshift不是亚马逊开发的,而是通过投资ParAccel (后来被其他公司收购)而被收购的。ParAccel显然急需现金,于是把家里的银子卖给了亚马逊。
Redshift是ParAccel在投资时提供的数据库的一个子集(假定是其中的大部分,但从未明确定义)。亚马逊在这笔交易中没有获得任何工程师-只是代码。
在早期的Redshift中,我们只看到了产品很小的变化。很明显,他们正在努力安全地进行深层次的改变。他们现在有一支坚实的工程团队,对代码有丰富的了解,改进工作正在以相当快的速度进行。
所有这些实际上都是一种冗长的说法,即数据库引擎是一款极其复杂和昂贵的软件。亚马逊是出了名的“节俭”,我认为建立这个团队/经验的成本就是为什么我们没有(也不会)看到产品降价的原因。
柯特·莫纳什说:
“规则1:开发一个好的数据库管理系统需要5-7年的时间和数千万美元,如果事情进行得非常顺利的话。
规则2:你不是规则1的例外。“
http://www.dbms2.com/2013/03/18/dbms-development-marklogic-hadoop/
https://stackoverflow.com/questions/35820687
复制相似问题