如何改进 cube js preagregations 创建过程? (即使有分区粒度,构建 preggs 也需要很长时间)
Posted
技术标签:
【中文标题】如何改进 cube js preagregations 创建过程? (即使有分区粒度,构建 preggs 也需要很长时间)【英文标题】:How to improve cubejs preagregations creation process? (its taking too long to build preaggs even with partitionGranularity) 【发布时间】:2020-02-12 19:03:25 【问题描述】:我们在预聚合创建性能方面遇到问题。我们目前为每个客户的数据都有特定的过滤器,我们通过扩展一个基本多维数据集(称为Metrics
)并定义一个代表这些数据的段来为每个客户生成不同的多维数据集过滤器。
总而言之,我们有一个Metrics
基础多维数据集,我们为客户A, B, C
生成动态多维数据集MetricsA, MetricsB, MetricsC
。这些多维数据集中的每一个都有一个我们称为z
的段,其中包含针对我们每个客户的特定SQL 查询。使用asyncModule
从我们的API 检索构建段的数据,然后我们扩展Metrics
多维数据集,通过用客户端的filter
覆盖z
段来生成所有客户端特定的多维数据集。
通过这样做,当客户端查询多维数据集服务时,检索到的数据将来自其特定的多维数据集,并且数据已经过滤(通过强制的z
段)。
此 Metrics 多维数据集是通过连接大型表构建的,因此我们还添加了一个 partitionGranularity
(每月)以减少预聚合的大小,但构建它们仍然需要很长时间(> 10 分钟)。
我们需要编辑多维数据集服务提交的特定查询以创建预聚合表,因此我们只保留 z
段 = 1 的行(因为那是相关数据),或者至少我们希望能够重新排列/修改查询以提高性能。哪个是进行此类更改的最佳地点?或者干预这个过程的推荐做法是什么?
【问题讨论】:
【参考方案1】:您可以使用两种方法在多租户环境中利用预聚合。
-
为每个客户多维数据集覆盖
sql
,例如 OrdersC1
、OrdersC2
等。在这种情况下,将继承基础 Orders
多维数据集中定义的所有预聚合。每个客户多维数据集都有自己的一组预聚合。这意味着如果有 N
客户和 M
预聚合,则应该构建 N * M
预聚合表,这在某些情况下可能会很昂贵。
cube(`Orders`,
sql: `SELECT * FROM orders`,
preAggregations:
date:
type: `rollup`,
measureReferences: [someMeasure],
dimensionReferences: [someDimension],
timeDimensionReference: date,
granularity: `month`
,
// ...
);
cube(`OrdersC1`,
extends: Orders,
sql: `SELECT * FROM orders WHERE customer_id = 'C1'`,
);
-
使用租户字段作为汇总维度。每个细分都可以转换为维度,从而为所有客户提供使用单个汇总表的机会。可以使用queryTransformer 将请求路由到正确的租户数据。
cube(`Orders`,
sql: `SELECT * FROM orders`,
// ...
dimensions:
// ...
customerId:
sql: `customer_id`,
type: `string`
,
preAggregations:
date:
type: `rollup`,
measureReferences: [someMeasure],
dimensionReferences: [customerId, someDimension],
timeDimensionReference: date,
granularity: `month`
,
// ...
);
【讨论】:
以上是关于如何改进 cube js preagregations 创建过程? (即使有分区粒度,构建 preggs 也需要很长时间)的主要内容,如果未能解决你的问题,请参考以下文章
如何在“webgl_interactive_cubes”示例中使用“OculusRiftEffect.js”