Doris ROLLUP物化索引表

在 Apache Doris 中,ROLLUP 是一种用于数据聚合的 SQL 操作,它可以在不同的数据模型中使用,以提高查询效率。以下是一些使用 ROLLUP 的示例:

  1. Aggregate 和 Unique 模型中的 ROLLUP
  • 例如,如果你有一个表 example_site_visit2,并且想要获取每个用户的总消费,你可以创建一个 ROLLUP 表,只包含 user_idcost 字段。这样,当你执行 GROUP BY user_id 的查询时,Doris 会自动使用这个 ROLLUP 表,从而减少需要扫描的数据量。
  1. Duplicate 模型中的 ROLLUP
  • 在 Duplicate 模型中,ROLLUP 可以调整列顺序以匹配前缀索引,从而提高查询效率。例如,你可以创建一个 ROLLUP 表,将 ageuser_id 的顺序调换,这样在执行特定查询时,Doris 会优先选择这个 ROLLUP 表,因为它的前缀索引匹配度更高。
  1. ROLLUP 的创建和使用
  • 你可以使用 ALTER TABLE 语句来添加或删除 ROLLUP。例如,添加一个 ROLLUP
ALTER TABLE example_site_visit2 ADD ROLLUP rollup_cost_userid(user_id, cost);
  • 查询时,Doris 会根据查询条件自动决定是否使用 ROLLUP。例如,查询特定用户的消费总额:
SELECT user_id, SUM(cost) FROM example_site_visit2 GROUP BY user_id;
  • 这个查询可能会使用到之前创建的 ROLLUP 表。
  1. 查看 ROLLUP 状态
  • 你可以使用 SHOW ALTER TABLE ROLLUP; 命令来查看 ROLLUP 的创建状态,以确保它们已经完成并且可以使用。(确保创建rollup时base表中有数据)
  1. ROLLUP 的注意事项
  • ROLLUP 的数据是独立物理存储的,创建的 ROLLUP 越多,占用的磁盘空间也就越大。
  • ROLLUP 的数据更新与 Base 表是完全同步的。
  • 查询能否命中 ROLLUP 的一个必要条件是,查询所涉及的所有列都存在于该 ROLLUP 的列中。(where select)
  1. 聚合查询示例
  • 假设你有一个销售数据表,你可以创建一个 ROLLUP 来获取每个城市的销售总额:
ALTER TABLE sales ADD ROLLUP rollup_city(sale_date, prod_name, SUM(sale_nums));
  • 然后执行查询:
SELECT sale_date, prod_name, SUM(sale_nums) FROM sales GROUP BY sale_date, prod_name;
  • 这个查询可能会使用到 ROLLUP 表,以提高查询效率。