这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
CREATE PROJECTION
为 Vertica 编录中的
投影创建元数据。Vertica 支持四种类型的投影:
-
标准投影: 以优化在该表上执行某些查询的格式存储表数据的集合。
-
实时聚合投影: 存储对表列调用聚合函数(例如 SUM)的查询的分组结果。
-
Top-K 投影:存储所选行的分区中的前 k 行。
-
UDTF 投影: 在由用户定义的转换函数 (UDTF) 转换和/或聚合后存储新加载的数据。
复杂数据类型在投影中使用时有额外的限制:
-
每个投影必须至少包含一个原始类型或原生数组的列。
-
AS SELECT 子句可以使用复杂类型的列,但任何其他表达式必须是标量类型或原生数组。
-
ORDER BY、PARTITION BY 和 GROUP BY 子句无法使用复杂类型。
-
如果投影不包含 ORDER BY 或分段子句,Vertica 仅使用选择列表中的原始列对数据进行排序或分段。
-
投影列不能是从 ARRAY_CAT 等函数返回的复杂类型。
-
TopK 和 UDTF 投影不支持复杂类型。
1 - 标准投影
Stores a collection of table data in a format that optimizes execution of certain queries on that table.
以优化在该表上执行某些查询的格式存储表数据的集合。有关详细信息,请参阅 投影。
语法
CREATE PROJECTION [ IF NOT EXISTS ] [[database.]schema.]projection
[ (
{ projection-column | grouped-clause
[ ENCODING encoding-type ]
[ ACCESSRANK integer ] }[,...]
) ]
AS SELECT { * | { MATCH_COLUMNS('pattern') | expression [ [AS] alias ] }[,...] }
FROM [[database.]schema.]table [ [AS] alias]
[ ORDER BY column-expr[,...] ]
[ segmentation-spec ]
[ KSAFE [ k-num ]
[ ON PARTITION RANGE BETWEEN min-val AND max-val ] ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
为该投影及其锚表指定架构,两者的 schema 必须相同。如果指定一个数据库,它必须是当前数据库。
-
projection
标识要创建的投影,其中 projection 符合 标识符中描述的约定。同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
projection-column
投影列的名称。投影列的列表必须在数量、类型和顺序上与 SELECT 列表列和表达式相匹配。
如果省略投影列名称,Vertica 将使用在 SELECT 列表中指定的锚表列名称。
-
grouped-clause
- 请参阅 GROUPED 子句。
-
ENCODING encoding-type
列编码类型,默认设置为 AUTO。
-
ACCESSRANK integer
覆盖列的默认访问等级。使用此参数可提高或降低 Vertica 访问列的速度。有关详细信息,请参阅覆盖默认的列等级。
AS SELECT
- 指定要从指定表中选择的列或列表达式:
注意
如果指定了投影列名称,则投影列和表列/表达式的两个列表中的列数和列顺序必须完全匹配。
ORDER BY
- 指定 SELECT 列表中要作为投影排序依据的列。ORDER BY 子句 只能设置为 ASC(默认值)。Vertica 始终按升序存储投影数据。
如果您按具有集合数据类型(ARRAY 或 SET)的列排序,则在 ORDER BY 子句中使用该列的查询将再次执行排序。这是因为投影和查询执行排序的方式不同。
如果省略 ORDER BY 子句,Vertica 将使用 SELECT 列表对投影排序。
-
segmentation-spec
- 使用以下子句之一指定如何分布投影数据:
如果对于锚表和投影都未指定分段,则将使用一个包含 SELECT 列表中所有列的哈希分段子句来定义投影,如下所示:
SEGMENTED BY HASH(column-expr[,...]) ALL NODES OFFSET 0;
提示
Vertica 建议对大表进行分段。
-
KSAFE [k-num]
指定投影的 K-safety,其中 k-num 必须等于或大于数据库 K-safety。如果针对未分段的投影设置了此参数,Vertica 将忽略此参数。 如果省略 k-num,Vertica 将使用数据库 K-safety。
有关常规信息,请参阅 企业模式数据库中的 K-safety。
ON PARTITION RANGE
指定将此投影的数据限制在分区键范围内,指定如下:
ON PARTITION RANGE BETWEEN min-range-value AND max-range-value
以下要求适用于 min‑range‑value 和 ≤ max‑range‑value:
max-range-value 可以设置为 NULL,以指定分区范围没有上限。
有关其他要求和使用详细信息,请参阅 分区范围投影。
特权
非超级用户:
示例
请参阅:
2 - 实时聚合投影
存储对表列调用聚合函数(例如 SUM)的查询的分组结果。有关详细信息,请参阅实时聚合投影。
语法
CREATE PROJECTION [ IF NOT EXISTS ] [[database.]schema.]projection
[ (
{ projection-column | grouped-clause
[ ENCODING encoding-type ]
[ ACCESSRANK integer ] }[,...]
) ]
AS SELECT { table-column | expr-with-table-columns }[,...] FROM [[database.]schema.]table [ [AS] alias]
GROUP BY column-expr
[ KSAFE [ k-num ] ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
为该投影及其锚表指定架构,两者的 schema 必须相同。如果指定一个数据库,它必须是当前数据库。
-
projection
标识要创建的投影,其中 projection 符合 标识符中描述的约定。同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
projection-column
投影列的名称。投影列的列表必须在数量、类型和顺序上与 SELECT 列表列和表达式相匹配。
如果省略投影列名称,Vertica 将使用在 SELECT 列表中指定的锚表列名称。
-
grouped-clause
- 请参阅GROUPED 子句。
-
ENCODING encoding-type
列编码类型,默认设置为 AUTO。
-
ACCESSRANK integer
覆盖列的默认访问等级。使用此参数可提高或降低 Vertica 访问列的速度。有关详细信息,请参阅覆盖默认的列等级。
AS SELECT
指定要查询的表数据:
{table-column | expr-with-table-columns } [ [AS] alias] }[,...]
您可以选择性地为每个列表达式分配一个别名,并在 SELECT 语句的其他位置引用该别名。
注意
如果指定了投影列名称,则投影列和表列/表达式的两个列表中的列数和列顺序必须完全匹配。
-
GROUP BY column‑expr[,...]
- SELECT 列表中的一个或多个列表达式。第一个 column-expr 必须是 SELECT 列表中的第一个列表达式,第二个 column-expr 必须是 SELECT 列表中的第二个列表达式,依此类推。
特权
非超级用户:
要求和限制
Vertica 不会将实时聚合投影视为
超投影,即使是包含所有表列的投影也是如此。有关其他要求和限制,请参阅创建实时聚合投影。
示例
请参阅实时聚合投影示例。
3 - Top-K 投影
存储所选行的分区中的前 k 行。有关详细信息,请参阅 Top-K 投影。
语法
CREATE PROJECTION [ IF NOT EXISTS ] [[database.]schema.]projection
[ (
{ projection-column | grouped-clause
[ ENCODING encoding-type ]
[ ACCESSRANK integer ] }[,...]
) ]
AS SELECT { table-column | expr-with-table-columns }[,...] FROM [[database.]schema.]table [ [AS] alias]
LIMIT num-rows OVER ( window-partition-clause [window-order-clause] )
[ KSAFE [ k-num ] ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
为该投影及其锚表指定架构,两者的 schema 必须相同。如果指定一个数据库,它必须是当前数据库。
-
projection
标识要创建的投影,其中 projection 符合 标识符中描述的约定。同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
projection-column
投影列的名称。投影列的列表必须在数量、类型和顺序上与 SELECT 列表列和表达式相匹配。
如果省略投影列名称,Vertica 将使用在 SELECT 列表中指定的锚表列名称。
-
grouped-clause
- 请参阅 GROUPED 子句。
-
ENCODING encoding-type
列编码类型,默认设置为 AUTO。
-
ACCESSRANK integer
覆盖列的默认访问等级。使用此参数可提高或降低 Vertica 访问列的速度。有关详细信息,请参阅覆盖默认的列等级。
AS SELECT
指定要查询的表数据:
{table-column | expr-with-table-columns } [ [AS] alias] }[,...]
您可以选择性地为每个列表达式分配一个别名,并在 SELECT 语句的其他位置引用该别名。
注意
如果指定了投影列名称,则投影列和表列/表达式的两个列表中的列数和列顺序必须完全匹配。
AS SELECT
指定要查询的表数据:
{table-column | expr-with-table-columns } [ [AS] alias] }[,...]
您可以选择性地为每个列表达式分配一个别名,并在 SELECT 语句的其他位置引用该别名。
注意
如果指定了投影列名称,则投影列和表列/表达式的两个列表中的列数和列顺序必须完全匹配。
-
LIMIT num‑rows
- 要从指定分区返回的行数。
-
window-partition-clause
- 指定按 SELECT 列表中的一个或多个列表达式(用逗号分隔)进行窗口分区。第一个分区表达式必须是 SELECT 列表中的第一项,第二个分区表达式必须是 SELECT 列表中的第二项,依此类推。
-
window-order-clause
- 指定前 k 行的返回顺序,默认情况下按升序 (ASC)。所有列表达式都必须来自 SELECT 列表,其中第一个窗口顺序表达式必须是未在窗口分区子句中指定的第一个 SELECT 列表项。
Top-K 投影支持 ORDER BY NULLS FIRST/LAST。
特权
非超级用户:
要求和限制
Vertica 不会将 Top-K 投影视为
超投影,即使是包含所有表列的投影也是如此。有关其他要求和限制,请参阅 创建 Top-K 投影。
示例
请参阅 Top-K 投影示例。
4 - UDTF 投影
在由用户定义的转换函数 (UDTF) 转换和/或聚合后存储新加载的数据。有关详细信息和示例,请参阅 预聚合 UDTF 结果。
重要
目前,投影只能引用
借助于 C++ 开发的 UDTF。
语法
CREATE PROJECTION [ IF NOT EXISTS ] [[database.]schema.]projection
[ (
{ projection-column | grouped-clause
[ ENCODING encoding-type ]
[ ACCESSRANK integer ] }[,...]
) ]
AS { [batch-query](#UDTFBatchQuery) FROM { [prepass-query](#UDTFPrePassQuery) sq-ref | table [[AS] alias] }
| [prepass-query](#UDTFPrePassQuery) }
batch-query
SELECT { table-column | expr-with-table-columns }[,...], batch-udtf(batch-args)
OVER (PARTITION BATCH BY partition-column-expr[,...])
[ AS (batch-output-columns) ]
prepass-query
SELECT { table-column | expr-with-table-columns }[,...], prepass-udtf(prepass-args)
OVER (PARTITION PREPASS BY partition-column-expr[,...])
[ AS (prepass-output-columns) ] FROM table
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
为该投影及其锚表指定架构,两者的 schema 必须相同。如果指定一个数据库,它必须是当前数据库。
-
projection
标识要创建的投影,其中 projection 符合 标识符中描述的约定。同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
projection-column
投影列的名称。投影列的列表必须在数量、类型和顺序上与 SELECT 列表列和表达式相匹配。
如果省略投影列名称,Vertica 将使用在 SELECT 列表中指定的锚表列名称。
-
grouped-clause
- 请参阅 GROUPED 子句。
-
ENCODING encoding-type
列编码类型,默认设置为 AUTO。
-
ACCESSRANK integer
覆盖列的默认访问等级。使用此参数可提高或降低 Vertica 访问列的速度。有关详细信息,请参阅覆盖默认的列等级。
AS SELECT
指定要查询的表数据:
{table-column | expr-with-table-columns } [ [AS] alias] }[,...]
您可以选择性地为每个列表达式分配一个别名,并在 SELECT 语句的其他位置引用该别名。
注意
如果指定了投影列名称,则投影列和表列/表达式的两个列表中的列数和列顺序必须完全匹配。
-
batch-udtf(batch-args)
- 每当发生以下事件时要调用的 批量 UDTF:
-
Tuple Mover 合并
-
在投影上执行查询
-
在执行数据加载操作时进行单个调用
重要
如果投影定义包括预传递子查询,则 batch-args 在名称和顺序上必须与预传递 UDTF 输出列完全匹配。
-
prepass-udtf(prepass-args)
- 要在执行每个加载操作(例如 COPY 或 INSERT)时调用的 预传递 UDTF。
如果在子查询中指定,则预传递 UDTF 会将转换的数据返回给批量查询,以做进一步处理。否则,预传递查询结果将添加至投影数据存储。
-
OVER (PARTITION { BATCH | PREPASS } BY partition-column-expr[,...]
- 指定 UDTF 类型以及如何对其返回的数据进行分区:
在两种情况下,OVER 子句会指定要借助于 SELECT 列表中的一个或多个列表达式进行分区。第一个 partition-column-expr 是 SELECT 列表中的第一个列表达式,第二个 partition-column- expr 是 SELECT 列表中的第二个列表达式,依此类推。
注意
投影在 PARTITION BY 列上隐式地分段和排序。
-
AS (batch-output-columns) AS (prepass-output-columns)
- (可选)命名 UDTF 返回的列。
如果预传递子查询忽略此子句,则外部批量查询 UDTF 实参 (batch-args) 必须引用列名称,像它们在预传递 UDTF 中定义的那样。
-
table [[AS] alias]
- 指定投影的锚表,可选择性地由别名限定。
-
sq-results
- 返回到外部批量 UDTF 的子查询结果集。
特权
非超级用户:
示例
请参阅 预聚合 UDTF 结果。
5 - 编码类型
Vertica 支持各种编码和压缩类型,由以下 ENCODING
参数实参指定:
创建投影时,您可以在投影列上设置编码类型。您还可以使用 ALTER TABLE...ALTER COLUMN 更改给定表的一个或多个投影列的编码。
AUTO(默认)
AUTO 对于已排序、多值的列是理想的方案,如对于主键。除此之外,它还适用于其他编码或压缩方案不适用的一般用途。因此,在未指定编码/压缩类型的情况下,它将作为默认类型。
- BINARY/VARBINARY
BOOLEAN
CHAR/VARCHAR
FLOAT
- 基于 Lempel-Ziv-Oberhumer (LZO) 的压缩
- DATE/TIME/TIMESTAMP
INTEGER
INTERVAL
- 基于连续列值之间的增量的压缩方案。
此类型对 CPU 的要求相对较小。最坏的情况,LZO 数据可能膨胀百分之八 (8%),整数数据可能膨胀百分之二十 (20%)。
BLOCK_DICT
对于每个存储块,Vertica 会将不同列值编译到词典中,然后存储词典和索引列表,用以表示该数据块。
BLOCK_DICT 对于少值、未排序的列是理想方案,因为在这种情况下,节省空间比编码速度更重要。某些类数据(如股票价格)经过排序后(如按股票代码和时间戳)在局部区域内通常都是少值的,很适合选择 BLOCK_DICT 方案。相反,CHAR/VARCHAR 列则不适合选择 BLOCK_DICT 编码。
包含 0x00 或 0xFF 字符的 CHAR 和 VARCHAR 列不应使用 BLOCK_DICT 编码。同样,BINARY/VARBINARY 列也不支持 BLOCK_DICT 编码。
BLOCK_DICT 编码需要占用的 CPU 要远远超过默认编码方案。最大数据膨胀率为百分之八 (8%)。
BLOCKDICT_COMP
此编码类型与 BLOCK_DICT 类似,只不过其词典索引为熵编码。此编码类型需要更多的 CPU 时间来编码和解码,其最坏情况性能较差。但如果值分布倾斜极为严重,使用 BLOCK_DICT_COMP
编码可节省空间。
BZIP_COMP
BZIP_COMP 编码对块内容使用 bzip2 压缩算法。有关更多信息,请参阅 bzip 网站。此算法的压缩率较自动 LZO 和 gzip 编码高;但它需要更多的 CPU 时间执行压缩。此算法最好用于大型字符串列,例如 VARCHAR、VARBINARY、CHAR 和 BINARY。如果想牺牲加载速度,换取较高的数据压缩率,那么请选择此编码类型。
COMMONDELTA_COMP
此压缩方案会为块中所有增量构建一个词典,然后使用熵编码将索引存储到增量词典中。
对于已排序的 FLOAT 和基于 INTEGER (DATE/TIME/TIMESTAMP/INTERVAL)、序列可预见且仅偶有序列断点的数据列(如按周期性间隔记录的时间戳,或者主键),此方案是理想选择。例如,以下序列的压缩效果很好:300, 600, 900, 1200, 1500, 600, 1200, 1800, 2400。以下序列的压缩效果则很差:1, 3, 6, 10, 15, 21, 28, 36, 45, 55。
如果增量分布非常好,那么列将能够以每行少于一个字节的方式存储。但是,此方案会占用大量的 CPU。如果对增量很随意的数据使用此方案,那么可能引发大幅度的数据膨胀。
DELTARANGE_COMP
此压缩方案主要用于浮点数据;它以相对于上一个值的增量的形式存储各值。
对于已排序或限定在一定范围内的多值 FLOAT 列,此方案是理想选择。请勿对包含 NULL 值的未排序列使用此方案,因为表示 NULL 值所消耗的存储量非常高。此方案的压缩和解压过程的损耗都很高。
要确定 DELTARANGE_COMP 是否适合特定数据集,可以将其与其他方案进行对比。要确保与投影使用相同的排序顺序,且要选择将以连续方式存储在数据库中的示例数据。
DELTAVAL
对于 INTEGER 和 DATE/TIME/TIMESTAMP/INTERVAL 列,将以与数据库中最小值的差的形式记录数据。此编码对于其他数据类型没有任何作用。
DELTAVAL 最适合多值、未排序整数或基于整数的列。此编码类型对 CPU 的要求最低,而且数据永不会膨胀。
GCDDELTA
对于 INTEGER 和 DATE/TIME/TIMESTAMP/INTERVAL 列,以及只有 18 位或少于 18 位的 NUMERIC 列,将以与数据块中最小值的差除以块中所有条目的最大公约数 (GCD) 的形式存储数据。此编码对于其他数据类型没有任何作用。
ENCODING GCDDELTA 最适合值为同一因子倍数情况下的多值、未排序、整数列或基于整数的列。例如,时间戳在内部以微秒为单位存储,因此,仅精确到毫秒的数据均为 1000 倍。GCDDELTA 编码类型的解码过程对 CPU 的要求最低,且数据永不膨胀,但 GCDDELTA 的编码时间要比 DELTAVAL 长。
GZIP_COMP
此编码类型使用 gzip 压缩算法。有关更多信息,请参阅 gzip 网站。此算法的压缩效果要比自动 LZO 压缩好,但比 BZIP_COMP 的压缩率低。它执行压缩占用的 CPU 时间比 LZO 多,比 BZIP_COMP 少。此算法最好用于大型字符串列,例如 VARCHAR、VARBINARY、CHAR 和 BINARY。想要压缩效果比 LZO 好、占用的 CPU 时间比 bzip2 少时,请使用此编码。
RLE
RLE(运行长度编码)将相同值的序列(运行)替换为包含值和出现次数的单个对。因此,它最适合出现在投影的 ORDER BY 子句中的低基数列。
Vertica 执行引擎按逐个运行的方式处理 RLE 编码,Vertica 优化器优先处理 RLE 编码。仅在运行长度较长时(如存储低基数列时)使用此类型。
Zstandard 压缩
Vertica 支持三种 ZSTD 压缩类型:
-
ZSTD_COMP
提供高压缩率。此编码类型的压缩率高于 gzip。想要压缩效果比 gzip 好时,请使用此编码。对于一般用例,请使用此编码或 ZSTD_FAST_COMP
编码类型。
-
ZSTD_FAST_COMP
使用 zstd 库提供的最快压缩级别。它是 zstd 库中最快的编码类型,但比其他两种编码类型占用更多空间。对于一般用例,请使用此编码或 ZSTD_COMP
编码类型。
-
ZSTD_HIGH_COMP
提供 zstd 库中的最佳压缩。它比其他两种编码类型慢。当您需要最佳压缩时,请使用此类型,但 CPU 时间较慢。
6 - GROUPED 子句
仅限企业模式
将两个或多个列分组到单个磁盘文件。这样可以将以下工作负载的 I/O 降到最低:
-
读取表中大部分的列。
-
执行单个行查找。
-
针对大量小型列进行查询。
-
频繁更新这些列中的数据。
如果您具有始终同时访问的数据并且这些数据不会在谓词中使用,那么可以通过分组这些列来提高查询性能。一旦分组,查询将不再独立于组中的其他列从磁盘独立检索单个列的所有数据。
注意
当 RLE 列分组成为一个或多个非 RLE 列时,RLE 编码会减少。
对列分组时,您可以:
注意
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;
7 - 哈希分段子句
指定如何对投影数据进行分段,以便在所有群集节点上分布数据。您可以为表和投影指定分段。如果表定义指定了分段,则 Vertica 会将其用于该表的自动投影。
强烈建议使用 Vertica 的
HASH
内置函数,该函数可在整个群集中均匀分布数据,且便于实现最佳查询执行。
语法
SEGMENTED BY expression ALL NODES [ OFFSET offset ]
参数
-
SEGMENTED BY expression
- 常用的 SQL 表达式。哈希分段是首选分段方法。Vertica 建议使用其内置的
HASH
函数,该函数的实参解析为表列。如果使用 HASH
之外的表达式,Vertica 会发出警告。
分段表达式应指定具有大量唯一数据值和在数据分布中可接受的偏离的列。通常,符合这些条件的主键列适合用于哈希分段。
有关详细信息,请参阅下面的表达式要求。
ALL NODES
- 创建投影时,会自动在所有节点中均匀分布数据。节点顺序是固定的。
-
OFFSET offset
- 基于零的偏移表示在哪个节点上开始分段分布。
此选项对于
CREATE TABLE
和
CREATE TEMPORARY TABLE
无效。
重要
如果使用 OFFSET
选项为表创建投影,请确保为每个投影段创建足够的副本以满足系统 K-safety;否则,Vertica 会将投影视为不安全,且无法使用它来查询表。
通过组合使用 CREATE PROJECTION
语句中的 OFFSET
和
KSAFE
选项来创建投影,您可以确保 K-safety 合规性。执行此语句时,Vertica 会自动创建必要数量的投影副本。
表达式要求
分段表达式在指定表列时必须按照其在源表中定义的那样进行指定。不支持投影列名称。
以下限制适用于分段表达式:
-
所有叶表达式都必须为常数或 CREATE PROJECTION
的 SELECT
列表中的列的列引用。
-
表达式在数据库的整个使用过程中都必须返回相同的值。
-
不允许集合函数。
-
表达式必须返回
0 <= x < 263
范围内的非负 INTEGER
值,且值通常均匀分布在该范围内。
注意
如果表达式产生超出预期范围的值,例如负值,不会发生错误,并且会将行添加到投影的第一个段。
示例
以下 CREATE PROJECTION
语句将创建投影 public.employee_dimension_super
。它指定包含表 public.employee_dimension
中的所有列。哈希分段子句将调用 Vertica HASH
函数,对列 employee_key
中的投影数据进行分段;此外,它还包括 ALL NODES
子句,指定在群集中的所有节点上均匀分布投影数据:
=> CREATE PROJECTION public.employee_dimension_super
AS SELECT * FROM public.employee_dimension
ORDER BY employee_key
SEGMENTED BY hash(employee_key) ALL NODES;
8 - 未分段子句
指定在整个群集的所有节点上分发表或投影数据的相同副本。使用此子句有助于对因太小而无法从分段中受益的表和投影执行分布式查询。
Vertica 使用相同的名称来标识未分段投影的所有实例。有关投影名称约定的详细信息,请参阅投影命名。
语法
UNSEGMENTED ALL NODES
示例
此示例为表 store.store_dimension
创建一个未分段的投影:
=> CREATE PROJECTION store.store_dimension_proj (storekey, name, city, state)
AS SELECT store_key, store_name, store_city, store_state
FROM store.store_dimension
UNSEGMENTED ALL NODES;
CREATE PROJECTION
=> SELECT anchor_table_name anchor_table, projection_name, node_name
FROM PROJECTIONS WHERE projection_basename='store_dimension_proj';
anchor_table | projection_name | node_name
-----------------+----------------------+------------------
store_dimension | store_dimension_proj | v_vmart_node0001
store_dimension | store_dimension_proj | v_vmart_node0002
store_dimension | store_dimension_proj | v_vmart_node0003
(3 rows)