GROUPED 子句
仅限企业模式
将两个或多个列分组到单个磁盘文件。这样可以将以下工作负载的 I/O 降到最低:
-
读取表中大部分的列。
-
执行单个行查找。
-
针对大量小型列进行查询。
-
频繁更新这些列中的数据。
如果您具有始终同时访问的数据并且这些数据不会在谓词中使用,那么可以通过分组这些列来提高查询性能。一旦分组,查询将不再独立于组中的其他列从磁盘独立检索单个列的所有数据。
注意
当 RLE 列分组成为一个或多个非 RLE 列时,RLE 编码会减少。对列分组时,您可以:
-
对部分列进行分组:
(a, GROUPED(b, c), d)
-
对所有列进行分组:
(GROUPED(a, b, c, d))
-
在同一投影中创建多个分组:
(GROUPED(a, b), GROUPED(c, d))
注意
Vertica 执行动态列分组。例如,对小型负载提供更好的读写效率,Vertica 会忽略任何由投影定义的列分组(或缺少的列分组)并默认将所有列分组到一起。对相关列进行分组
以下示例展示了如何对高度相关的列 bid
和 ask
进行分组。stock
列单独存储。
=> CREATE TABLE trades (stock CHAR(5), bid INT, ask INT);
=> CREATE PROJECTION tradeproj (stock ENCODING RLE,
GROUPED(bid ENCODING DELTAVAL, ask))
AS (SELECT * FROM trades) KSAFE 1;
以下示例展示了如何创建在列定义中使用表达式的投影。投射包含两个整数列 a
和 b
,以及第三列 product_value
,用于存储 a
和 b
的乘积:
=> CREATE TABLE values (a INT, b INT
=> CREATE PROJECTION product (a, b, product_value) AS
SELECT a, b, a*b FROM values ORDER BY a KSAFE;