我有一种情况,我需要在一个包含类似字段的加载表中收集大量数据(每天90亿条)数据 -TABLE装载机
first_seen,request,type,response,hits
1232036346,mydomain.com,A,203.11.12.1,200
1332036546,ogm.com,A,103.13.12.1,600
1432039646,mydomain.com,A,203.11.12.1,30
需要拆分为两个表(重复数据删除)
-TABLE final
request,type,response,hitcount,id
mydomain.com,A,203.11.12.1,230,1
ogm.com,A,103.13.12.1,600,2
和 -TABLE时间戳
id,times_seen
1,1232036346
2,1432036546
1,1432039646
我可以创建模式并执行选择
select request,type,response,sum(hitcount) from loader group by request,type,response;
将数据输入决赛桌。为了获得最佳性能,我想看看是否可以使用“insert all”将数据从加载器移动到这两个表,并且可能在数据库中使用触发器来尝试实现此目的。关于解决这个问题的最佳方法的任何想法和建议?
答案 0 :(得分:0)
“每天9亿以上”
这不仅仅是大量的行:这是一个巨大的号码,它需要特殊的工程来处理它。
对于初学者,您不仅需要INSERT语句。保持现有(request,type,response)
元组计数的要求也指向UPDATE。在这种情况下,生成和返回合成密钥的需求是有问题的。它排除了MERGE,这是实现upserts的最简单方法(因为MERGE语法不支持RETURNING子句)。
除此之外,尝试在单个事务中处理90亿行是一个坏主意。处理需要多长时间?如果它在中途失败会发生什么?您需要定义更细粒度的工作单元。
尽管如此,这引发了一些商业问题。在一天结束之后,用户只想看到整个图片?或者他们会从看到日内结果中获益吗?如果是,如何区分日内结果和截止日结果?如果不是,如何隐藏部分处理的结果,而其余的仍然在飞行中?此外,他们希望看到那些总数之后多久才能看到这些总数?
然后是建筑方面的考虑因素。这些数字意味着每秒处理超过十万(一万万)行 。这需要严重的紧缩和昂贵的许可附加。显然企业版用于并行处理,但也有分区和RAC选项。
到目前为止,你应该知道为什么没有人直接回答你的问题。这是一个咨询工具,而不是StackOverflow问题。
但是让我们草拟一个解决方案。
(request,type,response)
元组的散列键而不是序列,因为这样可以选择独立加载TIMESTAMP和FINAL。 (碰撞极不可能。)为了清楚起见,这是一个小包不是一个严肃的建筑。您需要对生产等效硬件上的实际数据量进行实验和基准测试。