代码之家  ›  专栏  ›  技术社区  ›  Brendon

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

  •  0
  • Brendon  · 技术社区  · 8 年前

    甲骨文大师,

    我们现在需要确定设计500列宽的表与设计8列宽但40亿行深的表的最佳方法。该表将每周更新一次,每周日向表中添加一周(过去最近一周)的新数据。 由于数据因周数(财政)而异,我们对上述设计的利弊有两种看法-

    对于宽表,其思想是设计一个表,其中包含过去160周内每个星期编号的3个属性列。因此,我们得到的是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 回复  |  直到 8 年前
        1
  •  3
  •   APC    8 年前

    您需要一个投影一致的表。这意味着八列、四十亿行的配置。

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

    对于40亿行,您肯定应该购买分区选项。假设大多数查询使用 WeekNumber 。但是,通过分区交换加载数据并使用Drop分区删除数据的能力在处理大量数据时是非常宝贵的。