您可以创建其中的一个或多个列由表达式定义的投影。表达式可以引用一个或多个锚表列。例如,下表包含两个整数列 a
和 b
:
=> CREATE TABLE values (a INT, b INT);
您可以创建含表达式的投影,利用表达式将列 c 的值计算为 a
和 b
的乘积:
=> CREATE PROJECTION values_product (a, b, c)
AS SELECT a, b, a*b FROM values SEGMENTED BY HASH(a) ALL NODES KSAFE;
当您将数据加载到此投影中时,Vertica 会解析列 c 中的表达式 a*b
。然后,您可以查询投影而不是锚表。Vertica 会返回预计算的数据并避免资源密集型计算产生的开销。
在投影中使用表达式还可以让您对表达式的计算结果的数据进行排序或分段,而不是对单个列值进行排序。
支持用户定义的标量函数
重要
当前,对预聚合 UDSF 结果的支持仅限于 C++。Vertica 将用户定义的标量函数 (UDSF) 视为类似于其他表达式。在每个加载操作中,UDSF 会被调用并返回其结果。Vertica 将这些结果存储在磁盘上,并在您直接查询投影时返回这些结果。
在以下示例中,投影 points_p1
指定了在将数据加载到锚表 points
时调用的 UDSF zorder
。当数据加载到投影时,Vertica 将调用此函数,并存储其结果,以便在未来查询时能够快速访问。
=> CREATE TABLE points(point_id INTEGER, lat NUMERIC(12,9), long NUMERIC(12,9));
=> CREATE PROJECTION points_p1
AS SELECT point_id, lat, long, zorder(lat, long) zorder FROM points
ORDER BY zorder(lat, long) SEGMENTED BY hash(point_id) ALL NODES;
要求
-
所有
ORDER BY
表达式必须位于SELECT
列表。 -
所有投影列必须经过命名。
限制
-
如果在具有实时聚合投影的目标表上执行 MERGE 操作,则这些操作必须优化。
-
与实时聚合投影不同,Vertica 不会将含表达式的查询重定向到等效现有投影。
-
投影表达式必须不可变,换而言之,它们必须始终返回相同的结果。例如,投影不能包括使用
TO CHAR
(取决于区域设置)或RANDOM
(在每次调用时返回不同的结果)的表达式。 -
投影表达式不能包括 Vertica 元函数,例如
ADVANCE_EPOCH
、ANALYZE_STATISTICS
、EXPORT_TABLES
或START_REFRESH
。