我想获取表中的所有行,其中一列与另一列具有相同值的不同表中的行中的列值匹配。
具体来说,我有两个表、订单和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
任何进一步的优化都需要考虑红移表上的DISTKEY
和SORTKEY
。(最好是id
的DISTKEY
和date
的SORTKEY
)。