实时聚合投影包含一些列,这些列的值是从其锚表的列中聚合而成的。当您将数据加载到表中时,Vertica 首先会聚合数据,然后将其加载到实时聚合投影中。例如,通过 INSERT 或 COPY 执行后续加载操作时,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
;
注意
此投影包括聚合函数COUNT
,它在此处不担当逻辑功能;将此聚合函数包括进来只因为实时聚合投影至少需要一个聚合函数。
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;
有关详细讨论,请参阅实时聚合投影示例。
要求
以下要求适用于实时聚合投影:
限制
以下限制适用于实时聚合投影:
-
如果在具有实时聚合投影的目标表上执行 MERGE 操作,则这些操作必须优化。
-
实时聚合投影只能引用一个表。
-
Vertica 不会将实时聚合投影视为超投影,即使是包含所有表格列的投影也是如此。
-
您不能修改实时聚合投影中包含的列的锚表元数据,例如列的数据类型或默认值。您也不能删除这些列。要进行这些更改,首先删除与表关联的所有实时聚合和 Top-K 投影。
注意
一个例外情况是:您可以在实时聚合投影包含的列中设置和删除 NOT NULL。
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)