gpt4 book ai didi

javascript - 如何改进cubejs预聚合创建过程? (即使使用partitionGranularity,构建预聚合也需要很长时间)

转载 作者:行者123 更新时间:2023-11-28 03:10:19 27 4
gpt4 key购买 nike

我们在预聚合创建性能方面遇到问题。目前,我们对每个客户的数据都有特定的过滤器,并且通过扩展基本多维数据集(称为 Metrics )并定义代表这些数据的段,为每个客户生成不同的多维数据集。过滤器。

总而言之,我们有一个 Metrics基础立方体,我们生成动态立方体 MetricsA, MetricsB, MetricsC为客户A, B, C 。这些立方体中的每一个都有一个我们称为 z 的段。 ,其中包含我们每个客户的特定 SQL 查询。使用 asyncModule 从我们的 API 检索构建分段的数据。 ,然后我们扩展 Metrics通过覆盖 z 生成所有客户端特定的多维数据集。与客户的 filter 进行分段。通过这样做,当客户端查询多维数据集服务时,检索到的数据将来自其特定的多维数据集,并且数据已经过滤(通过强制 z 段)。

这个Metrics立方体是通过连接大表构建的,所以我们还添加了一个partitionGranularity (每月)以减少预聚合的大小,但构建它们的时间仍然太长(> 10 分钟)。
我们需要编辑多维数据集服务提交的特定查询来创建预聚合表,因此我们只保留 z 的行。 Segment = 1(因为这是相关数据),或者至少我们希望能够重新排列/修改查询以提高性能。哪个地方是进行此类更改的最佳位置?或者干预此过程的建议做法是什么?

最佳答案

您可以使用两种方法在 Multi-Tenancy 环境中利用预聚合。

  1. 覆盖每个客户多维数据集的 sql,例如 OrdersC1OrdersC2 等。在这种情况下,所有预聚合都在基 中定义>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`
    },

    // ...
    }
    });

    关于javascript - 如何改进cubejs预聚合创建过程? (即使使用partitionGranularity,构建预聚合也需要很长时间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60195250/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com