非常庞大的数据避免分析功能
Posted
技术标签:
【中文标题】非常庞大的数据避免分析功能【英文标题】:Very huge data avoid analytical function 【发布时间】:2018-07-10 02:55:08 【问题描述】:假设此表中有 1 亿个不同的 SID 值。
示例:表test
,列SID, date_operation, score
所以在这张表中,分数每天都在变化,所以如果我想获得所有 SID 的最新分数报告。不想使用分析功能,否则成本会很高。也尝试过自我加入,但看起来也很昂贵。
如果这个问题是多余的,请引导我到类似的问题,我将删除它。
【问题讨论】:
不清楚你在问什么:***.com/help/how-to-ask @Hooman 让我举个例子。假设表只有 4 条记录 SID = 1 , date = 01-01-2018 score = 10 SID = 2 , date = 01-01-2018 score = 20 SID = 1 , date = 02-01-2018 score = 15 SID = 2 , date = 02-01-2018 score = 100 输出应该是:SID 1 = 15 and SID 2 = 100 【参考方案1】:select sid, max(date_operation)
from test
group by sid
将返回您要求的内容:
获取所有最近得分的Sid
【讨论】:
不,@Hooman。 “最近”对我来说是指“最大日期”,而不是“最大分数”。 @Littlefoot 但 OP 想要最近的分数,因此您的查询需要额外的max(score) keep (dense_rank first order by date_operation desc)
列来返回最近的分数(如果最近的分数有多个日期,最高分)。
嗯,这就是你所理解的,@Boneist :),但 OP 写道,他们需要“最近得分的 SID”——不是“最近得分”而是“SID ...”。可能 Hooman 的评论是正确的,但不清楚要问什么。不过,感谢您的评论,如果 那 是他们实际上需要的,那么您是绝对正确的。
同意,OP一直很模棱两可!也许他们希望所有 SID 的分数都与最近的匹配。谁知道? ¯_(ツ)_/¯
抱歉直到现在都没有回应并为模棱两可的问题道歉......基本上在一个问题中,这是一个表,它连接到另一个表,该表具有 SID 和 SID 的另一个维度,所以我想要输出从表测试是 SID 值及其最近的分数......所以输出应该有所有 SID 和他们最近的分数......这很容易,但我正在努力获得输出的速度/性能【参考方案2】:
一种方法是:
select t.*
from t
where t.date = (select max(t2.date) from test t2 where t2.sid = t.sid);
这可以利用test(sid, date)
上的索引。
但是我发现 keep
在 Oracle 中的表现不错:
select sid, max(date),
max(score) keep (dense_rank first order by date desc) as most_recent_score
from test
group by sid;
【讨论】:
谢谢,知道为什么 keep 有更好的性能吗?或者在生产中使用此逻辑之前需要确认的任何文档? @Svarmit 。 . .您应该尝试这两个版本,看看哪个更好。我认为keep
具有良好的性能,因为 Oracle 已经努力对其进行优化。以上是关于非常庞大的数据避免分析功能的主要内容,如果未能解决你的问题,请参考以下文章