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

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

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

最佳答案

您可以使用两种方法来利用多租户环境中的预聚合。


覆盖每个客户多维数据集(例如sqlOrdersC1等)的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`
    },

    // ...
  }
});

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

10-11 12:01