首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Redshift不支持‘t相关子查询?

问为什么Redshift不支持‘t相关子查询?
EN

Stack Overflow用户
提问于 2016-03-06 06:25:27
回答 4查看 3.3K关注 0票数 1

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

为什么Redshift不能解除公共DOES NOT EXIST子查询的关联?例如,下面的查询实质上是:

代码语言:javascript
复制
SELECT ProductID,
       ProductName
FROM   Products p
WHERE  NOT EXISTS (SELECT *
                   FROM   [Order Details] od
                   WHERE  p.ProductId = od.ProductId) 

有人能解释一下为什么Redshift不能解除这个查询的关联吗?

EN

回答 4

Stack Overflow用户

发布于 2016-03-06 12:37:28

我不明白为什么会做出这样的决定,但这可能是因为效率。执行NOT EXISTS意味着数据库必须扫描整个子查询来查找不存在的记录。这是非常低效的,应该尽可能避免--特别是在处理大数据时。

我注意到您正在从Orders检索所有列,其中只需要ProductId。考虑到Redshift是一个列式数据库,选择所需的最小列数会更有效。

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

代码语言:javascript
复制
SELECT
  ProductID,
  ProductName
FROM
  Products
WHERE
  ProductID NOT IN (SELECT DISTINCT ProductId from Orders)

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

票数 2
EN

Stack Overflow用户

发布于 2016-03-06 07:25:16

我在RedShift documentation中看不到任何排除这一点的东西。但是,将其表示为LEFT JOIN非常容易。

代码语言:javascript
复制
SELECT p.*
FROM Products p LEFT JOIN
     [Order Details] od
     ON p.ProductId = od.ProductId
WHERE od.ProductId IS NULL;

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

票数 1
EN

Stack Overflow用户

发布于 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/

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

https://stackoverflow.com/questions/35820687

复制
相关文章

相似问题

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