从Oracle将一个表中的数据插入两个表组

时间:2015-05-21 19:49:04

标签: oracle database-design etl

我有一种情况,我需要在一个包含类似字段的加载表中收集大量数据(每天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”将数据从加载器移动到这两个表,并且可能在数据库中使用触发器来尝试实现此目的。关于解决这个问题的最佳方法的任何想法和建议?

1 个答案:

答案 0 :(得分:0)

  

“每天9亿以上”

这不仅仅是大量的行:这是一个巨大的号码,它需要特殊的工程来处理它。

对于初学者,您不仅需要INSERT语句。保持现有(request,type,response)元组计数的要求也指向UPDATE。在这种情况下,生成和返回合成密钥的需求是有问题的。它排除了MERGE,这是实现upserts的最简单方法(因为MERGE语法不支持RETURNING子句)。

除此之外,尝试在单个事务中处理90亿行是一个坏主意。处理需要多长时间?如果它在中途失败会发生什么?您需要定义更细粒度的工作单元。

尽管如此,这引发了一些商业问题。在一天结束之后,用户只想看到整个图片?或者他们会从看到日内结果中获益吗?如果是,如何区分日内结果和截止日结果?如果不是,如何隐藏部分处理的结果,而其余的仍然在飞行中?此外,他们希望看到那些总数之后多久才能看到这些总数?

然后是建筑方面的考虑因素。这些数字意味着每秒处理超过十万(一万万)行 。这需要严重的紧缩和昂贵的许可附加。显然企业版用于并行处理,但也有分区和RAC选项。

到目前为止,你应该知道为什么没有人直接回答你的问题。这是一个咨询工具,而不是StackOverflow问题。

但是让我们草拟一个解决方案。

  1. 我们必须持续处理传入的原始数据。因此,我们将加载到LOALER表中的记录加载到FINAL和TIMESTAMP表中,这样就成了对原始数据的审计(或者我们可能完全摆脱了LOADER表)。
  2. 我们需要批量传入记录以利用基于集合的操作。根据合成密钥实现,我们应该针对纯SQL,否则批量PL / SQL。
  3. 保持事情的发展至关重要,因此我们需要注意批量错误处理。
  4. 理想情况下,目标表可以进行分区,因此我们可以加载到脱机表中并使用Partition Exchange将清理后的数据联机。
  5. 对于合成密钥,我很想使用基于(request,type,response)元组的散列键而不是序列,因为这样可以选择独立加载TIMESTAMP和FINAL。 (碰撞极不可能。)
  6. 为了清楚起见,这是一个小包不是一个严肃的建筑。您需要对生产等效硬件上的实际数据量进行实验和基准测试。