Oracle 12c中的宽表与深表 - 性能影响

时间:2018-03-27 17:44:07

标签: oracle performance plsql oracle12c bulk-operations

Oracle大师,

我们正在决定设计一个500列宽的表与一个宽8列但深40亿行的表的最佳方法。该表将每周更新一次,每周日更新一周的新周(过去的最近一周)数据。 由于数据因周数(财政)而异,我们对上述设计的利弊有两组思路 -

对于宽表 - 我们的想法是设计一个表,其中包含每周数量的3个属性列,一直持续160周。这样我们就可以得到160 x 3 = 480列的宽度。我们的想法是,每周我们将最后一周的数据添加到表中时,我们将从表中删除最早的一周列,并将最新的一周列添加到表中。根据ColA-ColD上定义的键,此表将有大约4000万行(请参见下图)。这是示例 -

Wide table view

对于深表 - ColA-ColD字段保持不变,除了新的周列因ColA-ColD上定义的键而异。当我们构建这个表时,我们的想法是仅使用适当的周数将最近一周保留在表中,并进行单独的清除(维护)过程以从表中删除最早的周行。该表将有大约40亿行和8列宽。这是一个关于它看起来如何的样本 -

Deep table view

我们绝对明白需要在这里使用周数对任一表进行分区,无论我们选择哪一个。 表的使用 - 对于匹配的周数和过去52周的ColA值,并发用户将多次查询该表,并且期望在不到5分钟内创建一个报告。 我在这里寻求Oracle大师的建议,不管你是否有经验看到一个表格,就像我们在表格中建立数据时每周删除或添加列的近500列,以及它如何影响性能用于高度并发的报告生成工具。相反,如果您使用的表深达40亿行(但列数不会每周更改),并且使用此表的并发报告流程的性能影响是什么。

谢谢你,非常感谢你的时间! 布伦登

1 个答案:

答案 0 :(得分:3)

您想要一张具有一致投影的表格。这意味着八列,四十亿行配置。

删除列本身就是一项昂贵的任务。除此之外,您需要每周更改引用该表的所有代码,这似乎不是一个好主意。另一种方法是为此表上的每个调用使用动态SQL,这更不可取。

有40亿行你绝对应该购买分区选项。假设您的大多数查询都使用WeekNumber,那么您的查询将受益于分区修剪。但是,通过分区交换加载数据并使用Drop Partition删除数据的能力对于处理大量数据非常有用。