我们有一个租用的数据仓库,我们正在对其进行报告。查询开始需要很长时间,我们正在寻找减少这种情况的选项。目前有两种想法。
创建租户特定的聚合表,并从中查询。
根据租户水平划分数据。
第一个选项意味着对于每一个加入的新租户,我们都需要创建一组新的表。这并不难,因为新租户注册时会提前几周通知,如果我们忘记了,就会很早就发现缺乏报告。
对我来说,对数据进行分区听起来是一种更好的方法,因为我们没有复制数据。我们不必依赖流程将新数据传输到聚合表。
如果有人以前有过类似的经历,我想知道这些选项中的哪一个会更好。对数据进行分区真的有帮助吗?或者与将所有数据放在一个“空间”中没有太大区别?
而且,在 Oracle 10g 中,如何对数据进行水平分区?如果我有下表:
TABLE Transaction(id, tenant_id, a, b, c, d)
我们将很快迁移到 Oracle 11g,因此我们将不胜感激跨版本分区的任何差异。
(注意:我尝试使用分区标签,但没有足够的代表,如果其他人可以添加一个很酷的标签)
首先回答你的第二个问题:是的,你应该partition。Oracle 的查询优化器有一个叫做分区消除的特性,它会检查分区的谓词,并且只在适当的分区上执行 SQL。
分区也将所有数据留在一个空间中。从概念上讲,将其视为具有相同结构的许多表,
UNION ALL
如果您SELECT
要从整个表中执行 a,则它们之间存在隐含关系。除了“幕后”,Oracle 根据您指定的标准将实际行排序到正确的“表”中。任何不符合任何条件的行进入所谓的“默认”分区。对于您想要做的事情,“范围分区”可能是一个不错的方法(因此您可以稍后添加更多租户),例如:
然后稍后
这将创建一些看起来和行为都像普通表的东西,但实际上,tenant_id=1 的行将位于表空间 ts_tenant1 的分区中,并且查询将忽略所有其他分区。跨整个表的查询可以在每个分区上并行运行。如果在这种情况下,tenant_id=4,该行将存在于 ts_default 中,除非您如图所示添加新分区,但
INSERT
不会因为没有分区而被拒绝!FWIW 在我的站点上,我们在 40Tb DW 中使用分区表,如果您选择合适的分区策略(例如,您可以在tenant_id 上分区,然后在月上进行子分区),您无需担心这种方法的扩展或性能,创建正确的索引,等等。