这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

实时聚合投影

实时聚合投影包含一些列,这些列的值是从其锚表的列中聚合而成的。当您将数据加载到表中时,Vertica 首先会聚合数据,然后将其加载到实时聚合投影中。例如,通过 INSERTCOPY 执行后续加载操作时,Vertica 会使用新数据重新计算聚合并更新投影。

1 - 实时聚合投影支持的函数

Vertica 可以在以下聚合函数的实时聚合投影中聚合结果:

带 DISTINCT 的聚合函数

实时聚合投影可以支持包含用关键字 DISTINCT 限定的聚合函数的查询。需要满足以下要求:

  • 聚合表达式的求值结果必须为非常数。

  • 投影的 GROUP BY 子句必须指定聚合表达式。

例如,以下查询使用了 SUM(DISTINCT) 来计算给定区域的所有唯一薪金的总额:

SELECT customer_region, SUM(DISTINCT annual_income)::INT
   FROM customer_dimension GROUP BY customer_region;

此查询可以使用以下实时聚合投影,而该投影在其 GROUP BY 子句中指定了聚合列 (annual_income):

CREATE PROJECTION public.TotalRegionalIncome
(
 customer_region,
 annual_income,
 Count
)
AS
 SELECT customer_dimension.customer_region,
        customer_dimension.annual_income,
        count(*) AS Count
 FROM public.customer_dimension
 GROUP BY customer_dimension.customer_region,
          customer_dimension.annual_income
;

2 - 创建实时聚合投影

您可以使用以下语法定义一个实时聚合投影:


=> CREATE PROJECTION proj-name AS
      SELECT select-expression FROM table
      GROUP BY group-expression;

有关完整的语法选项,请参阅CREATE PROJECTION

例如:

=> CREATE PROJECTION clicks_agg AS
   SELECT page_id, click_time::DATE click_date, COUNT(*) num_clicks FROM clicks
   GROUP BY page_id, click_time::DATE KSAFE 1;

有关详细讨论,请参阅实时聚合投影示例

要求

以下要求适用于实时聚合投影:

  • 投影不能未分段。

  • SELECTGROUP BY 列的顺序必须相同。GROUP BY 表达式必须在 SELECT 列表的开头。

限制

以下限制适用于实时聚合投影:

  • 如果在具有实时聚合投影的目标表上执行 MERGE 操作,则这些操作必须优化

  • 实时聚合投影只能引用一个表。

  • Vertica 不会将实时聚合投影视为超投影,即使是包含所有表格列的投影也是如此。

  • 您不能修改实时聚合投影中包含的列的锚表元数据,例如列的数据类型或默认值。您也不能删除这些列。要进行这些更改,首先删除与表关联的所有实时聚合和 Top-K 投影。

3 - 实时聚合投影示例

此示例显示了如何使用下面的 clicks 表跟踪给定网页上的用户点击:


=> CREATE TABLE clicks(
   user_id INTEGER,
   page_id INTEGER,
   click_time TIMESTAMP NOT NULL);

您可以使用以下查询聚合用户特定的活动:


=> SELECT page_id, click_time::DATE click_date, COUNT(*) num_clicks FROM clicks
   WHERE click_time::DATE = '2015-04-30'
   GROUP BY page_id, click_time::DATE ORDER BY num_clicks DESC;

要提升此查询的性能,请创建可以统计每位用户的单击数的实时聚合投影:

=> CREATE PROJECTION clicks_agg AS
   SELECT page_id, click_time::DATE click_date, COUNT(*) num_clicks FROM clicks
   GROUP BY page_id, click_time::DATE KSAFE 1;

查询 clicks 表了解用户点击数时,Vertica 通常会将查询定向到实时聚合投影 clicks_agg。随着更多数据加载到 clicks,Vertica 会预聚合新数据并更新 clicks_agg,所以查询始终都会返回最新数据。

例如:

=> SELECT page_id, click_time::DATE click_date, COUNT(*) num_clicks FROM clicks
    WHERE click_time::DATE = '2015-04-30' GROUP BY page_id, click_time::DATE
    ORDER BY num_clicks DESC;
 page_id | click_date | num_clicks
---------+------------+------------
    2002 | 2015-04-30 |         10
    3003 | 2015-04-30 |          3
    2003 | 2015-04-30 |          1
    2035 | 2015-04-30 |          1
   12034 | 2015-04-30 |          1
(5 rows)