此部分包含 Vertica 专用的投影管理函数。
投影函数
- 1: CLEAR_PROJECTION_REFRESHES
- 2: EVALUATE_DELETE_PERFORMANCE
- 3: GET_PROJECTION_SORT_ORDER
- 4: GET_PROJECTION_STATUS
- 5: GET_PROJECTIONS
- 6: PURGE_PROJECTION
- 7: REFRESH
- 8: REFRESH_COLUMNS
- 9: START_REFRESH
1 - CLEAR_PROJECTION_REFRESHES
从系统表 PROJECTION_REFRESHES 中清除信息投影刷新历史记录。
系统表 PROJECTION_REFRESHES 记录刷新操作成功和失败的相关信息。PROJECTION_REFRESHES 将保留投影刷新数据,直到出现以下事件之一为止:
-
给定的投影中开始出现另一个刷新操作。
-
CLEAR_PROJECTION_REFRESHES PROJECTION_REFRESHES 被调用并清除所有投影的数据。
-
已超出表的存储配额。
CLEAR_PROJECTION_REFRESHES 会检查 PROJECTION_REFRESHES 布尔列 IS_EXECUTING,以确定刷新操作是否仍在运行或已完成。该函数仅移除已完成的刷新操作的信息。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
CLEAR_PROJECTION_REFRESHES()
超级用户
示例
=> SELECT CLEAR_PROJECTION_REFRESHES();
CLEAR_PROJECTION_REFRESHES
----------------------------
CLEAR
(1 row)
另请参阅
2 - EVALUATE_DELETE_PERFORMANCE
针对潜在的 DELETE 和 UPDATE 性能问题对投影进行评估。如果 Vertica 发现任何问题,则会发出警告消息。在评估多个投影时,EVALUATE_DELETE_PERFORMANCE 将返回最多十个有问题的投影,以及列出其发现的所有问题的表的名称。
注意
EVALUATE_DELETE_PERFORMANCE 将返回明确引用删除性能的消息。但是请记住,相同的优化可使删除和更新操作均等受益。有关解决删除和更新性能问题的信息,请参阅 优化 DELETE 和 UPDATE。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
EVALUATE_DELETE_PERFORMANCE ( ['[[database.]schema.]scope'] )
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。scope
- 指定要评估的投影,为以下之一:
-
[table.]projection
评估 projection。例如:SELECT EVALUATE_DELETE_PERFORMANCE('store.store_orders_fact.store_orders_fact_b1');
-
表
指定评估 table 的所有投影。例如:SELECT EVALUATE_DELETE_PERFORMANCE('store.store_orders_fact');
如果未提供实参,EVALUATE_DELETE_PERFORMANCE 将评估您可以访问的所有投影。根据数据库的大小,这可能会产生很大的开销。
-
特权
非超级用户:对锚表的 SELECT 权限
示例
EVALUATE_DELETE_PERFORMANCE 会针对潜在的 DELETE 和 UPDATE 性能问题对表 exampl
e 的所有投影进行评估。
=> create table example (A int, B int,C int);
CREATE TABLE
=> create projection one_sort (A,B,C) as (select A,B,C from example) order by A;
CREATE PROJECTION
=> create projection two_sort (A,B,C) as (select A,B,C from example) order by A,B;
CREATE PROJECTION
=> select evaluate_delete_performance('example');
evaluate_delete_performance
---------------------------------------------------
No projection delete performance concerns found.
(1 row)
上一示例表明,one_sort 和 two_sort 这两个投影不存在会引发 DELETE 性能降低的固有结构问题。但如果排序后的列不能唯一标识一行或小量行,则投影中包含的数据可能产生潜在删除问题。
在下面的示例中,Perl 用于通过嵌套的循环系列来为表填充数据:
-
内部循环填充列
C.
-
中间循环填充列
B
。 -
外部循环填充列
A
。
结果为:列 A
仅包含三个非重复值(0、1 和 2),而列 B
在 20 和 0 之间缓慢变化,列 C
则在每行中均有变化:
=> \\! perl -e 'for ($i=0; $i<3; $i++) { for ($j=0; $j<21; $j++) { for ($k=0; $k<19; $k++) { printf "%d,%d,%d\n", $i,$j,$k;}}}' | /opt/vertica/bin/vsql -c "copy example from stdin delimiter ',' direct;"
Password:
=> select * from example;
A | B | C
---+----+----
0 | 20 | 18
0 | 20 | 17
0 | 20 | 16
0 | 20 | 15
0 | 20 | 14
0 | 20 | 13
0 | 20 | 12
0 | 20 | 11
0 | 20 | 10
0 | 20 | 9
0 | 20 | 8
0 | 20 | 7
0 | 20 | 6
0 | 20 | 5
0 | 20 | 4
0 | 20 | 3
0 | 20 | 2
0 | 20 | 1
0 | 20 | 0
0 | 19 | 18
...
2 | 1 | 0
2 | 0 | 18
2 | 0 | 17
2 | 0 | 16
2 | 0 | 15
2 | 0 | 14
2 | 0 | 13
2 | 0 | 12
2 | 0 | 11
2 | 0 | 10
2 | 0 | 9
2 | 0 | 8
2 | 0 | 7
2 | 0 | 6
2 | 0 | 5
2 | 0 | 4
2 | 0 | 3
2 | 0 | 2
2 | 0 | 1
2 | 0 | 0
=> SELECT COUNT (*) FROM example;
COUNT
-------
1197
(1 row)
=> SELECT COUNT (DISTINCT A) FROM example;
COUNT
-------
3
(1 row)
再次对投影运行 EVALUATE_DELETE_PERFORMANCE,以确定投影内的数据是否会引发任何潜在的 DELETE 性能问题。投影 one_sort
具有潜在的删除性能问题,因为它仅按照具有较少非重复值的列 A 进行排序。排序列中的各值与投影中的多个行对应,而这对 DELETE 性能有负面影响。相反,投影 two_sort
按照列 A
和列 B
进行排序,两个排序列中的每个值组合均可以仅标识少数行,便于删除操作快速执行:
=> select evaluate_delete_performance('example');
evaluate_delete_performance
---------------------------------------------------
The following projections exhibit delete performance concerns:
"public"."one_sort_b1"
"public"."one_sort_b0"
See v_catalog.projection_delete_concerns for more details.
=> \x
Expanded display is on.
dbadmin=> select * from projection_delete_concerns;
-[ RECORD 1 ]------+------------------------------------------------------------------------------------------------------------------------------------------------------------
projection_id | 45035996273878562
projection_schema | public
projection_name | one_sort_b1
creation_time | 2019-06-17 13:59:03.777085-04
last_modified_time | 2019-06-17 14:00:27.702223-04
comment | The squared number of rows matching each sort key is about 159201 on average.
-[ RECORD 2 ]------+------------------------------------------------------------------------------------------------------------------------------------------------------------
projection_id | 45035996273878548
projection_schema | public
projection_name | one_sort_b0
creation_time | 2019-06-17 13:59:03.777279-04
last_modified_time | 2019-06-17 13:59:03.777279-04
comment | The squared number of rows matching each sort key is about 159201 on average.
如果忘记向 EVALUATE_DELETE_PERFORMANCE 提供实参,它将评估您可以访问的所有投影:
=> select evaluate_delete_performance();
evaluate_delete_performance
---------------------------------------------------------------------------
The following projections exhibit delete performance concerns:
"public"."one_sort_b0"
"public"."one_sort_b1"
See v_catalog.projection_delete_concerns for more details.
(1 row)
3 - GET_PROJECTION_SORT_ORDER
返回投影的 ORDER BY 子句中列的顺序。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_PROJECTION_SORT_ORDER( '[[database.]schema.]projection' );
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
projection
- 目标投影。
特权
非超级用户:对锚表的 SELECT 权限
示例
=> SELECT get_projection_sort_order ('store_orders_super');
get_projection_sort_order
--------------------------------------------------------------------------------------------
public.store_orders_super [Sort Cols: "order_no", "order_date", "shipper", "ship_date"]
(1 row)
4 - GET_PROJECTION_STATUS
返回与 projection 的状态相关的信息:
使用
[GET_PROJECTION_STATUS](#)
来监控投影数据刷新的进度。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_PROJECTION_STATUS ( '[[database.]schema.]projection' );
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
projection
- 要显示其状态的投影。
示例
=> SELECT GET_PROJECTION_STATUS('public.customer_dimension_site01');
GET_PROJECTION_STATUS
-----------------------------------------------------------------------------------------------
Current system K is 1.
# of Nodes: 4.
public.customer_dimension_site01 [Segmented: No] [Seg Cols: ] [K: 3] [public.customer_dimension_site04, public.customer_dimension_site03,
public.customer_dimension_site02]
[Safe: Yes] [UptoDate: Yes][Stats: Yes]
5 - GET_PROJECTIONS
返回指定锚表的投影的上下文和投影信息。
- 上下文信息
-
数据库 K-safety
-
数据库节点数
-
此表的投影的数量
-
- 投影数据
- 对于每个投影,指定:
-
所有伙伴实例投影
-
是否分段
-
是否 安全
-
是否为最新。
-
还可以使用 GET_PROJECTIONS
来监控投影数据的刷新进度。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_PROJECTIONS ( '[[database.]schema-name.]table' )
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。-
表
- 要列出的投影的锚表。
特权
无
示例
以下示例将获取有关 VMart 表 store.store_dimension
的投影的信息:
=> SELECT GET_PROJECTIONS('store.store_dimension');
-[ RECORD 1 ]---+
GET_PROJECTIONS | Current system K is 1.
# of Nodes: 3.
Table store.store_dimension has 2 projections.
Projection Name: [Segmented] [Seg Cols] [# of Buddies] [Buddy Projections] [Safe] [UptoDate] [Stats]
----------------------------------------------------------------------------------------------------
store.store_dimension_b1 [Segmented: Yes] [Seg Cols: "store.store_dimension.store_key"] [K: 1] [store.store_dimension_b0] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]
store.store_dimension_b0 [Segmented: Yes] [Seg Cols: "store.store_dimension.store_key"] [K: 1] [store.store_dimension_b1] [Safe: Yes] [UptoDate: Yes] [Stats: RowCounts]
6 - PURGE_PROJECTION
从物理存储空间中永久移除已删除的数据,以便可以重新使用磁盘空间。您可以清除包含 Ancient History Mark 时期之前的历史数据。
当心
PURGE_PROJECTION
在清除数据时可能会占用大量磁盘空间。
有关清除操作的详细信息,请参阅
PURGE
。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
PURGE_PROJECTION ( '[[database.]schema.]projection' )
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。- projection
- 要清除的投影。
特权
-
表所有者
-
对架构的 USAGE 权限
示例
以下示例将清除 Ancient History Mark 时期之前的投影 tbl_p
中的所有历史数据。
=> CREATE TABLE tbl (x int, y int);
CREATE TABLE
=> INSERT INTO tbl VALUES(1,2);
OUTPUT
--------
1
(1 row)
=> INSERT INTO tbl VALUES(3,4);
OUTPUT
--------
1
(1 row)
dbadmin=> COMMIT;
COMMIT
=> CREATE PROJECTION tbl_p AS SELECT x FROM tbl UNSEGMENTED ALL NODES;
WARNING 4468: Projection <public.tbl_p> is not available for query processing.
Execute the select start_refresh() function to copy data into this projection.
The projection must have a sufficient number of buddy projections and all nodes must be up before starting a refresh
CREATE PROJECTION
=> SELECT START_REFRESH();
START_REFRESH
----------------------------------------
Starting refresh background process.
=> DELETE FROM tbl WHERE x=1;
OUTPUT
--------
1
(1 row)
=> COMMIT;
COMMIT
=> SELECT MAKE_AHM_NOW();
MAKE_AHM_NOW
-------------------------------
AHM set (New AHM Epoch: 9066)
(1 row)
=> SELECT PURGE_PROJECTION ('tbl_p');
PURGE_PROJECTION
-------------------
Projection purged
(1 row)
另请参阅
7 - REFRESH
在前台同步刷新一个或多个表投影,并更新 PROJECTION_REFRESHES 系统表。如果在不使用实参的情况下运行 REFRESH,则它会刷新所有包含过时数据的投影。
有关投影刷新的详细信息,请参阅刷新投影。
如果刷新会违反表或架构磁盘配额,操作将失败。有关详细信息,请参阅磁盘配额。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
REFRESH ( [ '[[database.]schema.]table[,...]' ] )
参数
-
[database.]schema
数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。- 表
- 要刷新的投影的锚表。如果指定多个表,REFRESH 会尝试并行刷新。此类调用将包含在 Database Designer 部署(和部署脚本)中。
返回
注意
如果 REFRESH 未刷新任何投影,则会返回不包含结果的标头字符串。Projection Name
- 作为刷新目标的投影。
Anchor Table
- 投影的关联锚表。
Status
- 投影的刷新状态:
-
queued
:排队等待刷新。 -
refreshing
:正在刷新。 -
refreshed
:已成功完成刷新。 -
failed
:未成功完成刷新。
-
Refresh Method
- 用于刷新投影的方法。
Error Count
- 投影刷新失败的次数。
Duration (sec)
- 投影刷新运行的时间(以秒为单位)。
特权
- 超级用户
-
指定表的所有者
刷新方法
Vertica 可以刷新其伙伴实例之一中的投影(如有)。在这种情况下,目标投影将获取源伙伴实例的历史数据。否则,将使用刷新操作时的最新时期数据从头开始刷新投影。在这种情况下,投影不能参与刷新操作之前的任何时期的历史查询。
要确定用来刷新给定投影的方法,请查询 PROJECTION_REFRESHES 系统表中的 REFRESH_METHOD 列。
示例
以下示例将刷新两个表中的投影:
=> SELECT REFRESH('t1, t2');
REFRESH
----------------------------------------------------------------------------------------
Refresh completed with the following outcomes:
Projection Name: [Anchor Table] [Status] [Refresh Method] [Error Count] [Duration (sec)]
----------------------------------------------------------------------------------------
"public"."t1_p": [t1] [refreshed] [scratch] [0] [0]"public"."t2_p": [t2] [refreshed] [scratch] [0] [0]
在以下示例中,仅刷新了一个表中的投影:
=> SELECT REFRESH('allow, public.deny, t');
REFRESH
----------------------------------------------------------------------------------------
Refresh completed with the following outcomes:
Projection Name: [Anchor Table] [Status] [Refresh Method] [Error Count] [Duration (sec)]
----------------------------------------------------------------------------------------
"n/a"."n/a": [n/a] [failed: insufficient permissions on table "allow"] [] [1] [0]
"n/a"."n/a": [n/a] [failed: insufficient permissions on table "public.deny"] [] [1] [0]
"public"."t_p1": [t] [refreshed] [scratch] [0] [0]
另请参阅
8 - 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。
9 - START_REFRESH
使用各自 锚表的最新数据刷新 当前架构中的投影。START_REFRESH 在后台异步运行,并更新PROJECTION_REFRESHES 系统表。正在运行刷新时,则此函数无效。
要仅刷新特定表的投影,请使用 REFRESH。当通过 Database Designer 部署设计 时,将自动刷新其投影。
如果刷新会违反表或架构磁盘配额,操作将失败。有关详细信息,请参阅磁盘配额。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
START_REFRESH()
特权
无
要求
所有节点必须开启。
刷新方法
Vertica 可以刷新其伙伴实例之一中的投影(如有)。在这种情况下,目标投影将获取源伙伴实例的历史数据。否则,将使用刷新操作时的最新时期数据从头开始刷新投影。在这种情况下,投影不能参与刷新操作之前的任何时期的历史查询。
要确定用来刷新给定投影的方法,请查询 PROJECTION_REFRESHES 系统表中的 REFRESH_METHOD 列。
示例
=> SELECT START_REFRESH();
START_REFRESH
----------------------------------------
Starting refresh background process.
(1 row)