实体化 Flex 表
创建 Flex 表后,您可以更改表结构以将虚拟列提升为实体化(实际)列。如果您的表已经为混合表,您可以更改现有的实际列,并提升其他重要的虚拟列。本节介绍了提升列、添加列、指定约束和声明默认值的一些关键环节。还介绍了加载 Flex 表或混合表与加载列式表相比的一些区别。
注意
通过将虚拟列提升为实际列来实现虚拟列的实体化,可以显著提高查询性能。Vertica 建议您先实体化重要的虚拟列,然后再运行大型和复杂的查询。提升后的列可导致加载性能稍有降低。将列添加到 Flex 表
将列添加到 Flex 表以提升虚拟列:
-
添加名称与虚拟列 (
user.name) 相同的实际列:=> ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR; ALTER TABLE -
将一些数据加载到表中。
=> COPY darkdata1 FROM '/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); Rows Loaded ------------- 12 (1 row) -
查询实体化列。请注意,加载数据将自动填充列。空行表示没有值或 NULL:
=> SELECT "user.name" FROM darkdata1; user.name --------------------- I'm Toasterâ¥Flu Beach seydo shiThe End Uptown gentleman.~G A B R I E L A â¿ Avita Desailaughing at clouds. (12 rows)
添加具有默认值的列
将数据批量加载到 Flex 表中一节介绍了默认值的使用情况以及 Vertica 如何在加载过程中对其进行评估。与所有的表一样,使用 COPY 加载数据会忽略所有的列默认值。
注意
要将表列默认表达式添加到 Flex 表,需要将列转换成显式数据类型。-
创建具有列定义的
darkdata1表。以下示例使用的列名称 (talker) 与虚拟列名称不对应。指定带虚拟列名称的默认值。在此示例中,列talker的默认值为 ("user.lang")。由于user.lang是LONG VARBINARY __raw__列中的一个虚拟列,您必须将它的值转换成VARCHAR以匹配talker列定义:=> CREATE FLEX TABLE darkdata1(talker VARCHAR default "user.lang"::VARCHAR); CREATE TABLE -
加载一些 JSON 数据,并指定
__raw__列:=> COPY darkdata1 (__raw__) FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); Rows Loaded ------------- 12 (1 row) -
查询
talker列。请注意,Vertica 之所以使用默认列值 ("user.lang"),是因为您指定了__raw__。空行表示没有值或 NULL:=> SELECT "talker" FROM darkdata1; talker -------- it en es en en es tr en (12 rows) -
更改表以添加具有已知虚拟列名称 (
user.name) 的列,指定键名为默认值(推荐),并将其转换成 VARCHAR:=> ALTER TABLE darkdata1 ADD COLUMN "user.name" VARCHAR default "user.name"::VARCHAR; ALTER TABLE -
再次加载数据,这次不带
__raw__:=> COPY darkdata1 FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); -
查询两个实际列。请注意,
talker没有值,因为您没有指定__raw__列。user.lang列包含来自user.name虚拟列的值:=> SELECT "talker", "user.name" FROM darkdata1; talker | user.name --------+--------------------- | laughing at clouds. | Avita Desai | I'm Toaster⥠| | | | Uptown gentleman. | ~G A B R I E L A â¿ | Flu Beach | | seydo shi | The End (12 rows) -
再次加载数据,这次指定含有
user.name默认值表达式的 COPY 语句:=> COPY darkdata1 (__raw__, "user.name" as 'QueenElizabeth'::varchar) FROM '/test/vertica/flextable/DATA/tweets_12.json' PARSER fjsonparser(); Rows Loaded ------------- 12 (1 row) -
再次查询。请注意,实际列
talker具有默认值(您使用了__raw__)。按照COPY中的指定,"user.name" as 'QueenElizabeth'表达式覆盖了user.name的默认列值:=> SELECT "talker", "user.name" FROM darkdata1; talker | user.name --------+---------------- it | QueenElizabeth en | QueenElizabeth es | QueenElizabeth | QueenElizabeth | QueenElizabeth | QueenElizabeth en | QueenElizabeth en | QueenElizabeth es | QueenElizabeth | QueenElizabeth tr | QueenElizabeth en | QueenElizabeth (12 rows)
总之,作为 ALTER TABLE...ADD COLUMN 操作的一部分,您可以设置默认列值。实体化列时,默认值应该引用虚拟列的键名(像在 "user.lang" 中一样)。随后加载带 COPY 值表达式的数据,可覆盖列定义的默认值。
更改 raw 列大小
您可以更改您计划创建的 Flex 表 __raw__ 列的默认大小,还可以更改现有 Flex 表的当前大小,或者同时更改上述两项。
要更改新 Flex 表中 __raw__ 列的默认大小,请设置 FlexTableRawSize 配置参数:
=> ALTER DATABASE DEFAULT SET FlexTableRawSize = 120000;
更改配置参数会影响到您在做出此更改后创建的所有 Flex 表。
要更改现有 Flex 表中 _raw_ 列的大小,请使用 ALTER TABLE 语句更改 raw 列的定义:
=> ALTER TABLE tester ALTER COLUMN __raw__ SET DATA TYPE LONG VARBINARY(120000);
ALTER TABLE
注意
如果您试图将__raw__ 列大小的值减至小于列中包含的任何数据,就会发生错误。
更改 Flex 表实际列
您可以对 Flex 表实际列(__raw__ 和 __identity__)而不能对任何虚拟列做出以下更改:
注意
虽然允许对__raw__ 列进行分段和分区,但因为其数据类型长而不建议这样做。默认情况下,如果不定义任何实际列,则 Flex 表将在 __identity__ 列上分段。
删除 Flex 表列
关于删除列,有两个注意事项:
-
您不能删除 Flex 表排序顺序中的最后一列。
-
如果您尚未创建带任何实际列的 Flex 表或尚未实体化任何列,则您不能删除
__identity__列。
更新 Flex 表视图
将新列添加到具有关联视图的 Flex 表时,系统不会更新视图的结果集,即便该视图使用了通配符 (*) 来表示所有表列。要整合新列,您必须重新创建视图。