从表 A 的筛选部分中选择行,其中列与表 B 中按 ID 匹配的行中的列匹配关系



我想获取表中的所有行,其中一列与另一列具有相同值的不同表中的行中的列值匹配。

具体来说,我有两个表、订单和product_info,我可以通过 Amazon Redshift 访问它们

订单

| ID   | Date     | Amount | Region |
=====================================
| 1    | 2019/4/1 | $120   | A      |
| 1    | 2019/4/4 | $100   | A      |
| 2    | 2019/4/2 | $50    | A      |
| 3    | 2019/4/6 | $70    | B      |

按顺序排列的分区键是区域和日期。

产品信息

| ID   | Release Date | Region |
| ---- | ------------ | ------ |
| 1    | 2019/4/2     | A      |
| 2    | 2019/4/3     | A      |
| 3    | 2019/4/5     | B      |

产品信息的主键为 id,分区键为区域。

我想从区域 A 中的订单中获取行的日期大于该 ID 的产品信息中的发布日期值的所有行。

所以在这种情况下,它应该只返回一行,

| 1    | 2019/4/4 | $100   | A      |

我试过做

select *
from orders
INNER JOIN product_info ON orders.date>product_info.release_date
AND orders.id=product_info.id
AND orders.region=A
AND product_info.region=A
limit 10

问题是这个查询慢得离谱(10 分钟后取消)。 表非常大,我有一种感觉,它是扫描整个表而不将其限制为区域(实际上,除了区域之外,我还有其他过滤器,我想在进行内部连接之前将其应用于 ID 列表,但为了简化问题,我将其限制为仅区域)。

如何有效地编写这种类型的查询?

加快 SQL 查询速度的最佳方法是尽快排除行。

因此,不应将orders.region=A等条件放在 JOIN 语句中,而应将它们移动到WHERE语句中。这将在联接行之前消除行。

此外,使JOIN条件尽可能简单,以便数据库可以优化比较。

尝试这样的事情:

SELECT *
FROM orders
INNER JOIN product_info ON orders.id = product_info.id
WHERE orders.region = 'A'
AND product_info.region = 'A'
AND orders.date > product_info.release_date

任何进一步的优化都需要考虑红移表上的DISTKEYSORTKEY。(最好是idDISTKEYdateSORTKEY)。

最新更新