本页介绍如何根据查询模式在指标视图的聚合和未聚合具体化之间进行选择。 有关每种类型及其工作原理,请参阅 指标视图的具体化类型。
使用下表查找适合你的情况的方法。 后续部分详细介绍了每个问题。
| 你的情况 | 方法 |
|---|---|
| 你经常运行相同的查询模式,并且知道按哪些维度进行分组。 | 聚合物化 |
您以固定粒度查询非加性度量,例如 COUNT(DISTINCT)。 |
聚合物化,其维度与查询的维度匹配GROUP BY |
你针对联接或筛选后的数据运行即席查询,并且无法预测 GROUP BY。 |
未聚合物化 |
| 您在同一指标视图中同时拥有可预测的仪表板和即席查询。 | 这两种类型结合起来 |
| 您的指标视图指向一个没有连接或筛选条件的单表。 | 两者都不;对已知模式使用聚合具体化,或跳过具体化 |
聚合物化
聚合物化是针对特定类型问题预先构建的结果表。 它通过返回预计算结果而不是扫描源数据来更快地提供匹配的查询。
以下示例对销售数据使用指标视图,其中字段为region、category和order_date,度量为total_revenue(SUM)、order_count(COUNT)和unique_customers(COUNT(DISTINCT))。
如何加快频繁运行的查询速度?
为其创建聚合物化。 每天运行的查询很适合进行物化,因为物化会返回预先计算好的结果,而不是扫描源数据。 例如,假设你每天早上运行此查询:
SELECT region, MEASURE(total_revenue) FROM sales_mv GROUP BY ALL
如果您通常同时查询 region 和 order_date,请将这两个字段都包含在一个具体化中:
- name: revenue_by_region_date
type: aggregated
dimensions:
- region
- order_date
measures:
- total_revenue
- order_count
以更细的粒度进行物化(按区域 和 日期,而不是仅按区域)意味着,任何仅按 region 分组、仅按 order_date 分组或同时按两者分组的查询都可以使用此物化。 包括 order_count 等可加度量后,同一个物化就能支持针对这些度量的查询,因此无需为每个度量分别创建单独的物化。
如何知道现有具体化是否涵盖新查询?
将查询的 GROUP BY 维度与具体化维度进行比较。 如果物化结果中不包含用于分组的维度,查询就无法使用它。 例如,假设你想要按以下方式 category获得收入,但唯一的具体化就是 revenue_by_region_date 前面所示的示例。 由于其中不包含 category,按 category 分组的查询会回退到未聚合的物化视图(如果存在)或源表。
如果您经常按 category 进行查询,请为此创建一个单独的具体化。 如果查询不频繁或速度不够快,请不要创建一个。 每次物化都会增加存储和刷新成本。
如何使用非累加度量值加快查询速度?
创建一个聚合具体化,其维度与查询 GROUP BY 完全匹配。 非累加性度量值(例如 COUNT(DISTINCT))无法从更细粒度的物化中向上汇总,因此,不同粒度的物化也无济于事。 例如,假设此查询速度缓慢:
SELECT region, MEASURE(unique_customers) FROM sales_mv GROUP BY ALL
unique_customers 使用 COUNT(DISTINCT),其为非累加性的。 前面显示的revenue_by_region_date具体化视图维度不同,因此无法用于此查询。 使用匹配维度创建具体化:
- name: customers_by_region
type: aggregated
dimensions:
- region
measures:
- unique_customers
未聚合的物化
未聚合的物化是一个预先构建好的起点,而不是一个预先构建好的答案。 它只需一次性完成代价高昂的表联接和筛选操作,因此查询可以直接基于联接结果进行聚合,而不必在每次运行时重新联接源表。
聚合仍在查询时进行,因此未聚合的物化结果没有聚合后的物化结果快。 它们比每次查询时都从原始源表重新进行联接更快。
以下示例使用联接三个表并应用筛选器的指标视图:
source: raw_events
filter: event_type = 'purchase'
joins:
- name: customers
source: dim_customers
on: customers.id = source.customer_id
- name: products
source: dim_products
on: products.id = source.product_id
应将哪种类型用于不可预知的查询模式?
使用未聚合的物化。 当你持续运行即席查询且无法预测 GROUP BY 时,就很难定义能够覆盖正确字段的聚合物化。 未聚合的具体化会回避此问题:它会具体化联接的筛选数据集一次,并且任何查询都可以使用它,而不管其形状如何。
materialized_views:
- name: baseline
type: unaggregated
是否应该具体化没有联接的单个表?
在单个表上、不包含联接或筛选条件的未聚合物化,只是复制了该表,并无任何收益。 对已知查询模式使用聚合具体化,或完全跳过具体化。
我可以同时使用这两种物化类型吗?
Yes. 请将未聚合的具体化用作备用方案,并针对已知的高流量查询使用聚合具体化。 此模式适用于包含耗时较长的连接操作的指标视图,以及包含已知小部件的仪表板。 如果可能,查询重写会优先选择聚合物化结果(精确匹配或汇总匹配),其余情况则回退到未聚合的物化结果。
materialized_views:
- name: baseline
type: unaggregated
- name: revenue_by_region_date
type: aggregated
dimensions:
- region
- order_date
measures:
- total_revenue
创建物化时,优先针对最慢或访问量最高的查询。 当你发现查询回退到源端时,请添加更多物化。 若要检查查询是否使用具体化,请参阅 “验证查询是否使用具体化视图”。