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

Wide table vs deep table in Oracle 12c - performance implications

Oracle 大师,

我们正决定设计 500 列宽的 table 与 8 列宽但 40 亿行深的 table 的最佳方法。 table 将每周更新一次,每个星期日都会将新一周(过去最后一周)的数据添加到 table。 由于数据因周数(财政)而异,我们对上述设计的优缺点有两组想法-

对于宽 table - 想法是设计一个 table 包含一个 3 属性列的每个星期数一直追溯到过去 160 周。所以这给了我们 160 x 3 = 480 列宽。这个想法是,每周当我们将最后一周的数据添加到 table 时,我们将从 table 中删除最旧的一周列,并将最新的一周列添加到 table.根据 ColA - ColD 上定义的键,这个 table 将有大约 4000 万行(请参考下图)。这是示例 -

对于深度 table - ColA - ColD 字段保持不变,除了有一个新的周列,该列因 ColA-ColD 上定义的键而异。当我们构建这个 table 时,我们的想法是只将最近的一周与适当的周数粘在 table 上,并有一个单独的清除(维护)过程来从 table。这个 table 将有大约 40 亿行和 8 列宽。这是一个关于它看起来如何的示例 -

我们绝对理解需要根据周数对 table 中的任何一个进行分区,无论我们选择哪个。 table 的使用 - table 将被并发用户多次查询匹配的周数和过去 52 周的 ColA 值,期望在更短的时间内从中创建报告超过 5 分钟。 我正在这里寻求 Oracle 专家的建议,无论您是否在经验中看到 table 有将近 500 列,并且每周在我们向 [=30= 构建数据时删除或添加列] 以及它如何影响高度并发的报告生成工具的性能。相反,如果您使用的 table 有 40 亿行(但列不会每周更改),使用此 table 的并发报告流程对性能有何影响.

谢谢您,非常感谢您抽出宝贵时间!! 布伦登

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

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

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