非常庞大的数据避免分析功能

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 已经努力对其进行优化。

以上是关于非常庞大的数据避免分析功能的主要内容,如果未能解决你的问题,请参考以下文章

OCaml Marshal的数据结构非常庞大

避免缓存中出现脏数据分析

对话抖音电商:量级庞大参差不齐,“数据质量治理”有妙招!

如何避免在数据库中创建新列

谷歌分析如何避免同源政策?

如何避免五毛和水军来维持社区的健康?