【发布时间】:2021-09-21 17:15:07
【问题描述】:
我有(例如)一张桌子Users (user_id, status, timestamp, ...)。
我还有另一张桌子SpecialUsers (user_id, ...)。
我需要显示每个特殊用户的最新状态。
问题在于Users 表非常非常大(超过 50 十亿 行)。例如this question 中的大多数解决方案只是挂起或出现“磁盘已满”错误。
SpecialUsers 表要小得多——“只有”60 万行。
SELECT DISTINCT ON() 不受支持。使用 Amazon RedShift。
编辑:根据请求查看失败的尝试 - 导致磁盘已满错误的其中之一是这样的:
with users_with_status (user_id, status, timestamp)
as (
select su.user_id, u.instance_type, u.timestamp
from specialusers su
join users u on su.user_id = u.user_id
)
select l.instance_id, l.instance_type
from users_with_status l
left outer join users_with_status r
on l.user_id = r.user_id and l.timestamp < r.timestamp
where r.timestamp is null;
我知道自己正在加入一个错误表,但希望第一次加入小表会减少处理的行数。
无论如何,窗口函数似乎是这里的解决方案。
【问题讨论】:
-
您能发布您的 SQL 吗?许多磁盘填满的情况是由于不合格的联接或不等式联接子句造成的。这些会导致中间结果中的行爆炸式增长,这就是磁盘填充的原因。
-
第二。我们猜测没有 DDL 和 SQL。
-
@BillWeiner 添加了
-
磁盘被填满的原因可能是 ON 子句“l.timestamp
标签: sql amazon-redshift query-optimization greatest-n-per-group