REFRESH_COLUMNS
刷新使用约束 SET USING 或 DEFAULT USING 定义的表列。与 REFRESH_COLUMNS 调用关联的所有刷新操作属于同一个事务。因此,必须刷新 REFRESH_COLUMNS 指定的所有表和列;否则,整个操作将回退。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
REFRESH_COLUMNS ( 'table‑list', '[column‑list]'
[, '[refresh‑mode ]' [, min‑partition‑key, max‑partition‑key] ]
)
参数
- table‑list
- 要刷新的表的逗号分隔列表:
[[database.]schema.]table[,...]
重要
如果指定多个表,参数 刷新模式 必须设置为 REBUILD。 - column‑list
- 要刷新的列的逗号分隔列表,指定如下:
-
[[[database.]schema.]table.]column[,...]
-
[[database.]schema.]table.*
其中星号 (
*
) 指定刷新 表 中的所有 SET USING/DEFAULT USING 列。例如:SELECT REFRESH_COLUMNS ('t1, t2', 't1.*, t2.b', 'REBUILD');
如果 column‑list 设置为空字符串 (
''
),REFRESH_COLUMNS 会刷新指定表中的所有 SET USING/DEFAULT USING 列。需要满足以下要求:
-
所有指定列必须具有 SET USING 或 DEFAULT USING 约束。
-
如果 REFRESH_COLUMNS 指定多个表,则所有列名必须通过其表名进行限定。如果目标表跨越多个架构,则所有列名必须通过其架构和表名完全限定。例如:
SELECT REFRESH_COLUMNS ('t1, t2', 't1.a, t2.b', 'REBUILD');
如果指定一个数据库,它必须是当前数据库。
-
- refresh‑mode
- 指定如何刷新 SET USING 列:
-
UPDATE :将原始行标记为已删除并用新行替换它们。为了保存这些更新,您必须发出 COMMIT 语句。
-
REBUILD: 替换指定列中的所有数据。重建操作是自动提交的。
如果设置为空字符串或被忽略,则在 UPDATE 模式下执行 REFRESH_COLUMNS。如果指定多个表,则必须显式指定 REBUILD 模式。
在这两种情况下,如果任何 SET USING 列定义为 强制执行约束的表中的主键或唯一键,则 REFRESH_COLUMNS 将返回错误。
有关使用 REBUILD 选项的限制,请参阅 REBUILD 模式限制。
-
- min‑partition‑key
max‑partition‑key - 限定 REBUILD 模式,将重建操作限定在一个或多个分区。要指定分区范围,max-partition-key 必须大于 min-partition-key。要更新某个分区,两个实参必须相等。
需要满足以下要求:
-
函数只能指定一个表进行刷新。
-
表必须在指定的键上进行分区。
您可以使用这些实参通过最近加载的数据(即最新分区中的数据)刷新列。定期使用此选项可以显著降低因重建大型表中的整个列而产生的开销。
有关详细信息,请参阅下文中的基于分区的 REBUILD。
-
特权
-
查询表和平展表的架构:USAGE
-
查询表:SELECT
-
平展表:SELECT、UPDATE
UPDATE 与 REBUILD 模式
通常,当对 SET USING 列数据的更改仅限于相对较少的行数时,选择 UPDATE 模式较为妥当。如果大量 SET USING 列数据过时且必须更新,请使用 REBUILD 模式。无论在任何新 SET USING 列上使用 REBUILD 调用 REFRESH_COLUMNS 都是一种很好的做法 — 例如,在使用 ALTER TABLE...ADD COLUMN 添加 SET USING 列之后对其进行填充。
REBUILD 模式限制
如果在 SET USING 列上调用 REFRESH_COLUMNS 并将刷新模式指定为 REBUILD,则 Vertica 会在以下任何一项中指定该列时返回错误:
-
表的分区键
-
未分段的投影
-
任何投影的排序顺序或分段
-
忽略列的 SET USING 表达式中引用的锚表列的任何投影
-
任何投影的 GROUPED 子句
基于分区的 REBUILD 操作
如果对平展表进行分区,则可通过指定一个或多个分区键来降低在 REBUILD 模式下调用 REFRESH_COLUMNS 的开销。这样做会将重建操作限制到指定的分区。例如,通过 SET USING 列 cust_name
定义表 public.orderFact
。此表在列 order_date
上进行分区,其中分区子句调用 Vertica 函数 CALENDAR_HIERARCHY_DAY。因此,您可以对此表的特定时间分隔分区调用 REFRESH_COLUMNS — 在本例中,是指对过去两个月的订单调用:
=> SELECT REFRESH_COLUMNS ('public.orderFact',
'cust_name',
'REBUILD',
TO_CHAR(ADD_MONTHS(current_date, -2),'YYYY-MM')||'-01',
TO_CHAR(LAST_DAY(ADD_MONTHS(current_date, -1))));
REFRESH_COLUMNS
---------------------------
refresh_columns completed
(1 row)
重写 SET USING 查询
当您在平展表的 SET USING(或 DEFAULT USING)列中调用 REFRESH_COLUMNS 时,它将通过联接目标表和源表来执行 SET USING 查询。默认情况下,源表始终为联接的内表。大多数情况下,源表的基数小于目标表,因此 REFRESH_COLUMNS 有效地执行联接。
有时,特别是当您在分区表上调用 REFRESH_COLUMNS 时,源表有可能比目标表更大。在这种情况下,联接操作的性能可能欠佳。
您可以通过启用配置参数 RewriteQueryForLargeDim 来解决此问题。启用 (1) 后,Vertica 将反转目标表和源表之间的内部和外部联接,以此重写查询。
重要
仅当 SET USING 源数据所在的表大于目标表时,才启用此参数。如果源数据所在的表小于目标表,则启用 RewriteQueryForLargeDim 会对刷新性能产生不利影响。示例
请参阅 修整表示例 和 DEFAULT 与 SET USING。