这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
语句
SQL 查询的主结构是其语句。无论语句是独立存在还是多语句查询的一部分,每个语句都必须以分号结尾。以下示例包含四个通用 SQL 语句—CREATE TABLE、INSERT、SELECT 和 COMMIT:
=> CREATE TABLE comments (id INT, comment VARCHAR);
CREATE TABLE
=> INSERT INTO comments VALUES (1, 'Hello World');
OUTPUT
--------
1
(1 row)
=> SELECT * FROM comments;
id | comment
----+-------------
1 | Hello World
(1 row)
=> COMMIT;
COMMIT
=>
1 - ALTER 语句
ALTER 语句可用于更改现有数据库对象。
1.1 - ALTER ACCESS POLICY
对现有访问策略执行以下操作之一:
-
通过更改其表达式和启用/禁用策略来修改访问策略。
-
将访问策略从一个表复制到另一个表。
语法
修改策略:
ALTER ACCESS POLICY ON [[database.]schema.]table
{ FOR COLUMN column [ expression ] | FOR ROWS [ WHERE expression ] } { GRANT TRUSTED } { ENABLE | DISABLE }
复制政策:
ALTER ACCESS POLICY ON [[database.]schema.]table
{ FOR COLUMN column | FOR ROWS } COPY TO TABLE table;
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
表
- 包含要启用、禁用或复制的访问策略的表的名称。
-
FOR COLUMN column [expression]
- 替换之前为此列设置的访问策略表达式。从
FOR COLUMN
子句中省略 expression,以便仅启用或禁用此策略,或将其复制到其他表中。
-
FOR ROWS [WHERE expression]
- 替换之前为此表设置的行访问策略表达式。从
FOR ROWS
子句中省略
WHERE expression
,以便仅启用或禁用此策略,或将其复制到另一个表。
-
GRANT TRUSTED
指定 GRANT 语句在确定用户是否可以对目标表执行 DML 操作时优先于访问策略。如果省略,则只有在访问策略允许用户查看原始未更改状态的存储数据时,用户才能修改表数据。有关详细信息,请参阅访问策略和 DML 操作。
重要
GRANT TRUSTED 仅影响 DML 操作,并且不允许用户查看访问策略将屏蔽的数据。指定此选项可能允许具有某些授权的用户更新他们无法查看的数据。
ENABLE | DISABLE
- 指示在表级别启用还是禁用访问策略。
-
COPY TO TABLE tablename
- 将现有访问策略复制到指定的表。复制的访问策略包括启用/禁用和 GRANT TRUSTED 状态。
需要满足以下要求:
-
复制列访问策略:
-
目标表必须包含相同名称和兼容数据类型的列。
-
目标列不得包含访问策略。
-
复制行访问策略:目标表不得包含访问策略。
特权
修改访问策略
非超级用户:表的所有权
复制访问策略
非超级用户:源表和目标表的所有权
示例
请参阅 管理访问策略
另请参阅
CREATE ACCESS POLICY
1.2 - ALTER AUTHENTICATION
修改指定身份验证方法的设置。
语法
ALTER AUTHENTICATION auth_record {
| { ENABLE | DISABLE }
| { LOCAL | HOST [ { TLS | NO TLS } ] host_ip_address }
| RENAME TO new_auth_record_name
| METHOD value
| SET param=value[,...]
| PRIORITY value
| [ [ NO ] FALLTHROUGH ]
}
参数
特权
超级用户
示例
启用和禁用身份验证方法
本示例使用 ALTER AUTHENTICATION 禁用了 v_ldap
身份验证方法,然后再次启用了它:
=> ALTER AUTHENTICATION v_ldap DISABLE;
=> ALTER AUTHENTICATION v_ldap ENABLE;
重命名身份验证方法
以下示例将 v_kerberos
身份验证方法重命名为 K5
。所有被授予 v_kerberos
身份验证方法的用户现在都改为授予了 K5
方法。
=> ALTER AUTHENTICATION v_kerberos RENAME TO K5;
修改身份验证参数
本示例将 ident1
身份验证的系统用户设置为 user1
:
=> CREATE AUTHENTICATION ident1 METHOD 'ident' LOCAL;
=> ALTER AUTHENTICATION ident1 SET system_users='user1';
在使用 ALTER AUTHENTICATION 设置或修改 LDAP 或 Ident 参数时,Vertica 会对这些参数进行验证。
本示例将更改 IP 地址并为名为 Ldap1
. 的 LDAP 身份验证方法指定参数。为 LDAP 服务器指定捆绑参数。Vertica 将连接到对数据库客户端进行身份验证的 LDAP 服务器。如果身份验证成功,Vertica 将在指定 LDAP 服务器上对被关联到(被授予)Ldap1
身份验证方法的任何用户进行身份验证:
=> CREATE AUTHENTICATION Ldap1 METHOD 'ldap' HOST '172.16.65.196';
=> ALTER AUTHENTICATION Ldap1 SET host='ldap://172.16.65.177',
binddn_prefix='cn=', binddn_suffix=',dc=qa_domain,dc=com';
下一个示例将为名为 Ldap2
的 LDAP 身份验证方法指定参数。指定 LDAP 搜索和捆绑参数。有时 Vertica 没有足够的信息为尝试进行身份验证的用户创建可分辨名称 (Distinguished Name, DN)。在这种情况下,必须指定使用 LDAP 搜索和捆绑:
=> CREATE AUTHENTICATION Ldap2 METHOD 'ldap' HOST '172.16.65.196';
=> ALTER AUTHENTICATION Ldap2 SET basedn='dc=qa_domain,dc=com',
binddn='cn=Manager,dc=qa_domain,
dc=com',search_attribute='cn',bind_password='secret';
更改身份验证方法
本示例将 localpwd
身份验证从 hash 更改为trust:
=> CREATE AUTHENTICATION localpwd METHOD 'hash' LOCAL;
=> ALTER AUTHENTICATION localpwd METHOD 'trust';
设置多领域
此示例为身份验证方法 krb_local 设置了其他领域:
=> ALTER AUTHENTICATION krb_local set realm = 'COMPANY.COM';
另请参阅
1.3 - ALTER CA BUNDLE
添加证书、从证书颁发机构 (CA) 捆绑包中移除证书或更改证书颁发机构 (CA) 捆绑包的所有者。
语法
ALTER CA BUNDLE name
[ADD CERTIFICATES ca_cert[, ca_cert[, ...]]
[REMOVE CERTIFICATES ca_cert[, ca_cert[, ...]]
[OWNER TO user]
参数
name
- CA 捆绑包的名称。
ca_cert
- 要添加或从捆绑包中移除的 CA 证书的名称。
user
- 数据库用户的名称。
特权
CA 捆绑包的所有权。
示例
请参阅管理 CA 捆绑包。
另请参阅
1.4 - ALTER DATABASE
使用 ALTER DATABASE 可执行以下任务:
-
从数据库中删除所有容错组及其子容错组。
-
还原故障节点,恢复活动备用节点至备用状态。
-
指定要用于导入/导出的公用网络的子网名称。
-
设置和清除数据库
配置参数。
要查看参数的当前值,请查询系统表 CONFIGURATION_PARAMETERS 或使用 SHOW DATABASE。
语法
ALTER DATABASE db-spec {
DROP ALL FAULT GROUP
| EXPORT ON { subnet‑name | DEFAULT }
| RESET STANDBY
| SET [PARAMETER] parameter=value [,...]
| CLEAR [PARAMETER] parameter[,...]
}
参数
- db-spec
- 指定要更改的数据库,为以下之一:
DROP ALL FAULT GROUP
- 删除所有容错组(在指定数据库上定义)。
EXPORT ON
- 指定用于导入和导出数据的网络,为以下之一:
-
subnet‑name:公用网络的子网。
-
DEFAULT
:指定使用专用网络。
有关详细信息,请参阅识别用于导入/导出的数据库或节点和更改节点导出地址。
RESET STANDBY
- 仅限 Enterprise 模式,还原所有不活动节点并恢复替换节点至待机状态。如果任何被替换节点无法恢复活动,Vertica 会将备用节点留在适当位置。
SET [PARAMETER]
- 设置指定参数。
CLEAR [PARAMETER]
- 将指定参数重置为其默认值。
特权
超级用户
1.5 - ALTER FAULT GROUP
修改现有容错组。例如,使用 ALTER FAULT GROUP
语句执行以下操作:
-
向现有容错组添加节点或从中删除节点
-
向父容错组添加子容错组或从中删除子容错组
-
重命名容错组
语法
ALTER FAULT GROUP fault-group-name {
| ADD NODE node-name
| DROP NODE node-name
| ADD FAULT GROUP child-fault-group-name
| DROP FAULT GROUP child-fault-group-name
| RENAME TO new-fault-group-name }
参数
fault-group-name
- 要修改的现有容错组名称。
node-name
- 要向现有(父)容错组添加或从中删除的节点的名称。
child-fault-group-name
- 要向现有父容错组添加或从中移除的子容错组的名称。
new-fault-group-name
- 要重命名的容错组的新名称。
特权
超级用户
示例
此示例显示了如何将 parent0
容错组重命名为 parent100
:
=> ALTER FAULT GROUP parent0 RENAME TO parent100;
ALTER FAULT GROUP
通过查询 FAULT_GROUPS 系统表来验证更改:
=> SELECT member_name FROM fault_groups;
member_name
----------------------
v_exampledb_node0003
parent100
mygroup
(3 rows)
另请参阅
1.6 - ALTER FUNCTION 语句
Vertica 为每种类型的用户定义的扩展 提供了 ALTER 语句。每个 ALTER 语句都会修改 Vertica 编录中用户定义的函数的元数据:
Vertica 还提供ALTER FUNCTION (SQL),可修改用户定义的 SQL 函数的元数据。
1.6.1 - ALTER AGGREGATE FUNCTION
更改用户定义的聚合函数。
语法
ALTER AGGREGATE FUNCTION [[db-name.]schema.]function‑name( [ parameter‑list ] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET SCHEMA new‑schema
}
参数
-
[db-name.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的 SQL 函数的名称。
-
arg‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE AGGREGATE FUNCTION
1.6.2 - ALTER ANALYTIC FUNCTION
更改用户定义的分析函数。
语法
ALTER ANALYTIC FUNCTION [[db-name.]schema.]function‑name( [ parameter‑list ] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET FENCED boolean‑expr
| SET SCHEMA new‑schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE ANALYTIC FUNCTION
1.6.3 - ALTER FILTER
更改用户定义的筛选器。
语法
ALTER FILTER [[db-name.]schema.]function‑name( [ parameter‑list ] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET FENCED boolean‑expr
| SET SCHEMA new‑schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE FILTER
1.6.4 - ALTER FUNCTION (SQL)
更改用户定义的 SQL 函数。
语法
ALTER FUNCTION [[db-name.]schema.]function‑name( [arg‑list] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET SCHEMA new‑schema
}
参数
-
[db-name.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的 SQL 函数的名称。
- arg‑list
- 函数实参名称的逗号分隔列表。如果无列表,请指定一个空列表。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
示例
将函数 SQL_one
重命名为 SQL_two
:
=> ALTER FUNCTION SQL_one (int, int) RENAME TO SQL_two;
将函数 SQL_two
移动到架构 macros
:
=> ALTER FUNCTION SQL_two (int, int) SET SCHEMA macros;
重新分配 SQL_two
的所有权:
=> ALTER FUNCTION SQL_two (int, int) OWNER TO user1;
另请参阅
1.6.5 - ALTER FUNCTION(标量)
更改用户定义的标量函数。
语法
ALTER FUNCTION [[db-name.]schema.]function‑name( [ parameter‑list] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET FENCED boolean‑expr
| SET SCHEMA new‑schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
示例
将函数 UDF_one
重命名为 UDF_two
:
=> ALTER FUNCTION UDF_one (int, int) RENAME TO UDF_two;
将函数 UDF_two
移动到架构 macros
:
=> ALTER FUNCTION UDF_two (int, int) SET SCHEMA macros;
禁用函数 UDF_two
的隔离模式:
=> ALTER FUNCTION UDF_two (int, int) SET FENCED false;
另请参阅
CREATE FUNCTION(标量)
1.6.6 - ALTER PARSER
更改用户定义的解析器。
语法
ALTER PARSER [[db-name.]schema.]function‑name( [ parameter‑list ] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET FENCED boolean‑expr
| SET SCHEMA new‑schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE PARSER
1.6.7 - ALTER SOURCE
更改用户定义的加载源函数。
语法
ALTER SOURCE [[db-name.]schema.]function‑name( [ parameter‑list ] ) {
OWNER TO new‑owner
| RENAME TO new‑name
| SET FENCED boolean‑expr
| SET SCHEMA new‑schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE SOURCE
1.6.8 - ALTER TRANSFORM FUNCTION
更改用户定义的转换函数。
语法
ALTER TRANSFORM FUNCTION [[db-name.]schema.]function-name( [ parameter-list ] ) {
OWNER TO new-owner
| RENAME TO new-name
| SET FENCED { true | false }
| SET SCHEMA new-schema
}
-
[db-name.]schema
- 数据库和架构。默认架构为
public
。如果指定一个数据库,它必须是当前数据库。
-
function‑name
- 要更改的函数的名称。
-
parameter‑list
- 为此函数定义的参数的逗号分隔列表。如果无列表,请指定一个空列表。
注意
Vertica 支持函数过载,并使用参数列表标识要更改的函数。
-
OWNER TO new‑owner
- 将函数所有权转移给其他用户。
-
RENAME TO new‑name
- 重命名此函数。
SET FENCED { true | false }
- 指定是否为此函数启用隔离模式。
-
SET SCHEMA new‑schema
- 将函数移动到其他架构。
权限
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户还必须具备以下架构权限:
另请参阅
CREATE TRANSFORM FUNCTION
1.7 - ALTER HCATALOG SCHEMA
更改使用 CREATE HCATALOG SCHEMA 创建的架构上的参数值。HCatalog 连接器使用 HCatalog 架构访问存储在 Hive 数据仓库中的数据。有关详细信息,请参阅使用 HCatalog 连接器。
某些参数在创建后无法更改。如果需要更改其中一个值,请删除并重新创建架构。您可以使用 ALTER HCATALOG SCHEMA 更改以下参数:
-
HOSTNAME
-
PORT
-
HIVESERVER2_HOSTNAME
-
WEBSERVICE_HOSTNAME
-
WEBSERVICE_PORT
-
WEBHDFS_ADDRESS
-
HCATALOG_CONNECTION_TIMEOUT
-
HCATALOG_SLOW_TRANSFER_LIMIT
-
HCATALOG_SLOW_TRANSFER_TIME
-
SSL_CONFIG
-
CUSTOM_PARTITIONS
语法
ALTER HCATALOG SCHEMA schema-name SET [param=value]+;
参数
- schema‑name
- Vertica 编录中要更改的架构名称。Hive 数据库中的表通过此架构提供。
- param
- 要更改的参数的名称。
- value
- 参数的新值。必须指定值;此语句不会从类似
CREATE HCATALOG SCHEMA
的配置文件中读取默认值。
特权
以下几项之一:
示例
以下示例显示了如何更改 "hcat" 架构的 Hive 元存储主机名和端口。在此示例中,Hive 使用高可用性元存储。
=> ALTER HCATALOG SCHEMA hcat SET HOSTNAME='thrift://ms1.example.com:9083,thrift://ms2.example.com:9083';
以下示例显示了尝试设置不可更改的参数时收到的错误。
=> ALTER HCATALOG SCHEMA hcat SET HCATALOG_USER='admin';
ERROR 4856: Syntax error at or near "HCATALOG_USER" at character 39
1.8 - ALTER LIBRARY
替换当前与 Vertica 编录中的 UDx 库关联的库文件。Vertica 自动将更新文件的副本分发到所有群集节点。编录中定义的引用更新库的 UDx 将自动开始使用更新库文件。如果名称和签名匹配,则视为 UDx 相同。
当前库和替换库必须使用同一种语言编写。
当心
如果原始库中存在的某个 UDx 函数在更新后的库中不存在,则会自动将其删除。如果正在使用该函数,可能会导致数据丢失,例如,如果表依赖它填充列。
语法
ALTER LIBRARY [[database.]schema.]name [DEPENDS 'depends-path'] AS 'path';
参数
- 架构
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- name
- 使用 CREATE LIBRARY 创建的现有库的名称。
-
DEPENDS 'depends-path'
此库所依赖的文件或库,启动程序节点的文件系统或其他受支持的文件系统或对象存储中的一个或多个文件或目录。对于目录,路径条目以斜杠 (/
) 结束,后跟通配符 (*
)(可选)。要指定多个文件,请使用冒号 (:
) 分隔条目。
如果任何路径条目包含冒号(例如 URI),请在整个 DEPENDS 路径两端加上括号,且单个路径元素使用双引号,如下例所示:
DEPENDS '["s3://mybucket/gson-2.3.1.jar"]'
要指定具有多个目录级别的库,请参阅多级库依赖项。
DEPENDS 对使用 R 编写的库没有影响。R 软件包必须本地安装在每个节点上,包括外部依赖项。
重要
CREATE LIBRARY 的性能在 Eon 模式下会降低,这与 DEPENDS 子句指定的依赖关系的数量和深度成正比。
-
AS path
- 替换库文件在启动程序节点文件系统上的绝对路径。
特权
超级用户,或者架构上的 UDXDEVELOPER 和 CREATE。非超级用户必须明确启用 UDXDEVELOPER 角色。有关示例,请参阅 CREATE LIBRARY。
如果 DEPENDS 子句指定具有多个目录级别的库,Vertica 将按照库路径包含该库的所有子目录。例如,以下 CREATE LIBRARY 语句使 UDx 库 mylib
能够导入它在 site‑packages
的子目录中找到的所有 Python 包和模块:
=> CREATE LIBRARY mylib AS '/path/to/python_udx' DEPENDS '/path/to/python/site-packages' LANGUAGE 'Python';
重要
DEPENDS 可以指定深度达 100 级的 Java 库依赖项。
示例
此示例显示了如何使用新文件更新名为 myFunctions
的已定义库。
=> ALTER LIBRARY myFunctions AS '/home/dbadmin/my_new_functions.so';
另请参阅
开发用户定义的扩展 (UDx)
1.9 - ALTER LOAD BALANCE GROUP
更改负载均衡组的配置。
语法
ALTER LOAD BALANCE GROUP group-name {
RENAME TO new-name |
SET FILTER TO 'ip-cidr-addr' |
SET POLICY TO 'policy' |
ADD {ADDRESS | FAULT GROUP | SUBCLUSTER} add-list |
DROP {ADDRESS | FAULT GROUP | SUBCLUSTER} drop-list
}
参数
-
group-name
- 要更改的现有负载均衡组的名称。
-
RENAME TO new-name
- 将组重命名为 new-name。
-
SET FILTER TO 'ip-cidr-addr'
- 用于替换现有 IP 地址筛选器的 IPv4 或 IPv6 CIDR,该筛选器选择将容错组或子群集的哪些成员包括在负载均衡组中。此设置仅在负载均衡组包含容错组或子群集时有效。
-
SET POLICY TO 'policy'
- 更改负载均衡组为传入连接选择目标节点所使用的策略。可为以下之一:
有关详细信息,请参阅CREATE LOAD BALANCE GROUP。
ADD {ADDRESS | FAULT GROUP | SUBCLUSTER }
- 将指定类型的对象添加到负载均衡组。负载均衡组只能包含一种类型的对象。例如,如果使用地址列表创建负载均衡组,则只能添加附加地址,而不能添加容错组或子群集。
-
add-list
- 要添加到容错组的对象(地址、容错组或子群集)的逗号分隔列表。
DROP {ADDRESS | FAULT GROUP | SUBCLUSTER}
- 从负载均衡组(地址、容错组或子群集)中移除指定类型的对象。对象类型必须与负载均衡组中已有的对象的类型相匹配。
-
drop-list
- 要从负载均衡组中移除的对象的列表。
特权
超级用户
示例
从名为 group_2 的负载均衡组中移除地址。
=> SELECT * FROM LOAD_BALANCE_GROUPS;
name | policy | filter | type | object_name
---------+------------+--------+-----------------------+-------------
group_1 | ROUNDROBIN | | Network Address Group | node01
group_1 | ROUNDROBIN | | Network Address Group | node02
group_2 | ROUNDROBIN | | Network Address Group | node03
(3 rows)
=> ALTER LOAD BALANCE GROUP group_2 DROP ADDRESS node03;
ALTER LOAD BALANCE GROUP
=> SELECT * FROM LOAD_BALANCE_GROUPS;
name | policy | filter | type | object_name
---------+------------+--------+-----------------------+-------------
group_1 | ROUNDROBIN | | Network Address Group | node01
group_1 | ROUNDROBIN | | Network Address Group | node02
group_2 | ROUNDROBIN | | Empty Group |
(3 rows)
以下示例向名为 group_2 的组中添加了三个网络地址:
=> ALTER LOAD BALANCE GROUP group_2 ADD ADDRESS node01,node02,node03;
ALTER LOAD BALANCE GROUP
=> SELECT * FROM load_balance_groups WHERE name = 'group_2';
-[ RECORD 1 ]----------------------
name | group_2
policy | ROUNDROBIN
filter |
type | Network Address Group
object_name | node01
-[ RECORD 2 ]----------------------
name | group_2
policy | ROUNDROBIN
filter |
type | Network Address Group
object_name | node02
-[ RECORD 3 ]----------------------
name | group_2
policy | ROUNDROBIN
filter |
type | Network Address Group
object_name | node03
另请参阅
1.10 - ALTER MODEL
允许用户重命名现有模型、更改所有权或将其移动到其他架构。
语法
ALTER MODEL [[database.]schema.]model
{ OWNER TO owner
| RENAME TO new‑name
| SET SCHEMA schema
}
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
model
- 标识要更改的模型。
-
OWNER TO owner
- 将此模型的所有权重新分配给 owner。如果为非超级用户,则必须是当前所有者。
RENAME TO
- 重命名模式,其中 new‑name 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
SET SCHEMA schema
- 将模型从一个架构移动到另一个架构。
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户必须具备以下架构权限:
示例
请参阅更改模型。
1.11 - ALTER NETWORK ADDRESS
更改现有网络地址的配置。
语法
ALTER NETWORK ADDRESS name {
RENAME TO new-name
| SET TO 'ip-addr' [PORT port-number]
| { ENABLE | DISABLE }
}
参数
-
name
- 要更改的现有网络地址的名称。
-
RENAME TO new-name
- 将网络地址重命名为 new-name。此名称更改不会影响网络地址在负载均衡组中的成员身份。
-
SET TO 'ip-addr'
- 更改为网络地址分配的 IP 地址。
-
PORT port-number
- 设置网络地址的端口号。更改端口号时必须提供网络地址。
ENABLE | DISABLE
- 启用或禁用网络地址。
示例
将网络地址从 test_addr
重命名为 alt_node1
,然后将其 IP 地址更改为 192.168.1.200
,端口号为 4000
:
=> ALTER NETWORK ADDRESS test_addr RENAME TO alt_node1;
ALTER NETWORK ADDRESS
=> ALTER NETWORK ADDRESS alt_node1 SET TO '192.168.1.200' PORT 4000;
ALTER NETWORK ADDRESS
另请参阅
1.12 - ALTER NETWORK INTERFACE
重命名网络接口。
语法
ALTER NETWORK INTERFACE network-interface-name RENAME TO new-network-interface-name
参数
-
network-interface-name
- 现有网络接口的名称。
-
new-network-interface-name
- 网络接口的新名称。
特权
超级用户
示例
重命名网络接口:
=> ALTER NETWORK INTERFACE myNetwork RENAME TO myNewNetwork;
1.13 - ALTER NODE
设置和清除指定节点上的节点级别配置参数。ALTER NODE 还执行以下管理任务:
有关移除节点的信息,请参阅
语法
ALTER NODE node‑name {
EXPORT ON { network‑interface | DEFAULT }
| [IS] node‑type
| REPLACE [ WITH standby‑node ]
| RESET
| SET [PARAMETER] parameter=value[,...]
| CLEAR [PARAMETER] parameter[,...]
}
参数
- node‑name
- 要更改的节点的名称。
-
[IS] node‑type
- 更改节点类型,其中 node‑type 为以下之一:
-
PERMANENT:(默认值):存储数据的节点。
-
EPHEMERAL:从一种类型转换到另一种类型的节点——通常是从 PERMANENT 到 STANDBY 或 EXECUTE。
-
STANDBY:保留以在任何节点发生故障时替换该节点的节点。备用节点不存储段或数据,直到它被调用以替换故障节点。当用作替换节点时,Vertica 将其类型更改为 PERMANENT。有关详细信息,请参阅活动备用节点。
-
EXECUTE:该节点仅为计算目的而保留。执行节点不包含段或数据。
注意
仅 Enterprise 模式支持 STANDBY 和 EXECUTE 节点类型。
EXPORT ON
- 指定用于导入和导出数据的网络,为以下之一:
-
REPLACE [WITH standby‑node]
- 仅限 Enterprise 模式,将指定节点替换为可用的活动的备用节点。如果省略
WITH
子句,Vertica 会尝试从与故障节点相同的容错组中查找替换节点。
如果指定的节点未发生故障,Vertica 将忽略此语句。
RESET
- 仅限 Enterprise 模式,恢复指定的故障节点并使其替换节点返回到备用状态。如果故障节点无法恢复活动,Vertica 将忽略此语句并将备用节点留在原处。
SET [PARAMETER]
- 在节点级别将一个或多个配置参数设置为指定值。
CLEAR [PARAMETER]
- 清除一个或多个指定配置参数。
特权
超级用户
示例
指定使用 v_vmart_node0001
上公用网络的默认网络接口进行导入/导出操作:
=> ALTER NODE v_vmart_node0001 EXPORT ON DEFAULT;
将故障节点 v_vmart_node0001
替换为活动的备用节点,然后还原故障节点:
=> ALTER NODE v_vmart_node0001 REPLACE WITH standby1;
...
=> ALTER NODE v_vmart_node0001 RESET;
设置和清除配置参数 MaxClientSessions
:
=> ALTER NODE v_vmart_node0001 SET MaxClientSessions = 0;
...
=> ALTER NODE v_vmart_node0001 CLEAR MaxClientSessions;
将节点类型设置为 EPHEMERAL
:
=> ALTER NODE v_vmart_node0001 IS EPHEMERAL;
1.14 - ALTER NOTIFIER
更新现有通知程序。
注意
要更改与现有标识符关联的操作 URL,请
删除通知程序并重新创建。
语法
ALTER NOTIFIER notifier‑name
[ ENABLE | DISABLE ]
[ MAXPAYLOAD 'max‑payload‑size' ]
[ MAXMEMORYSIZE 'max‑memory‑size' ]
[ TLSMODE 'tls‑mode' ]
[ CA BUNDLE bundle‑name [ CERTIFICATE certificate‑name ] ]
[ IDENTIFIED BY 'uuid' ]
[ [NO] CHECK COMMITTED ]
[ PARAMETERS 'adapter‑params' ]
参数
- notifier‑name
- 指定要更新的通知程序。
[NO] CHECK COMMITTED
- 指定在发送队列中的下一条消息之前等待传递确认。并非所有消息传递系统都支持传递确认。
ENABLE | DISABLE
- 指定启用还是禁用通知程序。
MAXPAYLOAD
- 消息的最大大小,最大为 2 TB,以 KB、MB、GB 或 TB 为单位指定,如下所示:
MAXPAYLOAD integer{K|M|G|T}
默认设置特定于适配器,例如 Kafka 为 1 M。
对此参数的更改,在通知程序后禁用并重新启用或在数据库重新启动后生效。
MAXMEMORYSIZE
- 内部通知程序的最大大小,最大为 2 TB,以 KB、MB、GB 或 TB 为单位指定,如下所示:
MAXMEMORYSIZE integer{K|M|G|T}
如果队列超过此大小,通知程序将删除多余的消息。
-
TLSMODE 'tls‑mode'
指定通知程序和端点之间的连接类型,可以是以下类型之一:
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
CA BUNDLE bundle‑name
指定 CA 捆绑包。如果 TLSMODE
需要,捆绑包中的证书可用于验证 Kafka 服务器的证书。
如果为当前使用 disable
的通知程序指定了 CA 捆绑包,而不会验证 Kafka 服务器的证书,则在连接到 Kafka 服务器时,将不使用该捆绑包。除非将 TLSMODE
更改为验证服务器证书行为,否则此行为会持续存在。
对 CA 捆绑包内容的更改,在通知程序后禁用并重新启用或在数据库重新启动后生效。但是,对通知程序所用的 CA 捆绑包的更改会立即生效。
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
CERTIFICATE certificate‑name
指定一个供端点验证的客户端证书。
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
IDENTIFIED BY 'uuid'
- 指定通知程序的唯一标识符。如果设置,则此通知程序发布的所有消息都具有此属性。
-
PARAMETERS 'adapter‑params'
- 指定以字符串形式传递给适配器的一个或多个可选适配器参数。适配器参数仅适用于与通知程序关联的适配器。
对此参数的更改,在通知程序后禁用并重新启用或在数据库重新启动后生效。
对于 Kafka 通知程序,请参阅 Kafka 和 Vertica 配置设置。
特权
超级用户
SASL_SSL Kafka 配置的加密通知程序
按照此步骤,为使用 SASL_SSL 的 Kafka 端点创建或更改通知程序。请注意,每当您更改给定通知程序的 TLSMODE、证书或 CA 捆绑包时,都必须重复此步骤。
-
在设置 TLSMODE、证书和 CA 捆绑包时,使用 CREATE 或 ALTER 以禁用通知程序。
=> ALTER NOTIFIER encrypted_notifier
DISABLE
TLSMODE 'verify-ca'
CA BUNDLE ca_bundle2;
-
更改通知程序并为 SASL_SSL 设置适合的 rdkafka 适配器参数。
=> ALTER NOTIFIER encrypted_notifier PARAMETERS
'sasl.username=user;sasl.password=password;sasl.mechanism=PLAIN;security.protocol=SASL_SSL';
-
启用通知程序。
=> ALTER NOTIFIER encrypted_notifier ENABLE;
示例
更新现有通知程序的设置:
=> ALTER NOTIFIER my_dc_notifier
ENABLE
MAXMEMORYSIZE '2G'
IDENTIFIED BY 'f8b0278a-3282-4e1a-9c86-e0f3f042a971'
CHECK COMMITTED;
更改 TLSMODE
并将 CA 捆绑包和证书添加到现有通知程序。此通知程序连接到 Kafka 服务器的证书,并验证其是否由受信任的 CA 签名。
=> ALTER NOTIFIER my_notifier
TLSMODE 'verify-ca'
CA BUNDLE ca_bundle
CERTIFICATE client_cert;
另请参阅
1.15 - ALTER PROCEDURE(存储)
更改存储过程,同时保留任何现有授权。
语法
ALTER PROCEDURE procedure ( [ [ parameter_mode ] [ parameter ] parameter_type [, ...] ] )
[ SECURITY { INVOKER | DEFINER }
| RENAME TO new_procedure_name
| OWNER TO new_owner
| SET SCHEMA new_schema
| SOURCE TO new_source
]
参数
- 过程
- 要更改的过程。
- parameter_mode
- 存储过程的 IN 参数。
- parameter
- 参数的名称。
- parameter_type
- 参数的类型。
SECURITY { INVOKER | DEFINER }
- 指定是否以调用者或过程定义者(所有者)的权限执行过程。
有关详细信息,请参阅执行存储过程。
-
RENAME TO new_procedure_name
- 过程的新名称。
-
OWNER TO new_owner
- 过程的新所有者(定义者)。
-
SET SCHEMA new_schema
- 过程的新架构。
-
SOURCE TO new_source
- 新的过程源代码。有关详细信息,请参阅范围和结构。
特权
OWNER TO
超级用户
RENAME
和 SCHEMA TO
非超级用户:
其他操作
非超级用户:过程的所有权
示例
请参阅更改存储过程。
1.16 - ALTER PROJECTION
更改指定投影的 DDL。
语法
ALTER PROJECTION [[database.]schema.]projection
{ RENAME TO new‑name | ON PARTITION RANGE BETWEEN min-val AND max-val }
参数
-
架构
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
projection
- 要更改的投影,其中 projection 可以为以下之一:
有关投影名称约定,请参阅投影命名。
-
new‑name
- 新的投影名称。
ON PARTITION RANGE
-
注意
仅对使用分区范围创建的投影有效。
指定将此投影的数据限制在分区键范围内,指定如下:
ON PARTITION RANGE BETWEEN min-range-value AND max-range-value
以下要求适用于 min‑range‑value 和 ≤ max‑range‑value:
max-range-value 可以设置为 NULL,以指定分区范围没有上限。
如果新的键范围超出之前的范围,Vertica 将发出警告,指出投影已过期,必须刷新才能使用。
有关其他要求和使用详细信息,请参阅分区范围投影。
特权
非超级用户权限、对架构的 CREATE 和 USAGE 权限以及以下锚表权限之一:
-
表所有者
-
ALTER 权限
-
SELECT 权限(仅当定义了分区范围投影时)
示例
=> SELECT export_tables('','public.store_orders');
export_tables
---------------------------------------------
CREATE TABLE public.store_orders
(
order_no int,
order_date timestamp NOT NULL,
shipper varchar(20),
ship_date date NOT NULL
);
(1 row)
=> CREATE PROJECTION store_orders_p AS SELECT * from store_orders;
CREATE PROJECTION
=> ALTER PROJECTION store_orders_p RENAME to store_orders_new;
ALTER PROJECTION
另请参阅
CREATE PROJECTION
1.17 - ALTER PROFILE
更改配置文件。未在配置文件中设置的所有参数都从默认配置文件继承其设置。可以使用 ALTER PROFILE
更改默认配置文件。
语法
ALTER PROFILE name LIMIT [
PASSWORD_LIFE_TIME setting
PASSWORD_MIN_LIFE_TIME setting
PASSWORD_GRACE_TIME setting
FAILED_LOGIN_ATTEMPTS setting
PASSWORD_LOCK_TIME setting
PASSWORD_REUSE_MAX setting
PASSWORD_REUSE_TIME setting
PASSWORD_MAX_LENGTH setting
PASSWORD_MIN_LENGTH setting
PASSWORD_MIN_LETTERS setting
PASSWORD_MIN_UPPERCASE_LETTERS setting
PASSWORD_MIN_LOWERCASE_LETTERS setting
PASSWORD_MIN_DIGITS setting
PASSWORD_MIN_SYMBOLS setting
PASSWORD_MIN_CHAR_CHANGE setting ]
参数
注意
要将参数重置为从默认配置文件继承,请将其值设置为 default
。
特权
超级用户
配置文件设置和客户端身份验证
以下配置文件设置会影响客户端身份验证方法,例如 LDAP 或 GSS:
-
FAILED_LOGIN_ATTEMPTS
-
PASSWORD_LOCK_TIME
所有其他配置文件设置仅供 Vertica 用于管理其密码。
示例
ALTER PROFILE sample_profile LIMIT FAILED_LOGIN_ATTEMPTS 3;
另请参阅
1.18 - ALTER PROFILE RENAME
重命名现有配置文件。
语法
ALTER PROFILE name RENAME TO new‑name;
参数
- name
- 配置文件的当前名称。
- new‑name
- 配置文件的新名称。
特权
超级用户
示例
此示例显示了如何重命名现有配置文件。
ALTER PROFILE sample_profile RENAME TO new_sample_profile;
另请参阅
1.19 - ALTER RESOURCE POOL
通过设置一个或多个参数来修改现有资源池。
注意
您可以使用
ALTER RESOURCE POOL 来修改 Vertica 内置资源池中的一些参数。有关默认设置和限制的详细信息,请参阅
内置资源池配置。
语法
ALTER RESOURCE POOL pool‑name [ FOR subcluster-spec ] [ parameter‑name setting ]...
参数
- pool‑name
- 资源池的名称。内置池名称不能用于用户定义的池。
注意
如果使用大写字母指定资源池名称,Vertica 会将它们转换为小写字母。
-
FOR subcluster‑spec
- 仅限 Eon 模式,指定将此资源池与某个子群集关联,其中 subcluster-spec 为以下之一:
-
SUBCLUSTER subcluster-name
:更改现有子群集的资源池。您不能连接到此子群集,否则 Vertica 会返回错误。
CURRENT SUBCLUSTER
:更改您连接到的子群集的资源池。
注意
如果指定了子群集,则只能更改
内置池的
MAXMEMORYSIZE
、
MAXQUERYMEMORYSIZE
和
MEMORYSIZE
参数。
- parameter‑name
- 要设置的参数,如下所示。
- 设置
要在 parameter‑name 上设置的值。要将此参数重置为其默认值,请指定 DEFAULT
。
-
CASCADE TO
指定一个辅助资源池,用于执行其
[RUNTIMECAP](#RUNTIMECAP)
设置超出分配资源池的查询:
CASCADE TO secondary‑pool
-
CPUAFFINITYMODE
指定资源池是单独使用还是共用
[CPUAFFINITYSET](#CPUAFFINITYSET)
中指定的 CPU。
CPUAFFINITYMODE { SHARED | EXCLUSIVE | ANY }
-
SHARED
:在此池中运行的查询与其他 Vertica 资源池共享其 CPUAFFINITYSET
CPU。
-
EXCLUSIVE
:仅将 CPUAFFINITYSET
CPU 专用于此资源池,不用于其他 Vertica 资源池。如果将 CPUAFFINITYSET
设置为百分比,那么仅为此资源池分配可用于 Vertica 的 CPU 资源百分比。
-
ANY
(默认值):此资源池中的查询可以在任何 CPU 上运行,如果 CPUAFFINITYSET
指定 CPU 资源,则此查询无效。
重要
CPUAFFINITYMODE
CPUAFFINITYSET
必须在同一语句中一起设置。
-
CPUAFFINITYSET
指定此资源池可用的 CPU。所有群集节点必须具有相同的 CPU 数量。分配给该集合的 CPU 资源对常规资源池不可用。
CPUAFFINITYSET {
'cpu‑index[,...]'
| 'cpu‑indexi-cpu‑indexn'
| 'integer%'
| NONE
}
-
cpu‑index[,...]
:将以一个或多个逗号分隔的 CPU 专用于此池。
-
cpu‑indexi-cpu‑indexn
:将一系列连续的 CPU 索引专用于此池
-
integer%
:此池可用的所有可用 CPU 的百分比。Vertica 将此百分比向下舍入以包括整个 CPU 单元。
-
NONE
(默认值):没有关联集分配给该资源池。与该池关联的查询可在任何 CPU 上执行。
重要
CPUAFFINITYSET
CPUAFFINITYMODE
必须在同一语句中一起设置。
-
EXECUTIONPARALLELISM
限制用于处理此资源池中发出的任何单一查询的线程数量。
EXECUTIONPARALLELISM { limit | AUTO }
-
MAXCONCURRENCY
设置群集中资源池可用的最大并发执行槽数:
MAXCONCURRENCY { integer | NONE }
NONE
(默认)指定不限数量的并发执行槽。
-
MAXMEMORYSIZE
通过从
GENERAL
池中借用内存,资源池可以增加的每个节点的最大大小:
MAXMEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
| NONE
}
MAXQUERYMEMORYSIZE
此池可以在运行时分配以处理查询的最大内存量。如果查询需要的内存超过此设置,Vertica 将停止执行并返回错误。
设置此参数如下:
MAXQUERYMEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
| NONE
}
-
integer%
:百分比
此池的 MAXMEMORYSIZE
。
-
integer{K|M|G|T}
:以千字节、兆字节、千兆字节或太字节为单位的内存量,最大为
MAXMEMORYSIZE
。
-
NONE
(默认值):无限制;池可以从 GENERAL 池中借用任意数量的可用内存,其限制由以下设置:
MAXMEMORYSIZE
。
重要
对 MAXQUERYMEMORYSIZE
的更改会追溯应用于当前正在执行的查询。如果减少此设置值,对于按照先前内存大小计划的查询,如果其尝试分配的内存大于新设置允许的值,则很可能会失败。
-
MEMORYSIZE
每个节点分配给此池的 Vertica 资源管理器可用的总内存量:
MEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
}
默认值: 0%。没有分配任何内存,资源池从
GENERAL
池中借用内存。
-
PLANNEDCONCURRENCY
指定资源池中并发执行的查询首选数量。此设置适用于整个群集:
PLANNEDCONCURRENCY { num‑queries | AUTO }
对于不同节点上逻辑核数不同的群集,AUTO
可以在每个节点上应用不同的方法。分布式查询的运行方式类似于最低的有效计划并发性能。单节点查询以发起方的计划并发性能运行。
提示
请仅在评估一段时间的性能后再更改此参数。
-
PRIORITY
指定此池中的查询在争用
GENERAL
池中资源时的优先级:
PRIORITY { integer | HOLD }
默认值: 0
-
QUEUETIMEOUT
指定请求在被拒绝之前可以等待池资源多长时间:
QUEUETIMEOUT { integer | NONE }
-
integer:最长等待时间(以秒为单位)
-
NONE
:没有最长等待时间,请求可以无限排队。
默认值: 300 秒
-
RUNTIMECAP
通过设置池中的查询可以执行的最大时间,可以防止查询失控。如果查询超出此设置,它会尝试级联到辅助池。
RUNTIMECAP { 'interval' | NONE }
-
interval:1 分钟或 100 秒的间隔;不应超过 1 年。
-
NONE
(默认值):在此池中运行的查询没有时间限制。
要以天为单位指定一个值,请提供整数值。要提供小于一天的值,请以 hours:minutes:seconds
格式提供间隔。例如,值为 1:30:00
时,则等于 90 分钟。
如果用户或会话也具有 RUNTIMECAP
,则会应用较短的限制。
-
RUNTIMEPRIORITY
确定资源管理器应如何将运行时资源(CPU、I/O 带宽)的优先级分配给已在此资源池中运行的查询:
RUNTIMEPRIORITY { HIGH | MEDIUM | LOW }
默认值: MEDIUM
-
RUNTIMEPRIORITYTHRESHOLD
以秒为单位指定一个时间限制,在资源管理器为其分配资源池 RUNTIMEPRIORITY
之前,必须完成一个查询。所有查询从 HIGH
优先级开始运行。如果查询的持续时间超过了此阈值,它将分配到资源池的 RUNTIMEPRIORITY
。
RUNTIMEPRIORITYTHRESHOLD seconds
默认值: 2
SINGLEINITIATOR
默认情况下,已设置为 false 以实现向后兼容性。切勿更改此设置。
特权
超级用户
示例
以下示例显示如何通过将优先级设置为 5 来更改资源池 ceo_pool。
=> ALTER RESOURCE POOL ceo_pool PRIORITY 5;
以下示例显示如何为 ceo_pool 指定一个辅助资源池。
=> CREATE RESOURCE POOL second_pool;
=> ALTER RESOURCE POOL ceo_pool CASCADE TO second_pool;
以下 Eon 模式示例将 dashboard
辅助子群集的内置 TM
资源池的 MAXMEMORYSIZE 和 MEMORYSIZE 减小到 0%。将这些设置更改为 0 会阻止子群集运行
Tuple Mover
合并操作。
=> ALTER RESOURCE POOL TM FOR SUBCLUSTER dashboard MEMORYSIZE '0%'
MAXMEMORYSIZE '0%';
有关详细信息,请参阅调整 Tuple Mover 池设置。
另请参阅
1.20 - ALTER ROLE
重命名现有角色。
注意
不能使用 ALTER ROLE 重命名通过 LDAPLink 服务添加到 Vertica 数据库的角色。
语法
ALTER ROLE name RENAME TO new‑name
参数
- name
- 要重命名的角色。
- new‑name
- 角色的新名称。
特权
超级用户
示例
=> ALTER ROLE applicationadministrator RENAME TO appadmin;
ALTER ROLE
另请参阅
1.21 - ALTER ROUTING RULE
更改现有负载均衡策略路由规则。
语法
ALTER ROUTING RULE rule_name {
RENAME TO new_name |
SET ROUTE TO 'cidr_range'|
SET GROUP TO group_name
}
参数
-
rule_name
- 要更改的现有路由规则的名称。
RENAME TO new_name
- 将路由规则的名称更改为 new_name。
-
SET ROUTE TO 'cidr_range'
- CIDR 格式的 IPv4 或 IPv6 地址范围。更改此规则适用的客户端连接的地址范围。
-
SET GROUP TO group_name
- 更改用于处理与此规则匹配的连接的负载均衡组。
示例
此示例将更改名为 etl_rule 的路由规则,以便其使用名为 etl_rule 的负载均衡组来处理 IP 地址范围 10.20.100.0 到 10.20.100.255 内的传入连接。
=> ALTER ROUTING RULE etl_rule SET GROUP TO etl_group;
ALTER ROUTING RULE
=> ALTER ROUTING RULE etl_rule SET ROUTE TO '10.20.100.0/24';
ALTER ROUTING RULE
=> \x
Expanded display is on.
=> SELECT * FROM routing_rules WHERE NAME = 'etl_rule';
-[ RECORD 1 ]----+---------------
name | etl_rule
source_address | 10.20.100.0/24
destination_name | etl_group
另请参阅
1.22 - ALTER SCHEMA
通过以下方式之一更改一个或多个架构:
-
通过在架构中创建的表启用或禁用架构权限的继承。
-
将架构所有权重新分配给另一个用户。
-
更改架构磁盘配额。
-
重命名一个或多个架构。
语法
ALTER SCHEMA [database.]schema
DEFAULT {INCLUDE | EXCLUDE} SCHEMA PRIVILEGES
| OWNER TO user-name [CASCADE]
| DISK_QUOTA { value | SET NULL }
您可以在单个操作中重命名多个架构:
ALTER SCHEMA [database.]schema[,...] RENAME TO new-schema-name[,...]
参数
- 数据库
- 包含架构的数据库的名称。如果指定,则必须是当前数据库。
- 架构
- 要修改的架构的名称。
DEFAULT {INCLUDE | EXCLUDE} SCHEMA PRIVILEGES
指定是否启用或禁用指定架构中新表的默认权限继承:
另请参阅 启用架构继承。
OWNER TO
- 将架构所有权重新分配给指定用户:
OWNER TO user-name [CASCADE]
默认情况下,重新分配的架构中对象的所有权保持不变。要将架构对象的所有权重新分配给新架构所有者,请使用 CASCADE 对 OWNER TO 子句进行限定。有关详细信息,请参阅下面的级联架构所有权。
DISK_QUOTA
- 以下几项之一:
有关详细信息,请参阅磁盘配额。
RENAME TO
- 重命名一个或多个架构:
RENAME TO new-schema-name[,...]
需要满足以下要求:
当心
重命名视图引用的架构将导致视图失败,除非创建另一个架构来替换它。
特权
以下几项之一:
级联架构所有权
默认情况下,ALTER SCHEMA...OWNER TO 不会影响目标架构中对象的所有权或授予给这些对象的权限。如果使用 CASCADE 对 OWNER TO 子句进行限定,Vertica 将对目标架构中的对象执行以下操作:
如果由非超级用户发出,ALTER SCHEMA...OWNER TO CASCADE 会忽略属于其他用户的所有对象,并就其无法更改的对象返回通知。例如:
-
架构 ms
归用户 mayday
所有,其包含两个表: ms.t1
归 mayday 所有,ms.t2
归用户joe
所有:
=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
----------------+-----------------------+-------+---------+---------
ms | t1 | table | mayday |
ms | t2 | table | joe |
-
用户 mayday
使用 CASCADE 将架构 ms
的所有权转移给用户 dbadmin
。返回时,ALTER SCHEMA 报告它无法转移归用户 joe
所有的表 ms.t2
及其投影的所有权:
=> \c - mayday
You are now connected as user "mayday".
=> ALTER SCHEMA ms OWNER TO dbadmin CASCADE;
NOTICE 3583: Insufficient privileges on ms.t2
NOTICE 3583: Insufficient privileges on ms.t2_b0
NOTICE 3583: Insufficient privileges on ms.t2_b1
ALTER SCHEMA
=> \c
You are now connected as user "dbadmin".
=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
----------------+-----------------------+-------+---------+---------
ms | t1 | table | dbadmin |
ms | t2 | table | joe |
-
用户 dbadmin
再次使用 CASCADE 将架构 ms
的所有权转移给用户 pat
。这次,因为 dbadmin
是超级用户,所以 ALTER SCHEMA 可以将所有 ms
表的所有权转移给用户 pat
=> ALTER SCHEMA ms OWNER TO pat CASCADE;
ALTER SCHEMA
=> \dt
List of tables
Schema | Name | Kind | Owner | Comment
----------------+-----------------------+-------+---------+---------
ms | t1 | table | pat |
ms | t2 | table | pat |
交换架构
重命名架构可用于交换架构而无需实际移动数据。为便于交换,请输入一个不存在的、临时占位符架构。例如,以下 ALTER SCHEMA
语句使用临时架构 temps 来帮助架构 S1 与架构 S2 进行交换。在此示例中,S1 被重命名为 temps。然后 S2 被重命名为 S1。最后,temps 被重命名为 S2。
=> ALTER SCHEMA S1, S2, temps RENAME TO temps, S1, S2;
示例
以下示例将架构 S1
和 S2
分别重命名为 S3
和 S4
:
=> ALTER SCHEMA S1, S2 RENAME TO S3, S4;
此示例将新表 t2
的默认行为设置为自动继承架构的权限:
=> ALTER SCHEMA s1 DEFAULT INCLUDE SCHEMA PRIVILEGES;
=> CREATE TABLE s1.t2 (i, int);
此示例将新表的默认行为设置为不自动继承架构的权限:
=> ALTER SCHEMA s1 DEFAULT EXCLUDE SCHEMA PRIVILEGES;
另请参阅
1.23 - ALTER SEQUENCE
通过以下两种方式更改命名序列:
语法
更改序列行为:
ALTER SEQUENCE [[database.]schema.]sequence
[ INCREMENT [ BY ] integer ]
[ MINVALUE integer | NO MINVALUE ]
[ MAXVALUE integer | NO MAXVALUE ]
[ RESTART [ WITH ] integer ]
[ CACHE integer | NO CACHE ]
[ CYCLE | NO CYCLE ]
更改序列名称、架构或所有权:
ALTER SEQUENCE [schema.]sequence-name {
RENAME TO seq-name
| SET SCHEMA schema-name]
| OWNER TO owner-name
}
参数
- 架构
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
如果未指定架构,系统将在默认架构中创建表。
- 序列
- 要更改的序列的名称。
-
INCREMENT [BY] integer
一个正整数或负整数,指定每次调用 NEXTVAL 时序列的增减数量,默认设置为 1。
注意
将此参数设置为 integer 时,可确保列值始终至少增加 integer。但是,列值的增量有时可能会超过 integer,但如果您还设置了 NO CACHE
参数则除外。
-
MINVALUE integer
NO MINVALUE
(默认值)
- 修改序列可以生成的最小值。如果更改了此值且当前值超出了范围,增量大于零时当前值将更改为最小值,增量小于零时当前值将更改为最大值。
-
MAXVALUE integer
NO MAXVALUE
(默认值)
- 修改序列的最大值。如果更改了此值且当前值超出了范围,增量大于零时当前值将更改为最小值,增量小于零时当前值将更改为最大值。
- RESTART [WITH] integer
- 将序列的当前值更改为 integer。下一次调用
NEXTVAL
将返回 integer。
当心
使用
ALTER SEQUENCE
将序列起始值设置为低于其
当前值可能会导致重复键。
CACHE
integer
NO CACHE
(默认值)
- 指定预先分配和存储在内存中的序列号数量,以提高访问速度。Vertica 为每个会话设置缓存,并将其分布到所有节点。默认情况下,序列缓存设置为 250,000。
有关详细信息,请参阅分发命名序列。
CYCLE
NO CYCLE
(默认值)
- 指定序列是否可以在达到其最小值或最大值时回绕:
-
RENAME TO seq‑name
- 重命名当前架构中的序列,其中 seq‑name 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
SET SCHEMA schema‑name
- 将序列移至架构 schema-name。
-
OWNER TO owner‑name
- 将当前序列所有者重新分配给指定所有者。
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户必须具备以下架构权限:
示例
请参阅更改序列。
另请参阅
CREATE SEQUENCE
1.24 - ALTER SUBCLUSTER
更改子群集的配置。您可以使用此语句重命名子群集或将其设为
默认子群集。
语法
ALTER SUBCLUSTER subcluster‑name {
RENAME TO new-name |
SET DEFAULT
}
参数
-
subcluster‑name
- 要更改的子群集的名称。
-
RENAME TO new‑name
- 将子群集的名称更改为 new-name。
-
SET DEFAULT
- 将子群集设为默认子群集。将新节点添加到数据库时,如果未指定要包含这些节点的子群集,Vertica 会将这些节点添加到默认子群集中。每次只能设置一个默认子群集。先前作为默认子群集的子群集将变为非默认子群集。
特权
超级用户
示例
此示例将 analytics_cluster 设为默认子群集:
=> SELECT DISTINCT subcluster_name FROM SUBCLUSTERS WHERE is_default = true;
subcluster_name
--------------------
default_subcluster
(1 row)
=> ALTER SUBCLUSTER analytics_cluster SET DEFAULT;
ALTER SUBCLUSTER
=> SELECT DISTINCT subcluster_name FROM SUBCLUSTERS WHERE is_default = true;
subcluster_name
-------------------
analytics_cluster
(1 row)
此示例将 default_subcluster 重命名为 load_subcluster:
=> ALTER SUBCLUSTER default_subcluster RENAME TO load_subcluster;
ALTER SUBCLUSTER
=> SELECT DISTINCT subcluster_name FROM subclusters;
subcluster_name
-------------------
load_subcluster
analytics_cluster
(2 rows)
另请参阅
1.25 - ALTER SESSION
ALTER SESSION 为当前会话设置和清除会话级别的配置参数值。要识别会话级别参数,请查询系统表 CONFIGURATION_PARAMETERS。
语法
ALTER SESSION {
SET [PARAMETER] parameter‑name=value[,...]
| CLEAR { [PARAMETER] parameter‑name[,...] | PARAMETER ALL }
| SET UDPARAMETER [ FOR libname ] key=value[,...]
| CLEAR UDPARAMETER { [ FOR libname ] key[,...] | ALL }
}
参数
SET [PARAMETER]
- 将一个或多个配置参数设置为指定值。
CLEAR [PARAMETER]
- 清除在当前会话中设置的更改的指定配置参数。
CLEAR PARAMETER ALL
- 清除在当前会话中设置的更改的所有会话级别配置参数。
-
SET UDPARAMETER
- 设置一个或多个用户定义的会话参数
(key=value
),以与 UDx 结合使用。键值大小限制如下:
-
从客户端设置:128 个字符
-
从 UDx 端设置:无限制
可以通过包含子句
FOR libname
将 SET 操作的范围限制为单个库。例如:
=> ALTER SESSION SET UDPARAMETER FOR securelib username='alice';
如果指定一个库,则只有该库可以访问参数的值。使用此限制来保护包含敏感数据(例如凭据)的参数。
CLEAR UDPARAMETER
- 清除通过以下选项之一指定的用户定义参数:
特权
无
示例
设置和清除参数
-
强制所有支持隔离模式的 UDx 在隔离模式下运行,即使其定义指定了 NOT FENCED
也是如此:
=> ALTER SESSION SET ForceUDxFencedMode = 1;
ALTER SESSION
-
在会话级别清除 ForceUDxFencedMode
。其值将被重置为其默认值 0
:
=> ALTER SESSION CLEAR ForceUDxFencedMode;
ALTER SESSION
=> SELECT parameter_name, current_value, default_value FROM configuration_parameters WHERE parameter_name = 'ForceUDxFencedMode';
parameter_name | current_value | default_value
--------------------+---------------+---------------
ForceUDxFencedMode | 0 | 0
(1 row)
-
清除在此会话中设置的更改的所有会话级别配置参数:
=> ALTER SESSION CLEAR PARAMETER ALL;
ALTER SESSION
设置和清除用户定义的参数
-
将库 MyLibrary
中的用户定义参数 RowCount
的值设置为 25。
=> ALTER SESSION SET UDPARAMETER FOR MyLibrary RowCount = 25;
ALTER SESSION
-
清除会话级别的 RowCount
:
=> ALTER SESSION CLEAR UDPARAMETER FOR MyLibrary RowCount;
ALTER SESSION
1.26 - ALTER SUBNET
重命名现有子网。
语法
ALTER SUBNET subnet‑name RENAME TO new‑subnet‑name
参数
- subnet‑name
- 现有子网的名称。
- new‑subnet‑name
- 子网的新名称。
特权
超级用户
示例
=> ALTER SUBNET mysubnet RENAME TO myNewSubnet;
1.27 - ALTER TABLE
修改现有表的元数据。所有更改都将自动提交。
语法
ALTER TABLE [[database.]schema.]table {
ADD COLUMN [ IF NOT EXISTS ] column datatype
[ column‑constraint ]
[ ENCODING encoding‑type ]
[ PROJECTIONS (projections-list) | ALL PROJECTIONS ]
| ADD table‑constraint
| ALTER COLUMN column {
ENCODING encoding-type PROJECTIONS (projection-list)
| { SET | DROP } expression }
| ALTER CONSTRAINT constraint‑name { ENABLED | DISABLED }
| DISK_QUOTA { value | SET NULL }
| DROP CONSTRAINT constraint‑name [ CASCADE | RESTRICT ]
| DROP [ COLUMN ] [ IF EXISTS ] column [ CASCADE | RESTRICT ]
| FORCE OUTER integer
| { INCLUDE | EXCLUDE | MATERIALIZE } [ SCHEMA ] PRIVILEGES
| OWNER TO owner
| partition‑clause [ REORGANIZE ]
| REMOVE PARTITIONING
| RENAME [ COLUMN ] name TO new‑name
| RENAME TO new-table-name[,...]
| REORGANIZE
| SET {
ActivePartitionCount { count | DEFAULT }
| IMMUTABLE ROWS
| MERGEOUT { 1 | 0 }
| SCHEMA schema
}
注意
多个 ALTER TABLE 子句不能与同一语句中的其他子句一起指定(请参阅下面的 Exclusive ALTER TABLE 子句)。否则,ALTER TABLE 支持多个以逗号分隔的子句。例如,下面的 ALTER TABLE 语句通过以下两种方式更改 my_table
表:将所有权重新分配给 Joe
;在 UNIQUE b
列上设置 约束:
=> ALTER TABLE my_table OWNER TO Joe,
ADD CONSTRAINT unique_b UNIQUE (b) ENABLED;
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
表
- 要更改的表。
-
ADD COLUMN
- 向表中添加一列,默认情况下会将该列添加到所有超投影中:
ADD COLUMN [IF NOT EXISTS]
column datatype
[ NULL | NOT NULL ]
[ ENCODING encoding‑type]
[ PROJECTIONS (projections-list) | ALL PROJECTIONS]
对复杂类型列的限制也适用于通过 ADD COLUMN 添加的列。
如果指定的名称下面已经存在列,则可选的 IF NOT EXISTS 子句会生成一条信息性消息。如果您忽略此选项且列存在,Vertica 会生成 ROLLBACK 错误消息。
您可以使用以下选项之一限定新的列定义:
-
column‑constraint 指定一个列约束,如下所示:
{NULL | NOT NULL}
| [ DEFAULT default‑expr ] [ SET USING using‑expr ] } | DEFAULT USING exp}
-
ENCODING 指定列的编码类型。默认设置为 AUTO。
-
PROJECTIONS 将新列添加到此表的一个或多个现有投影中,指定为投影基本名称的逗号分隔列表。Vertica 将该列添加到每个投影的所有伙伴实例。投影列表不能包含具有预聚合数据的投影,例如实时聚合投影;否则,Vertica 将回退 ALTER TABLE 语句。
-
ALL PROJECTIONS 将该列添加到此表的所有投影(不包括具有预聚合数据的投影)中。
-
ADD table‑constraint
- 将约束添加到一个没有任何关联投影的表。
-
ALTER COLUMN
- 您可以通过以下两种方式之一更改现有列:
-
在一列上为该表的一个或多个投影设置编码:
ENCODING encoding-type PROJECTIONS (projections-list)
其中 projections-list 是以逗号分隔的投影列表,这些投影将使用新编码进行更新。可以通过以下两种方式指定每个投影:
如果其中一个投影不包含目标列,Vertica 将返回一个回退错误。
有关详细信息,请参阅投影列编码。
-
设置或删除一列标量数据(包括原始数组)的设置:
SET { DEFAULT expression
| USING expression
| DEFAULT USING expression
| NOT NULL
| DATA TYPE datatype
}
DROP { DEFAULT
| SET USING
| DEFAULT USING
| NOT NULL
}
如果列所属的复杂类型既不是标量类型也不是标量类型数组,则无法更改其数据类型。存在一个例外:在外部表中,您可以将基元列类型更改为复杂类型。
设置 DEFAULT 或 SET USING 表达式对现有列值没有影响。要使用列的 DEFAULT 或 SET USING 表达式刷新列,请按如下方式对其进行更新:
使用 DEFAULT 或 SET USING 更改列会增加磁盘使用率,如果违反表或架构磁盘配额,这可能会导致操作失败。
-
ALTER CONSTRAINT
- 指定是否强制执行主键、唯一键和检查约束:
ALTER CONSTRAINT constraint‑name {ENABLED | DISABLED}
DISK_QUOTA
- 以下几项之一:
有关详细信息,请参阅磁盘配额。
-
DROP CONSTRAINT
- 从表中删除指定的表约束:
DROP CONSTRAINT constraint-name [CASCADE | RESTRICT]
您可以使用以下选项之一限定 DROP CONSTRAINT:
删除表约束对引用该表的视图没有影响。
-
DROP [COLUMN]
- 删除表中的指定列以及该列的 ROS 容器:
DROP [COLUMN] [IF EXISTS] column [CASCADE | RESTRICT]
您可以使用以下选项之一限定 DROP COLUMN:
列所在的表不能是不可变表。
请参阅删除表列。
-
FORCE OUTER integer
- 指定是否将表作为内部或外部输入联接到另一个表。有关详细信息,请参阅控制联接输入。
{INCLUDE | EXCLUDE | MATERIALIZE} [SCHEMA] PRIVILEGES
- 指定在默认情况下继承此表的架构权限:
-
EXCLUDE PRIVILEGES(默认)禁止从架构继承权限。
-
INCLUDE PRIVILEGES 将针对表架构授予的相同权限授予视图。
-
MATERIALIZE PRIVILEGES 将授权复制到表并在表上创建一个 GRANT 对象。这将禁用表上的权限继承标志,让您可以:
-
在表级别授予更具体的权限。
-
使用架构级权限作为模板。
-
将表移动到不同的架构。
-
更改架构权限而不影响表。
另请参阅 设置表和视图的权限继承。
-
OWNER TO owner
- 更改表所有者。
-
partition‑clause [REORGANIZE]
- 对外部表无效,通过 PARTITION BY 子句对表数据存储进行逻辑划分:
PARTITION BY partition‑expression
[ GROUP BY group‑expression ]
[ SET ACTIVEPARTITIONCOUNT integer ]
有关详细信息,请参阅分区子句。
如果您使用 REORGANIZE 限定分区子句,并且在以前没有为表指定分区,则 Vertica
Tuple Mover 会立即实现分区子句。如果在以前为表指定了分区,则 Tuple Mover 会评估 ROS 存储容器,并根据需要重新组织这些容器,使其符合新的分区子句。
REMOVE PARTITIONING
- 指定要从表定义中移除分区。
Tuple Mover 随后从 ROS 容器中移除现有分区。
-
RENAME [COLUMN]
- 重命名表中的指定列。列所在的表不能是不可变表。
-
RENAME TO
- 重命名一个或多个表:
RENAME TO new‑table‑name[,...]
需要满足以下要求:
-
REORGANIZE
- 仅对分区表有效,调用
Tuple Mover,以根据需要重新组织 ROS 存储容器,使其符合表的当前分区子句。ALTER TABLE...REORGANIZE 和 Vertica 元函数PARTITION_TABLE的运行方式相同。
REORGANIZE 也可以限定一个新的分区子句。
SET
- 更改表设置,为以下几项之一:
-
ActivePartitionCount {count | DEFAULT },仅对分区表有效,指定该表有多少个分区处于活动状态,为以下几项之一:
有关用法的详细信息,请参阅活动和非活动分区。
-
IMMUTABLE ROWS 通过阻止 DML 操作(如 UPDATE 和 DELETE)来防止更改表行值。表的不可变性一旦设置便无法恢复。
您不能将修整表设置为不可变。有关不可变表的所有限制的详细信息,请参阅不可变表。
-
MERGEOUT { 1 | 0 } 指定是允许还是禁止合并用来合并此表的投影数据的 ROS 容器。默认情况下,会针对所有表启用合并 (1)。
-
SCHEMA schema-name 将表从其当前架构移动到 schema-name。Vertica 自动将锚定到源表的所有投影移动到目标架构。它还将所有 IDENTITY 和 AUTO_INCREMENT 列移动到目标架构。有关详细信息,请参阅 将表移动到另一个架构
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
非超级用户还必须具有 SELECT 权限才能启用或禁用 约束强制执行或移除分区。
对于某些操作,非超级用户必须具备以下架构权限:
复杂类型的限制
原生表中使用的复杂类型除了其参考页面上列出的个别类型的限制外,还有一些限制:
-
原生表必须至少有一个基本类型或原生数组(基本类型的一维数组)的列。如果一个 Flex 表有真实的列,它也必须至少有一个满足这个限制的列。
-
复杂类型列不能在 ORDER BY 或 PARTITION BY 子句中使用,也不能用作 FILLER 列。
-
复杂类型列不能有 约束。
-
返回复杂类型的表达式不能用作投影列,并且投影不能按复杂类型的列进行分段或排序。
-
具有复杂类型列的表不能使用 DEFAULT 和 SET USING。
独占 ALTER TABLE 子句
以下 ALTER TABLE 子句不能与其他 ALTER TABLE 子句结合使用:
-
ADD COLUMN
-
DROP COLUMN
-
RENAME COLUMN
-
SET SCHEMA
-
RENAME [TO]
节点关闭限制
仅限企业模式
当一个或多个数据库群集节点关闭时,不支持以下 ALTER TABLE 操作:
-
ALTER COLUMN ...ADD table‑constraint
-
ALTER COLUMN ...SET DATA TYPE
-
ALTER COLUMN ...{ SET DEFAULT | DROP DEFAULT }
-
ALTER COLUMN ...{ SET USING | DROP SET USING }
-
ALTER CONSTRAINT
-
DROP COLUMN
-
DROP CONSTRAINT
预聚合投影的限制
您不能修改实时聚合或 Top-K 投影中包含的锚定表列的元数据。您也不能删除这些列。要进行这些更改,您必须首先删除与之关联的所有实时聚合和 Top-K 投影。
外部表的限制
并不是所有 ALTER TABLE 选项都适用于外部表。例如,您不能向外部表添加列,但可以重命名该表:
=> ALTER TABLE mytable RENAME TO mytable2;
ALTER TABLE
锁定的表
如果操作无法在目标表上获取 O lock,Vertica 将尝试关闭该表上运行的任何内部 tuple mover 会话。如果成功,则可以继续操作。在用户会话中运行的显式 Tuple Mover 操作不会关闭。如果显式 Tuple Mover 操作在表上运行,则该操作仅在 Tuple Mover 操作完成后继续。
另请参阅
1.27.1 - Table-constraint
为表元数据添加约束。您可以使用
CREATE TABLE
指定表约束,或使用
ALTER TABLE
将约束添加到现有表。有关详细信息,请参阅设置约束。
注意
向视图中所引用的表添加约束不会对视图产生影响。
语法
[ CONSTRAINT constraint-name ]
{
... PRIMARY KEY (column[,... ]) [ ENABLED | DISABLED ]
... | FOREIGN KEY (column[,... ] ) REFERENCES table [ (column[,...]) ]
... | UNIQUE (column[,...]) [ ENABLED | DISABLED ]
... | CHECK (expression) [ ENABLED | DISABLED ]
}
参数
-
CONSTRAINT constraint‑name
- 为约束分配名称。Vertica 建议对所有约束进行命名。
PRIMARY KEY
- 定义一个或多个
NOT NULL
列作为主键,如下所示:
PRIMARY KEY (column[,...]) [ ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名主键约束,Vertica 会分配名称 C_PRIMARY
。
FOREIGN KEY
- 添加引用完整性约束,以将一个或多个列定义为外键,如下所示:
FOREIGN KEY (column[,... ]) REFERENCES table [(column[,... ])]
如果省略了 column,Vertica 将引用 table 中的主键。
如果您没有命名外键约束,Vertica 会分配名称 C_FOREIGN
。
重要
添加外键约束需要以下权限(除了 ALTER TABLE 也需要的权限外):
-
对引用表的 REFERENCES 权限
-
对引用表架构的 USAGE 权限
UNIQUE
- 指定一个列或一组列中的数据对于所有表行都是唯一的,如下所示:
UNIQUE (column[,...]) [ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名唯一约束,Vertica 会分配名称 C_UNIQUE
。
CHECK
- 指定检查条件,即一个返回布尔值的表达式,如下所示:
CHECK (expression) [ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名检查约束,Vertica 会分配名称 C_CHECK
。
权限
非超级用户:表所有者,或以下权限:
强制执行约束
表可以使用关键字 ENABLED
或 DISABLED
指定 Vertica 是否自动强制执行主键、唯一键或检查约束。如果省略了 ENABLED
或 DISABLED
,Vertica 会通过检查相应的配置参数来确定是否自动启用约束:
-
EnableNewPrimaryKeysByDefault
-
EnableNewUniqueKeysByDefault
-
EnableNewCheckConstraintsByDefault
有关详细信息,请参阅约束强制执行。
示例
以下示例将使用主键约束创建一个表 (t01
)。
CREATE TABLE t01 (id int CONSTRAINT sampleconstraint PRIMARY KEY);
CREATE TABLE
此示例没有使用约束创建相同表,然后添加约束 ALTER TABLE ADD CONSTRAINT
CREATE TABLE t01 (id int);
CREATE TABLE
ALTER TABLE t01 ADD CONSTRAINT sampleconstraint PRIMARY KEY(id);
WARNING 2623: Column "id" definition changed to NOT NULL
ALTER TABLE
以下示例创建一个包含两列的表 (addapk
),向表中添加第三列,然后在第三列上添加主键约束。
=> CREATE TABLE addapk (col1 INT, col2 INT);
CREATE TABLE
=> ALTER TABLE addapk ADD COLUMN col3 INT;
ALTER TABLE
=> ALTER TABLE addapk ADD CONSTRAINT col3constraint PRIMARY KEY (col3) ENABLED;
WARNING 2623: Column "col3" definition changed to NOT NULL
ALTER TABLE
使用示例表 addapk
,检查是否启用了主键约束(is_enabled
为 t
)。
=> SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_name IN ('addapk');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
col3constraint | col3 | p | t
(1 row)
此示例使用 ALTER TABLE ALTER CONSTRAINT
禁用约束。
=> ALTER TABLE addapk ALTER CONSTRAINT col3constraint DISABLED;
检查主键现在是否已禁用(is_enabled
为 f
)。
=> SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_name IN ('addapk');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
col3constraint | col3 | p | f
(1 row)
有关约束的一般讨论,请参阅约束。有关创建和命名约束的其他示例,请参阅对约束进行命名。
1.27.2 - 投影列编码
创建表及其投影后,可以调用 ALTER TABLE...ALTER COLUMN 来设置或更改一个或多个投影中现有列的编码类型。例如:
ALTER TABLE store.store_dimension ALTER COLUMN store_region
ENCODING rle PROJECTIONS (store.store_dimension_p1_b0, store.store_dimension_p2);
在此示例中,ALTER TABLE 语句指定对两个投影的 store_region
列设置 RLE 编码: store_dimension_p1_b0
和 store_dimension_p2
。PROJECTIONS
列表分别通过投影名称和基本名称引用这两个投影。可以通过任意一种方式引用投影;在这两种情况下,更改都会传播到投影的所有伙伴实例并相应地存储在其 DDL 中:
=> select export_objects('','store.store_dimension');
export_objects
------------------------------------------------------------------
CREATE TABLE store.store_dimension
(
store_key int NOT NULL,
store_name varchar(64),
store_number int,
store_address varchar(256),
store_city varchar(64),
store_state char(2),
store_region varchar(64)
);
CREATE PROJECTION store.store_dimension_p1
(
store_key,
store_name,
store_number,
store_address,
store_city,
store_state,
store_region ENCODING RLE
)
AS
SELECT store_dimension.store_key,
store_dimension.store_name,
store_dimension.store_number,
store_dimension.store_address,
store_dimension.store_city,
store_dimension.store_state,
store_dimension.store_region
FROM store.store_dimension
ORDER BY store_dimension.store_key
SEGMENTED BY hash(store_dimension.store_key) ALL NODES KSAFE 1;
CREATE PROJECTION store.store_dimension_p2
(
store_key,
store_name,
store_number,
store_address,
store_city,
store_state,
store_region ENCODING RLE
)
AS
SELECT ...
重要
添加或更改列的编码类型时,不会立即影响现有的投影数据。Vertica 仅将编码应用于新加载的数据以及
合并上的现有数据。
1.28 - ALTER TLS CONFIGURATION
更改指定的 TLS CONFIGURATION 对象。有关现有 TLS CONFIGURATION 对象的信息,请查询 TLS_CONFIGURATIONS。
语法
ALTER TLS CONFIGURATION tls_config_name {
[ CERTIFICATE { NULL | cert_name }
[ ADD CA CERTIFICATES ca_cert_name [,...] ]
[ REMOVE CA CERTIFICATES ca_cert_name [,...] ]
[ CIPHER SUITES { '' | 'openssl_cipher [,...]' } ]
[ TLSMODE 'tlsmode' ]
[ OWNER TO user_name ]
}
参数
-
tls_config_name
- 要更改的 TLS CONFIGURATION 对象。
NULL
- 从 TLS 配置中移除非 CA 证书。
-
cert_name
- 使用 CREATE CERTIFICATE 创建的证书。
您必须拥有证书的使用权限(来自
证书 的所有权或
对其密钥的使用,如果有的话)将其添加到 TLS 配置。
-
ca_cert_name
- 使用 CREATE CERTIFICATE 创建的 CA 证书。
您必须拥有证书的使用权限(来自
证书 的所有权或
对其密钥的使用,如果有的话)将其添加到 TLS 配置。
-
openssl_cipher
- 要使用的密码套件的逗号分隔列表,而不是默认的密码套件集。为该参数提供空字符串会清除备用密码套件列表,并指示指定的 TLS CONFIGURATION 使用默认密码套件集。
要查看启用的密码套件,请使用 LIST_ENABLED_CIPHERS。
- tlsmode
- Vertica 如何建立 TLS 连接并处理证书(以下几项之一,按安全性升序排列):
-
DISABLE
:禁用 TLS。此参数的所有其他选项都启用 TLS。
-
ENABLE
:启用 TLS。Vertica 不检查客户端证书。
-
TRY_VERIFY
:如果出现以下任一情况,则建立 TLS 连接:
如果其他主机提供无效证书,则连接将使用纯文本。
-
VERIFY_CA
:如果 Vertica 验证其他主机的证书来自受信任的 CA,则连接成功。如果其他主机不提供证书,则连接使用纯文本。
-
VERIFY_FULL
:如果 Vertica 验证其他主机的证书来自受信任的 CA,并且证书的 cn
(通用名称)或 subjectAltName
属性与其他主机的主机名或 IP 地址匹配,则连接成功。
请注意,对于客户端证书,cn
将用于用户名,因此 subjectAltName
必须与其他主机的主机名或 IP 地址匹配。
VERIFY_FULL
不受客户端-服务器 TLS 和 HTTPS(分别为参数 ServerTLSConfig 和 HttpsTLSConfig)支持,其行为类似于 VERIFY_CA
。
注意
Vertica 和另一方中,哪个充当客户端,哪个充当服务器,这取决于连接类型。更具体地说,设置为参数的 TLS 配置会将 Vertica 视为客户端,将另一方(在本示例中为 LDAP 服务器)视为服务器:
对于所有其他连接类型,Vertica 是服务器,另一方是客户端:
特权
非超级用户:
对 TLS CONFIGURATION 的 ALTER 权限。
示例
要配置客户端-服务器 TLS,请参阅配置客户端-服务器 TLS。
要为 LDAP Link 服务及其试运行函数配置 TLS,请参阅 LDAP Link 的 TLS。
要为 LDAP 身份验证记录配置 TLS,请参阅 LDAP 身份验证的 TLS。
要从 LDAPLink TLS 配置中移除所有证书和 CA 证书:
=> SELECT * FROM tls_configurations WHERE name='LDAPLink';
name | owner | certificate | ca_certificate | cipher_suites | mode
----------+---------+-------------+----------------+---------------+---------
LDAPLink | dbadmin | server_cert | ca | | DISABLE
LDAPLink | dbadmin | server_cert | ica | | DISABLE
(2 rows)
=> ALTER TLS CONFIGURATION LDAPLink CERTIFICATE NULL REMOVE CA CERTIFICATES ca, ica;
ALTER TLS CONFIGURATION
=> SELECT * FROM tls_configurations WHERE name='LDAPLink';
name | owner | certificate | ca_certificate | cipher_suites | mode
----------+---------+-------------+----------------+---------------+---------
LDAPLink | dbadmin | | | | DISABLE
(3 rows)
要为客户端-服务器 TLS 使用一组备用密码套件:
=> ALTER TLS CONFIGURATION server CIPHER SUITES
'DHE-PSK-AES256-CBC-SHA384,
DHE-PSK-AES128-GCM-SHA256,
PSK-AES128-CBC-SHA256';
ALTER TLS CONFIGURATION
=> SELECT name, cipher_suites FROM tls_configurations WHERE name='server';
name | cipher_suites
server | DHE-PSK-AES256-CBC-SHA384,DHE-PSK-AES128-GCM-SHA256,PSK-AES128-CBC-SHA256
(1 row)
1.29 - ALTER USER
更改用户帐户参数和用户级别配置参数。
语法
ALTER USER user‑name {
account‑parameter value[,...]
| SET [PARAMETER] cfg‑parameter=value[,...]
| CLEAR [PARAMETER] cfg‑parameter[,...]
}
参数
-
user‑name
- 用户名。包含特殊字符的名称必须加上双引号。要强制区分大小写,请使用双引号。
有关名称要求的详细信息,请参阅创建数据库名称和密码。
-
account‑parameter value
- 指定用户帐户设置(见下文)。
注意
对用户帐户的更改仅适用于当前会话,以及该用户启动的所有后续会话。
SET [PARAMETER]
- 设置指定的配置参数。新设置仅适用于当前会话,以及该用户启动的所有后续会话。并发用户会话不受新设置的影响,除非它们调用元函数 RESET_SESSION。
CLEAR [PARAMETER]
- 将指定的配置参数重置为其默认值。
重要
SET | CLEAR PARAMETER 只能指定用户级别配置参数,否则 Vertica 将返回错误。有关详细信息,请参阅下文的
设置用户级别配置参数。
用户帐户参数
以逗号分隔列表的形式指定一个或多个用户帐户参数及其设置:
account‑parameter value[,...]
重要
对于使用 LDAPLink 服务添加到 Vertica 数据库的用户,以下用户帐户参数无效:
-
IDENTIFIED BY
-
PROFILE
-
SECURITY ALGORITHM
参数
|
设置
|
ACCOUNT |
锁定或解锁用户对数据库的访问,可以用以下操作之一:
|
DEFAULT ROLE |
指定哪些角色是此用户的默认角色,设置为以下之一:
-
NONE (默认值):删除所有默认角色。
-
ALL :将所有用户角色设置为默认值。
当用户登录时,会自动激活默认角色。此参数指定的角色将取代之前分配的任何角色。
注意
DEFAULT ROLE 不能与其他 ALTER USER 参数一起指定。
|
GRACEPERIOD |
指定用户查询可以被任何会话套接字拦截多长时间,可以是以下值之一:
有关详细信息,请参阅处理会话套接字阻止。
|
IDENTIFIED BY |
更改用户密码:
IDENTIFIED BY '[new-password]'
['hashed-password' SALT 'hash-salt']
[REPLACE 'current-password']
-
new-password:Vertica 随后将进行哈希处理以用于内部存储的 ASCII 密码。如果为空字符串,则该用户无需密码即可访问数据库。
-
hashed-password: 经过预哈希处理的密码及其关联的十六进制字符串 hash-salt。以这种方式设置密码会绕过所有密码复杂性要求。
-
REPLACE:对于必须提供当前密码的非超级用户来说,为必需选项。非超级用户只能更改自己的密码。
有关详细信息,请参阅“密码指导原则”和“创建数据库名称和密码”。
|
IDLESESSIONTIMEOUT |
系统在断开空闲会话之前所等待的时间长度,可以为以下值之一:
有关详细信息,请参阅管理客户端连接。
|
MAXCONNECTIONS |
设置用户可以与服务器建立的最大连接数,可以为以下值之一:
-
NONE (默认值):没有设置限制。如果省略此参数,则用户可以在数据库群集中拥有无限数量的连接。
-
integer ON DATABASE :设置为 integer,跨数据库群集的最大连接数。
-
integer ON NODE :设置为 integer,到每个节点的最大连接数。
有关详细信息,请参阅管理客户端连接。
|
MEMORYCAP |
设置可以为用户请求分配的内存量,可以为下之值一:
-
NONE (默认值):没有限制
-
一个字符串值,用于指定内存限制,为以下几项之一:
|
PASSWORD EXPIRE |
强制用户密码立即到期。用户必须在下次登录时更改密码。
注意
PASSWORD EXPIRE 使用外部密码身份验证方法(例如 LDAP 或 Kerberos)时,不起任何作用。
|
PROFILE |
分配一个配置文件来控制此用户的密码要求,可以为以下值之一:
|
RENAME TO
|
为用户分配新的用户名。分配给用户的所有权限保持不变。
注意
RENAME TO 不能与其他 ALTER USER 参数一起指定。
|
RESOURCE POOL |
将默认资源池文件分配给该用户。还必须对用户授予此池的权限,除非该池的权限设置为 PUBLIC 。 |
RUNTIMECAP |
设置此用户的查询可以执行多长时间,可以为以下值之一:
查询的运行时限制可以在三个级别设置:用户的运行时限制、用户的资源池和会话设置。有关详细信息,请参阅为查询设置运行时限制。
|
SEARCH_PATH |
指定用户默认搜索路径,此路径会指示 Vertica 在哪个架构中搜索引用的未限定表和 UDF,可以是以下值之一:
-
DEFAULT (默认值):按如下方式设置搜索路径:
"$user", public, v_catalog, v_monitor, v_internal
-
以逗号分隔的架构列表。
有关详细信息,请参阅设置搜索路径。
|
SECURITY_ALGORITHM 'algorithm' |
设置哈希身份验证的用户级别安全算法,其中 algorithm 为以下之一:
当您更改 SECURITY_ALGORITHM 值时,用户密码将会过期,因此必须重置密码。
|
TEMPSPACECAP |
设置用户请求可用的临时文件存储量,可以为下之值一:
-
NONE (默认值):没有限制
-
指定存储限制的字符串值,可以为下之值一:
|
|
特权
非超级用户可以在自己的用户帐户上更改以下选项:
-
IDENTIFIED BY
-
RESOURCE POOL
-
SEARCH_PATH
-
SECURITY_ALGORITHM
将另一个用户的默认资源池更改为 PUBLIC 架构之外的资源池时,用户必须至少通过以下途径之一获得资源池的 USAGE 权限:
设置用户级别配置参数
SET | CLEAR PARAMETER 只能指定用户级别配置参数,否则 Vertica 将返回错误。只有超级用户可以设置和清除用户级别参数,除非它们在会话级也受支持。
要获取用户级别参数的名称,请查询系统表 CONFIGURATION_PARAMETERS。例如:
=> SELECT parameter_name, allowed_levels FROM configuration_parameters
WHERE allowed_levels ilike '%USER%' AND parameter_name ilike '%depot%' ORDER BY parameter_name;
parameter_name | allowed_levels
-----------------------------+-------------------------
BackgroundDepotWarming | SESSION, USER, DATABASE
DepotOperationsForQuery | SESSION, USER, DATABASE
EnableDepotWarmingFromPeers | SESSION, USER, DATABASE
UseDepotForReads | SESSION, USER, DATABASE
UseDepotForWrites | SESSION, USER, DATABASE
(5 rows)
以下示例为两个用户 Yvonne 和 Ahmed 设置用户级别配置参数 UseDepotForWrites:
=> SHOW USER Yvonne PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Yvonne | DepotOperationsForQuery | Fetches
(1 row)
=> ALTER USER Yvonne SET PARAMETER UseDepotForWrites = 0;
ALTER USER
=> SHOW USER Yvonne PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Yvonne | DepotOperationsForQuery | Fetches
Yvonne | UseDepotForWrites | 0
(2 rows)
=> ALTER USER Ahmed SET PARAMETER DepotOperationsForQuery = 'Fetches';
ALTER USER
=> SHOW USER ALL PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Ahmed | DepotOperationsForQuery | Fetches
Yvonne | DepotOperationsForQuery | Fetches
Yvonne | UseDepotForWrites | 0
(3 rows)
示例
设置用户密码
=> CREATE USER user1;
=> ALTER USER user1 IDENTIFIED BY 'newpassword';
设置用户的安全算法和密码
此示例将用户的安全算法和密码分别设置为 SHA-512
和 newpassword
。执行 ALTER USER
语句时,Vertica 会使用 SHA-512 算法对密码进行哈希处理,并保存哈希:
=> CREATE USER user1;
=> ALTER USER user1 SECURITY_ALGORITHM 'SHA512' IDENTIFIED BY 'newpassword'
为用户分配默认角色
此示例使用户的已分配角色成为用户的默认角色。用户登录时会自动设置(启用)默认角色:
=> CREATE USER user1;
CREATE USER
=> GRANT role1, role2, role3 to user1;
=> ALTER USER user1 DEFAULT ROLE ALL;
您可以将 ALL 与 EXCEPT 配对以排除某些角色:
=> CREATE USER user2;
CREATE USER
=> GRANT role1, role2, role3 to user2;
=> ALTER USER user2 DEFAULT ROLE ALL EXCEPT role1;
另请参阅
1.30 - ALTER VIEW
修改现有
视图的元数据。更改将自动提交。
语法
一般用途:
ALTER VIEW [[database.]schema.]view {
| OWNER TO owner
| SET SCHEMA schema
| { INCLUDE | EXCLUDE | MATERIALIZE } [ SCHEMA ] PRIVILEGES
}
重命名视图:
ALTER VIEW [[database.]schema.]view[,...] RENAME TO new-view-name[,...]
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 视图
- 要更改的视图。
-
SET SCHEMA schema
- 将视图从一个架构移动到另一个架构。
-
OWNER TO owner
- 更改视图所有者。
重要
新的视图所有者还应对视图引用的对象具有 SELECT 权限;否则该用户将无法访问视图。
-
{ INCLUDE | EXCLUDE | MATERIALIZE } [SCHEMA] PRIVILEGES
- 指定此视图的架构权限的默认继承:
-
EXCLUDE [SCHEMA] PRIVILEGES
(默认)禁止从架构继承权限。
-
INCLUDE [SCHEMA] PRIVILEGES
将授予视图架构的相同权限授予视图。
-
MATERIALIZE
:将授权复制到视图并在视图上创建一个 GRANT 对象。这将禁用视图上继承的权限标志,让您可以:
-
在视图级别授予更具体的权限
-
使用架构级权限作为模板
-
将视图移动到不同的架构
-
更改架构权限而不影响视图
另请参阅 设置表和视图的权限继承。
RENAME TO
- 重命名一个或多个视图:
RENAME TO new‑view‑name[,...]
需要满足以下要求:
-
新的视图名称 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
如果指定多个要重命名的视图,源列表和目标列表必须具有相同数量的名称。
-
重命名一个视图需要对包含该视图的架构具有 USAGE
和 CREATE
权限。
特权
非超级用户:对架构的 USAGE 权限,为以下之一:
对于某些操作,非超级用户必须具备以下架构权限:
示例
将视图 view1
重命名为 view2
:
=> CREATE VIEW view1 AS SELECT * FROM t;
CREATE VIEW
=> ALTER VIEW view1 RENAME TO view2;
ALTER VIEW
2 - ACTIVATE DIRECTED QUERY
激活定向查询并使其可用于所有会话中的查询优化器。
语法
ACTIVATE DIRECTED QUERY [ query-name ]
参数
-
query-name
- 标识要激活的定向查询。如果省略,Vertica 将激活最后创建的定向查询。若要获取定向查询的标识符,请使用 GET DIRECTED QUERY 或查询系统表 DIRECTED_QUERIES。
特权
超级用户
激活生命周期
激活定向查询后,它将始终处于活动状态,直到被 DEACTIVATE DIRECTED QUERY 以显式方式停用或被 DROP DIRECTED QUERY 从存储空间中移除。如果在数据库关闭时定向查询处于活动状态,当您重新启动数据库时,Vertica 会自动将其重新激活。
示例
请参阅激活和停用定向查询。
3 - BEGIN
启动事务块。
语法
BEGIN [ WORK | TRANSACTION ] [ isolation‑level ] [ READ [ONLY] | WRITE ]
参数
WORK | TRANSACTION
- 仅为了提高可读性的可选关键字。
- isolation‑level
- 指定事务的隔离级别,用于确定当同时运行其他事务时此事务可以访问的数据,为以下之一:
有关详细信息,请参阅事务。
READ [ONLY] | WRITE
- 指定事务模式,为以下之一:
-
READ WRITE(默认):事务为读取/写入。
-
READ ONLY:事务为只读。
如果将事务会话模式设置为只读,将不允许使用以下 SQL 语句,但是不会阻止所有磁盘写入操作:
-
INSERT、UPDATE、DELETE 和 COPY(如果目标表不是临时表)
-
所有 CREATE、ALTER 和 DROP 命令
-
GRANT、REVOKE 和 EXPLAIN(如果要运行的 SQL 为上面引用的语句之一)。
特权
无
示例
创建一个隔离级别设置为 READ COMMITTED 且事务模式设置为 READ WRITE 的事务:
=> BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
BEGIN
=> CREATE TABLE sample_table (a INT);
CREATE TABLE
=> INSERT INTO sample_table (a) VALUES (1);
OUTPUT
--------
1
(1 row)
=> END;
COMMIT
另请参阅
4 - CALL
调用使用 CREATE PROCEDURE(存储) 创建的存储过程。
语法
CALL [[database.]schema.]procedure( [ argument-list] );
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
过程
- 存储过程的名称,其中 procedure 符合标识符中描述的约定。
- argument-list
- 要传递给存储过程的实参的逗号分隔列表,其类型与实参的 IN 参数的类型对应。
特权
非超级用户:对过程的 EXECUTE 权限
示例
请参阅 执行存储过程 和 存储过程:用例和示例。
另请参阅
5 - COMMENT ON 语句
COMMENT ON
此语句用于对数据库对象(如架构、表和库)创建注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
5.1 - 有关约束的注释
添加、修订或移除有关约束的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON CONSTRAINT constraint ON [[database.]schema.]table IS ... {'comment' | NULL };
参数
-
约束
- 与注释相关联的约束的名称。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
表
- 要与注释相关联的表约束的名称。
-
注释
- 指定要添加的注释文本。如果此约束已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 promotion_dimension 表上的 constraint_x
约束添加了一条注释:
=> COMMENT ON CONSTRAINT constraint_x ON promotion_dimension IS 'Primary key';
以下示例从 promotion_dimension 表上的 constraint_x
约束中移除了一条注释:
=> COMMENT ON CONSTRAINT constraint_x ON promotion_dimension IS NULL;
5.2 - 有关函数的注释
添加、修订或移除有关函数的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON FUNCTION [[database.]schema.]function (function‑args) IS { 'comment' | NULL };
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
function
- 要与注释相关联的函数的名称。
function‑args
- 函数实参。
comment
- 指定要添加的注释文本。如果此函数已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 macros.zerowhennull (x INT)
函数添加了一条注释:
=> COMMENT ON FUNCTION macros.zerowhennull(x INT) IS 'Returns a 0 if not NULL';
以下示例从 macros.zerowhennull (x INT)
函数中移除了一条注释:
=> COMMENT ON FUNCTION macros.zerowhennull(x INT) IS NULL;
5.3 - COMMENT ON AGGREGATE FUNCTION
添加、修订或移除聚合函数的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON AGGREGATE FUNCTION [[database.]schema.]function (function‑args) IS { 'comment' | NULL };
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
function
- 要与注释相关联的聚合函数的名称。
function‑args
- 函数实参。
comment
- 指定要添加的注释文本。如果此函数已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 APPROXIMATE_MEDIAN(x FLOAT)
函数添加了一条注释:
=> COMMENT ON AGGREGATE FUNCTION APPROXIMATE_MEDIAN(x FLOAT) IS 'alias of APPROXIMATE_PERCENTILE with 0.5 as its parameter';
以下示例从 APPROXIMATE_MEDIAN(x FLOAT)
函数中移除了一条注释:
=> COMMENT ON AGGREGATE FUNCTION APPROXIMATE_MEDIAN(x FLOAT) IS NULL;
5.4 - COMMENT ON ANALYTIC FUNCTION
添加、修订或移除分析函数的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON ANALYTIC FUNCTION [[database.]schema.]function (function‑args) IS { 'comment' | NULL };
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
function
- 要与注释相关联的分析函数的名称。
function‑args
- 函数实参。
comment
- 指定要添加的注释文本。如果此函数已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向用户定义的 an_rank()
函数添加了一条注释:
=> COMMENT ON ANALYTIC FUNCTION an_rank() IS 'built from the AnalyticFunctions library';
以下示例从用户定义的 an_rank()
函数中移除了一条注释:
=> COMMENT ON ANALYTIC FUNCTION an_rank() IS NULL;
5.5 - 有关库的注释
添加、修订或移除有关库的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON LIBRARY [[database.]schema.]library IS {'comment' | NULL}
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
库
- 与注释相关联的库的名称。
-
注释
- 指定要添加的注释文本。如果此库已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向库添加了一条注释 MyFunctions:
=> COMMENT ON LIBRARY MyFunctions IS 'In development';
以下示例从库中移除了一条注释 MyFunctions:
=> COMMENT ON LIBRARY MyFunctions IS NULL;
另请参阅
5.6 - 有关节点的注释
添加、修订或移除有关节点的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
如果删除某个对象,将删除与该对象关联的所有注释。
语法
COMMENT ON NODE node‑name IS { 'comment' | NULL }
参数
- node‑name
- 与注释相关联的节点的名称。
- 注释
- 指定要添加的注释文本。如果此节点已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例为 initiator node
添加了一条注释:
=> COMMENT ON NODE initiator IS 'Initiator node';
以下示例从 initiator node
中移除了一条注释:
=> COMMENT ON NODE initiator IS NULL;
另请参阅
COMMENTS
5.7 - COMMENT ON PROJECTION
添加、修订或移除有关投影的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
如果删除某个对象,将删除与该对象关联的所有注释。
语法
COMMENT ON PROJECTION [[database.]schema.]projection IS { 'comment' | NULL }
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- projection
- 与注释相关联的投影的名称。
- 注释
- 指定要添加的注释的文本。如果此投影已存在注释,则您在此处输入的注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 customer_dimension_vmart_node01
投影添加了一条注释:
=> COMMENT ON PROJECTION customer_dimension_vmart_node01 IS 'Test data';
以下示例从 customer_dimension_vmart_node01
投影中移除了一条注释:
=> COMMENT ON PROJECTION customer_dimension_vmart_node01 IS NULL;
另请参阅
COMMENTS
5.8 - COMMENT ON PROJECTION COLUMN
添加、修订或移除投影列注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON COLUMN [[database.]schema.]projection.column IS {'comment' | NULL}
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
projection.column
- 要与注释相关联的投影和列的名称。
- 注释
- 指定要添加的注释文本。如果此列已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 customer_dimension 投影中的 customer_name
列添加了一条注释:
=> COMMENT ON COLUMN customer_dimension_vmart_node01.customer_name IS 'Last name only';
以下示例从 customer_dimension 投影中的 customer_name
列中移除了一条注释:
=> COMMENT ON COLUMN customer_dimension_vmart_node01.customer_name IS NULL;
5.9 - 有关架构的注释
添加、修订或移除有关架构的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON SCHEMA schema-name IS {'comment' | NULL}
参数
-
schema‑name
- 与注释相关联的架构。
-
注释
- 要添加的注释的文本。如果此架构已存在注释,则您在此处输入的注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 public
架构添加了一条注释:
=> COMMENT ON SCHEMA public IS 'All users can access this schema';
以下示例从 public
架构中移除了一条注释。
=> COMMENT ON SCHEMA public IS NULL;
5.10 - 有关序列的注释
添加、修订或移除有关序列的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON SEQUENCE [[database.]schema.]sequence IS { 'comment' | NULL }
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
序列
- 与注释相关联的序列的名称。
-
注释
- 指定要添加的注释的文本。如果此序列已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向名为 prom_seq 的序列添加了一条注释。
=> COMMENT ON SEQUENCE prom_seq IS 'Promotion codes';
以下示例从 prom_seq 序列中移除了一条注释。
=> COMMENT ON SEQUENCE prom_seq IS NULL;
5.11 - 有关表的注释
添加、修订或移除有关表的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON TABLE [[database.]schema.]table IS { 'comment' | NULL }
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 要与注释相关联的表的名称。
- 注释
- 指定要添加的注释的文本。注释的文本两边需要加上单引号。如果此表已存在注释,则您在此处输入的注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除之前添加的注释。
特权
非超级用户:对象所有者
示例
以下示例向 promotion_dimension 表添加了一条注释:
=> COMMENT ON TABLE promotion_dimension IS '2011 Promotions';
以下示例从 Promotion_dimension 表中移除了一条注释:
=> COMMENT ON TABLE promotion_dimension IS NULL;
5.12 - COMMENT ON TABLE COLUMN
添加、修订或移除表列注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON COLUMN [[database.]schema.]table.column IS {'comment' | NULL}
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
table.column
- 要与注释相关联的表和列的名称。
- 注释
- 指定要添加的注释文本。如果此列已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 store
架构的 store_sales_fact
表中的 transaction_time
列添加了一条注释:
=> COMMENT ON COLUMN store.store_sales_fact.transaction_time IS 'GMT';
以下示例从 store
架构的 store_sales_fact
表中的 transaction_time
列中移除了一条注释:
=> COMMENT ON COLUMN store.store_sales_fact.transaction_time IS NULL;
5.13 - 有关转换函数的注释
添加、修订或移除有关用户定义的转换函数的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON TRANSFORM FUNCTION [[database.]schema.]tfunction
...( [ tfunction-arg-name tfunction-arg-type ][,...] ) IS {'comment' | NULL}
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
tfunction
- 要与注释相关联的转换函数的名称。
-
tfunction‑arg‑name tfunction‑arg‑type
- 一个或多个转换函数实参的名称和数据类型。如果您提供了参数名称和类型,则每种类型必须与用于创建原始转换函数的库中指定的类型相匹配。
-
注释
- 指定要添加的注释文本。如果此转换函数已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 macros.zerowhennull (x INT)
UTF 函数添加了一条注释:
=> COMMENT ON TRANSFORM FUNCTION macros.zerowhennull(x INT) IS 'Returns a 0 if not NULL';
以下示例使用 acros.zerowhennull (x INT)
选项从 NULL
函数中移除了一条注释。
=> COMMENT ON TRANSFORM FUNCTION macros.zerowhennull(x INT) IS NULL;
5.14 - 有关视图的注释
添加、修订或移除有关视图的注释。每个对象可以有一条注释。注释存储在系统表
COMMENTS
中。
语法
COMMENT ON VIEW [[database.]schema.]view IS { 'comment' | NULL }
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
视图
- 要与注释相关联的视图的名称。
-
注释
- 指定要添加的注释的文本。如果此视图已存在注释,则此注释将覆盖之前的注释。
注释的长度最多为 8192 个字符。如果注释超出此限制,Vertica 将截断注释并通过消息提醒用户。
NULL
- 移除现有注释。
特权
非超级用户:对象所有者
示例
以下示例向 curr_month_ship
视图中添加了一条注释:
=> COMMENT ON VIEW curr_month_ship IS 'Shipping data for the current month';
以下示例从 curr_month_ship
视图中移除了一条注释:
=> COMMENT ON VIEW curr_month_ship IS NULL;
6 - COMMIT
结束当前事务,使事务期间发生的所有变更永久化且对其他用户可见。
COMMIT
等同于
END
语法
COMMIT [ WORK | TRANSACTION ]
参数
-
WORK TRANSACTION
- 仅为了提高可读性的可选关键字。
特权
无
示例
本示例显示如何提交插入。
=> CREATE TABLE sample_table (a INT);
=> INSERT INTO sample_table (a) VALUES (1);
OUTPUT
--------
1
=> COMMIT;
另请参阅
7 - CONNECT TO VERTICA
连接到另一个 Vertica 数据库,以便分别使用
COPY FROM VERTICA
和
导出到 VERTICA
在 Vertica 数据库之间导入和导出数据。
与另一个数据库建立连接后,该连接在当前会话中保持打开状态,直到使用
DISCONNECT
将其显式关闭。一次只能与另一个数据库建立一个连接。但是,您可以在同一会话中建立与不同数据库的连续连接。
默认情况下,通过 Vertica 专用网络调用 CONNECT TO VERTICA
。有关通过公用网络创建连接的信息,请参阅使用公共和专用 IP 网络。
语法
CONNECT TO VERTICA db‑spec USER username PASSWORD 'password' ON 'host', port
[ TLSMODE PREFER ]
[ TLSCONFIG tls_config_name ]
参数
- db‑spec
- 目标数据库,数据库名称或
DEFAULT
。
- username
- 连接到其他数据库时使用的用户名。
- password
- 包含用于连接到目标数据库的密码的字符串。
如果目标数据库没有密码,而您提供了密码,连接将成功;但是,Vertica 不会返回您提供的密码不正确的指示。
- host
- 包含其他数据库中某个节点的主机名的字符串。
- port
- 其他数据库的端口号,以整数形式表示。
- TLSMODE PREFER
- 将此连接的配置参数
ImportExportTLSMode
的值覆盖为 PREFER
。如果 ImportExportTLSMode
设置为 *_FORCE
,则无法进行覆盖。
如果 TLSMODE PREFER 和 ImportExportTLSMode
均未设置,CONNECT TO VERTICA 将使用 ENABLE。
- TLSCONFIG tls_config_name
- 要用于 TLS 的 TLS CONFIGURATION。
从不使用指定的 TLS CONFIGURATION 的 TLSMODE。相反,CONNECT TO VERTICA 使用 TLSMODE PREFER 和 ImportExportTLSMode 参数。
特权
无
安全要求
如 安全性和身份验证 中所述,对 Vertica 数据库执行导入/导出时,您只能连接到使用受信任(仅限用户名)或基于密码的身份验证的数据库。不支持 SSL 身份验证。
如果配置了证书,Vertica 会在传输期间使用 TLS 加密数据并尝试加密计划元数据。您可以设置配置参数
ImportExportTLSMode
,以要求对计划元数据进行加密。
示例
=> CONNECT TO VERTICA ExampleDB USER dbadmin PASSWORD 'Password123' ON 'VerticaHost01',5433;
CONNECT
8 - COPY
COPY 可将数据批量加载到 Vertica 数据库中。默认情况下,COPY 会自动提交自身及所有当前事务(加载临时表时除外)。如果 COPY 被中止或中断,Vertica 将予以回退。
COPY 以 UTF-8 编码格式读取数据。
有关在群集主机或客户端系统上加载一个或多个文件或管道的信息,请参阅 COPY LOCAL。
语法
COPY [ /*+ LABEL (label‑string)*/ ] [[database.]schema-name.]target-table
[ ( { column-as-expression | column }
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char' ]
[ ENFORCELENGTH ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ FILLER datatype]
[ FORMAT 'format' ]
[ NULL [ AS ] 'string' ]
[ TRIM 'byte' ]
[,...] ) ]
[ COLUMN OPTION (column
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char' ]
[ ENFORCELENGTH ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ FORMAT 'format' ]
[ NULL [ AS ] 'string' ]
[ TRIM 'byte' ]
[,...] ) ]
FROM {
[ LOCAL ] STDIN [ compression ]
| { 'path-to-data'
[ ON { nodename | (nodeset) | ANY NODE | EACH NODE } ] [ compression ] }[,...]
[ PARTITION COLUMNS column[,...] ]
| LOCAL 'path-to-data' [ compression ] [,...]
| VERTICA source-database.[source-schema.]source-table[( source-column[,...] ) ]
}
[ NATIVE
| FIXEDWIDTH COLSIZES {( integer )[,...]}
| NATIVE VARCHAR
| ORC
| PARQUET
]
| [ WITH ] UDL-clause[...]
}
[ ABORT ON ERROR ]
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char'
[ ENFORCELENGTH ]
[ ERROR TOLERANCE ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ EXCEPTIONS 'path' [ ON nodename] [,...]
[ NULL [ AS ] 'string' ]
[ RECORD TERMINATOR 'string' ]
[ REJECTED DATA {'path' [ ON nodename] [,...] | AS TABLE reject-table} ]
[ REJECTMAX integer ]
[ SKIP integer ]
[ SKIP BYTES integer ]
[ STREAM NAME 'streamName']
[ TRAILING NULLCOLS ]
[ TRIM 'byte' ]
[ [ WITH ] PARSER parser ([ arg=value[,...] ]) ] ]
[ NO COMMIT ]
参数
请参阅参数。
限制
请参阅限制。
特权
超级用户具有完整的 COPY 权限。以下要求适用于非超级用户:
COPY 可以指定一个路径来存储被拒绝的数据和异常。如果路径解析为存储位置,则以下权限适用于非超级用户:
8.1 - 参数
COPY 参数及其描述分为以下部分:
目标选项
以下选项适用于目标表及其列:
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
在 CREATE EXTERNAL TABLE 或 CREATE FLEX EXTERNAL TABLE 语句中使用时,COPY 将忽略 schema-name。
-
target-table
- 用于加载新数据的目标列式表或 Flex 表。Vertica 将数据从架构表加载到包含列的全部投影中。
-
column-as-expression
- 用于计算目标列值的表达式,不可以是复杂类型。例如:
=> COPY t(year AS TO_CHAR(k, 'YYYY')) FROM 'myfile.dat'
当加载到目标数据库时,使用该选项来转换数据。
有关详细信息,请参阅在加载期间转换数据。
-
列
- 限制加载至表中一个或多个指定列。如果未指定列,COPY 将默认加载所有列。
将向从列列表中忽略的表列分配其 DEFAULT 或 SET USING 值(如有);否则,COPY 将插入 NULL。
如果将 column 参数留空以加载表中的所有列,则可以使用可选参数 COLUMN OPTION 来为特定列指定解析选项。
数据文件必须包含与 COPY 命令列列表中数量相同的列。
COLUMN OPTION
- 为表列列表中声明的一个或多个列指定加载元数据。例如,可以指定一个具有自己的 DELIMITER、ENCLOSED BY 或 NULL AS 等表达式的列。不必在 COLUMN OPTION 列表中显式指定每个列名称,但是指定的每一列必须对应表列列表中的列。
列选项
根据选项的指定方式,以下 COPY 选项可以对特定列或所有列进行限定。某些解析器特定选项也可以应用于特定列或所有列。有关这两种模式的详细信息,请参阅全局选项和特定于列的选项。
ENFORCELENGTH
- 如果指定,COPY 将拒绝 CHAR、VARCHAR、BINARY 和 VARBINARY 类型的数据行,或集合中这些类型的元素(如果集合大于声明的大小)。
默认情况下,COPY 会截断这些数据类型的违反约束的行以及集合中这些类型的元素,但不会拒绝这些行。有关更多详细信息,请参阅处理混乱数据。
如果集合不适合其所有元素,COPY 会拒绝行,但不会截断。不会减少元素的数量。如果每个元素各自都在限制范围内,但元素数量导致集合超过列的最大大小,则可能会发生这种情况。
-
FILLER datatype
- 读取但不复制输入列的数据。使用填充内容列来忽略在表中没有列的输入列。还可以使用填充内容列来转换数据(请参阅示例和在加载期间转换数据)。填充内容列不可以是复杂类型。
-
FORMAT 'format'
- 输入格式,为以下之一:
请参阅二进制(原生)数据了解更多关于这些格式的信息。
加载日期/时间列时,使用 FORMAT 会显著提升加载性能。COPY 与 TO_DATE 函数支持相同的格式。请参阅用于日期/时间格式化的模板模式。
如果指定了无效格式的字符串,COPY 操作将返回错误。
NULL [AS]
- 该字符串表示空值。默认为一个空字符串 (
''
)。可以将 null 值指定为 E'\000'
至 E'\177'
(包含)范围内的任何 ASCII 值。不能对 DELIMITER 和 NULL 选项使用相同的字符。有关详细信息,请参阅分隔数据。
输入选项
以下选项可用于指定源数据:
LOCAL
- 在客户端系统上加载数据文件,而不是在群集主机上。LOCAL 可以限定 STDIN 和 path-to-data 参数。有关详细信息,请参阅COPY LOCAL。
限制: 对 CREATE EXTERNAL TABLE AS COPY
STDIN
无效
- 从客户端读取标准输入而非文件。STDIN 只接受一个输入源。要加载多个输入源,请使用 path-to-data。
用户必须具有表的 INSERT 权限以及架构的 USAGE 权限。
限制: 对 CREATE EXTERNAL TABLE AS COPY 无效
-
path-to-data
- 指定包含数据的文件的绝对路径,可来自多个输入源。
-
如果文件存储在 HDFS 中,则 path-to-data webhdfs
是架构中的 URI,通常为 [[s]web]hdfs://[nameservice]/path
。请参阅HDFS 文件系统。
-
如果文件存储在 S3 存储桶中,则 path-to-data 是格式为 s3://bucket/path
的 URI。请参阅S3 对象存储。
-
如果文件存储在 Google Cloud Storage 中,则 path-to-data 是格式为 gs://bucket/path
的 URI。请参阅Google Cloud Storage (GCS) 对象存储。
-
如果文件存储在 Azure Blob 存储中,则 path-to-data 是格式为 azb://account/container/path
的 URI。请参阅Azure Blob 存储对象存储。
-
如果文件位于本地 Linux 文件系统或 NFS 装载上,则 path-to-data 为本地绝对文件路径。
path-to-data 可以选择包含通配符以和多个文件匹配。文件必须可供本地客户端或 COPY 语句运行的主机访问。COPY 会跳过文件列表中的空文件。若文件列表包含目录,则会导致查询失败。请参阅指定加载数据的位置。在 Linux Manual Page for Glob (7) 中指定了通配符支持的模式,对于 ADO.net 平台,则通过 NET Directory.getFiles 方法指定。
可使用变量来构建 使用加载脚本 中描述的路径名。
如果 path-to-data 解析为本地文件系统上的存储位置,且调用 COPY 的用户为非超级用户,则将应用以下要求:
此外,如果用户具有权限但不是超级用户,并且从该存储位置调用 COPY,Vertica 会确保符号链接不会导致未经授权的访问。
-
PARTITION COLUMNS column[,...]
- 其值在目录结构中而不是在数据中指定的列。此选项在路径包含形式为
colname=value
的目录名称时有效,例如:
/data/created=2016-01-01/*.dat
/data/created=2016-01-02/*.dat
/data/created=2016-01-03/*.dat
值通过目录名称的 value 部分进行解析。如果不能强制转换为列数据类型,该值将被拒绝。如果该值缺失,COPY 会将其加载为 null。
以下示例将这些日期与数据文件中的其他列一起加载到表列中:
=> CREATE EXTERNAL TABLE records
(id int, name varchar(50), created date)
AS COPY FROM 'webhdfs:///path/*/*'
PARTITION COLUMNS created;
有关详细信息,请参阅分区文件路径。
-
ON nodename
- 指定要复制的数据所驻留的节点以及应解析加载文件的节点。如果忽略 nodename,输入文件的位置默认为启动程序节点。使用 nodename 从 COPY 启动程序节点以外的节点复制和解析加载文件。
注意
nodename 对 STDIN 和 LOCAL 无效。
-
ON (nodeset)
- 指定一组要在其上执行加载的节点。相同数据必须可供在所有指定节点上加载。nodeset 是括号中节点名称的逗号分隔列表。例如:
=> COPY t FROM 'file1.txt' ON (v_vmart_node0001, v_vmart_node0002);
Vertica 将加载分摊到所有指定节点。如果同时指定了 ERROR TOLERANCE 或 REJECTMAX,Vertica 会改为选择单个节点来执行加载。
如果数据在所有节点上都可用,则通常会使用 ON ANY NODE,这是从 HDFS 和云对象存储加载所使用的默认值。但是,可以使用 ON nodeset 在并发加载之间手动平衡加载。
-
ON ANY NODE
- 指定要加载的源文件在所有节点上都可用,这样 COPY 可以打开文件并从群集的任一节点解析。对于 Eon 模式数据库,COPY 将使用与启动程序相同的子群集中的节点。
当心
所有节点上的文件必须相同。如果其中两个节点上的文件不同,则将返回不正确或不完整的结果,但不显示错误或警告。
如果文件足够大,可以进行分摊,Vertica 会尝试在多个节点之间分摊加载。如果指定了 ERROR TOLERANCE 或 REJECTMAX,Vertica 将选择单个节点。
可使用通配符或 glob(如 *.dat
)并结合 ON ANY NODE 子句加载多个输入文件。如果使用 glob,COPY 会将文件列表分配至所有群集节点并分散工作负载。
ON ANY NODE 对于 STDIN 和 LOCAL 无效。STDIN 只能使用客户端主机,LOCAL 表示客户端节点。
ON ANY NODE 是从 Linux 以外的所有路径(HDFS 和云对象存储)加载时使用的默认值。
ON EACH NODE
- 从每个节点的指定路径加载数据。当每个节点上的数据文件不同,且您想要加载所有这些文件时,请使用此选项。如果路径在所有节点上都无效,则 COPY 会加载有效路径并生成警告。如果路径是共享位置,则 COPY 仅在 ON ANY NODE 上加载一次。
-
compression
- 输入压缩类型,为以下之一:
-
UNCOMPRESSED(默认)
-
BZIP
-
GZIP
-
LZO
-
ZSTD
输入文件可以是任何格式。如果使用通配符,所有的限定输入文件必须是相同的格式。要加载不同的文件格式,则指定具体的格式类型。
以下要求和限制适用:
-
使用串联的 BZIP 或 GZIP 文件时,确认所有的源文件在串联之前使用记录终止符终止。
-
串联的 BZIP 和 GZIP 文件不支持 NATIVE(二进制)和 NATIVE VARCHAR 格式。
-
LZO 文件假定使用 lzop
进行压缩。Vertica 支持以下 lzop 实参:
-
--no-checksum
/ -F
-
--crc32
-
--adler32
-
--no-name
/ -n
-
--name
/ -N
-
--no-mode
-
--no-time
-
--fast
-
--best
-
编号的压缩级别
-
BZIP、GZIP、ZSTD 和 LZO 压缩不能与 ORC 格式结合使用。
VERTICA
- 请参阅COPY FROM VERTICA。
-
[WITH] UDL-clause[...]
- 指定一个或多个用户定义的加载函数、一个源和(可选)一个或多个筛选器和一个解析器,如下所示:
SOURCE source( [arg=value[,...] ]
[ FILTER filter( [arg=value[,...] ] ) ]...
[ PARSER parser( [arg=value[,...] ] ) ]
要为列表使用 Flex 表解析器,请使用 PARSER 参数,后跟 Flex 表解析器实参。有关支持的 Flex 表解析器,请参阅将数据批量加载到 Flex 表中。
处理选项
以下选项用于控制 COPY 如何处理不同的突发事件:
ABORT ON ERROR
- 指定如果有任何行被拒绝,则停止 COPY。语句将被回滚,并且不加载数据。
-
COLSIZES (integer[,...])
- 加载固定宽度数据时指定列宽。COPY 要求在使用 FIXEDWIDTH 解析器时指定 COLSIZES。COLSIZES 与整数列表必须与表列列表中所列出的列对应。有关详细信息,请参阅固定宽度格式数据。
ERROR TOLERANCE
- 指定加载数据时,COPY 在执行过程中独立处理每个源。如果单个源无效,则语句不会回滚。将跳过无效的源,并继续加载。
使用此参数可禁用分摊加载。
限制: 对 ORC 或 Parquet 数据无效
-
EXCEPTIONS
- 指定文件名或要写入异常的文件的绝对路径,如下所示:
EXCEPTIONS 'path' [ ON nodename[,...]]
异常描述了每个被拒绝的行被拒绝的原因。每个异常描述了通过 REJECTED DATA 选项指定的文件中的相应记录。
文件将被写入执行加载的一个或多个节点上。如果文件已经存在,其将被覆盖。
要收集某个位置的所有异常,请使用 REJECTED DATA AS TABLE 子句,异常会自动列在表的 rejected_reason
列中。
ON nodename 子句将 nodename 上的现有异常文件移至同一节点上所示的 path。有关详细信息,请参阅保存加载异常 (EXCEPTIONS)。
如果将此参数与 COPY...ON ANY NODE 一起使用,则仍必须为异常文件指定单独的节点,如以下示例中所示:
EXCEPTIONS '/home/ex01.txt' on v_db_node0001,'/home/ex02.txt'
on v_db_node0002,'/home/ex03.txt' on v_db_node0003
如果 path 解析为存储位置,则以下权限适用于非超级用户:
-
REJECTED DATA
- 指定在何处写入加载失败的每一行。如果指定此参数,则将始终写入由于解析错误而失败的记录。仅当设置了配置参数 CopyFaultTolerantExpressions 时,才会写入由于转换过程中的错误而失败的记录。
此参数的语法为:
REJECTED DATA
{ 'path' [ ON nodename ] [,...] | AS TABLE reject-table }
Vertica 可以将被拒绝的数据写入指定路径或表:
-
'path' [ON nodename]
:将被拒绝的行数据复制到执行加载的节点上的指定路径。如果通过 ON nodename 进行限定,Vertica 会将 nodename 上现有的被拒绝的数据文件移至同一节点上的 path。
path 的值可以是目录,也可以是文件前缀。如果存在多个加载源,会始终将 path 视为目录。如果不存在多个加载源,但 path 以 '/
' 结尾,或者如果该名称的目录已经存在,则也会将其视为目录。否则,会将 path 视为文件前缀。
文件将被写入执行加载的一个或多个节点上。如果文件已经存在,其将被覆盖。
当将此参数与 LOCAL 结合使用时,输出将写入客户端。
注意
请勿使用 ON ANY NODE 限定 path。要收集某个位置所有被拒绝的数据(无论加载如何分布),请使用表。
-
AS TABLE reject-table:将被拒绝的行保存到 reject-table。
有关这两个选项的详细信息,请参阅处理杂乱的数据。
-
REJECTMAX integer
- 加载失败前可以拒绝的逻辑记录的最大数量。有关详细信息,请参阅处理杂乱的数据。
REJECTMAX 禁用分摊加载。
-
SKIP integer
- 要在加载文件中跳过的记录的数量。例如,可以使用 SKIP 选项来省略表头信息。
限制: 对 ORC 或 Parquet 数据无效
STREAM NAME
- 提供 COPY 加载流标识符。使用流名称有助于快速识别特定加载。您在加载语句中提供的 STREAM NAME 值将出现在系统表 LOAD_STREAMS 和 LOAD_SOURCES 的 STREAM_NAME 列中。
无效的流名称包含长度最多为 128 字节的字母数字字符或特殊字符组合。
例如:
=> COPY mytable FROM myfile
DELIMITER '|' STREAM NAME 'My stream name';
-
WITH parser
- 指定批量加载列式表时要使用的解析器,为以下之一:
默认情况下,COPY 在 UTF-8 格式下使用 DELIMITER 解析器,分隔文本输入数据。如果未直接指定 DELIMITER 解析器,则缺少特定解析器将表示使用默认设置。
要为列表使用 Flex 表解析器,请使用 PARSER 参数,后跟 Flex 表解析器实参。有关支持的 Flex 表解析器,请参阅将数据批量加载到 Flex 表中。
加载到 Flex 表时,必须使用兼容的解析器。有关支持的 Flex 表解析器,请参阅将数据批量加载到 Flex 表中。
COPY LOCAL 不支持 NATIVE、NATIVE VARCHAR、ORC 和 PARQUET 解析器。
有关复杂数据类型支持的解析器,请参阅特定解析器的文档。
有关解析器的详细信息,请参阅数据加载中的数据格式。
-
NO COMMIT
- 防止 COPY 语句在完成复制数据时自动提交事务。此选项必须是最后一个 COPY 语句参数。
有关详细信息,请参阅使用事务暂存加载。
限制: 对 ORC 或 Parquet 数据无效,将被 CREATE EXTERNAL TABLE AS COPY 忽略
解析器特定选项
以下选项仅在使用特定解析器时适用。
DELIMITED 解析器
DELIMITER
表示一个 ASCII 字符,用于分隔文件中每条记录内的各个列。您可以使用 E'\000' 到 E'\177'(包含)范围内的任何 ASCII 值。不能对 DELIMITER 和 NULL 参数使用相同的字符。有关详细信息,请参阅分隔数据。
默认值: 竖线 ('|')。
ENCLOSED [BY]
设置在要其内封装数据的引号字符,允许分隔字符嵌套在字符串值中。可选择范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 字符):E'\000')。默认情况下,ENCLOSED BY 没有值,即数据不会被任何类型的引号字符包围。
ESCAPE [AS]
设置转义字符。设置后,转义字符后面的字符将按字面意思解释,而不是解释为特殊字符。您可以使用 E'\001' 至 E'\177'(包含)范围内的任何 ASCII 值来定义转义字符(包括除 NULL 以外的任何 ASCII 字符:E'\000')。
COPY 语句不会将它读取的数据解释为字符串字面量。它也不遵循与其他 SQL 语句(包括 COPY 参数)相同的转义规则。读入数据时,COPY 仅解释被以下选项定义为特殊值的字符:
-
ESCAPE [AS]
-
DELIMITER
-
ENCLOSED [BY]
-
RECORD TERMINATOR
-
All COLLECTION 选项
默认值: 反斜线 ('\')。
NO ESCAPE
消除转义字符处理。如果不需要任何转义字符并且想要防止数据中的字符不被解释为转义序列,则使用该选项。
RECORD TERMINATOR
- 指定表明数据文件记录结束的字面量字符字符串。有关使用此参数的更多信息,请参见 分隔数据。
TRAILING NULLCOLS
- 指定如果 Vertica 遇到的记录不具有足够数据来匹配表列列表中的列,COPY 将使用 NULL 值插入缺失的列。有关其他信息和示例,请参阅固定宽度格式数据。
COLLECTIONDELIMITER
对于集合类型的列,表示用于分隔每个集合中元素的单个 ASCII 字符。您可以使用 E'\000' 到 E'\177'(包含)范围内的任何 ASCII 值。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。有关详细信息,请参阅分隔数据。
默认值: 逗号 (',')。
COLLECTIONOPEN
, COLLECTIONCLOSE
对于集合类型的列,这些选项指示标记集合开头和结尾的字符。在元素列表中的其他地方使用这些字符而不转义它们是错误的。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。
默认值: 方括号('[' 和 ']')。
COLLECTIONNULLELEMENT
该字符串表示集合中空元素值。可将一个 null 值指定为在范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 值:E'\000')。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。有关详细信息,请参阅分隔数据。
默认值: 'null'
COLLECTIONENCLOSE
对于集合类型的列,设置在要其内封装单个元素的引号字符,允许分隔字符嵌套在字符串值中。可选择范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 字符):E'\000')。
没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。
默认: 双引号('"')
FIXEDWIDTH 解析器
-
SKIP BYTES integer
- 要在记录中跳过的总字节数。
TRIM
- 截取从列中指定的字符数。此选项仅在加载固定宽度数据时可用。您可以在表级别设置列的 TRIM,或将其作为 COLUMN OPTION 参数的一部分。
8.2 - 限制
COPY 具有以下限制:
无效数据
COPY 认为以下数据无效:
约束违规
如果在目标表中启用了主键、唯一键或检查约束以自动强制实施,Vertica 会在您加载新数据时强制实施这些约束。如果发生违规,Vertica 会回滚操作并返回错误。
空行处理
若 COPY
在加载数据时遇到空行,则既不会插入也不会拒绝该行,但 COPY
将递增行记录编号。评估被拒绝的记录时,请考虑此行为。如果您要返回被拒绝记录的列表,而 COPY
在加载数据时遇到空行,则被拒绝记录的位置将不会递增 1,如以下示例中所示。
该示例首先将值加载到将第一列定义为 INT 的表中。请注意第 3、4 和 8 行中的错误:
=> \! cat -n /home/dbadmin/test.txt
1 1|A|2
2 2|B|4
3 A|D|7
4 A|E|7
5
6
7 6|A|3
8 B|A|3
空行(5 和 6)会将错误报告转移到第 8 行:
=> SELECT row_number, rejected_data, rejected_reason FROM test_bad;
row_number | rejected_data | rejected_reason
------------+---------------+----------------------------------------------
3 | A|D|7 | Invalid integer format 'A' for column 1 (c1)
4 | A|E|7 | Invalid integer format 'A' for column 1 (c1)
6 | B|A|3 | Invalid integer format 'B' for column 1 (c1)
(3 rows)
压缩文件错误
加载压缩文件时,如果文件似乎已损坏,则 COPY
可能会中止并报告错误。例如,读取头块失败时,可能发生此行为。
磁盘配额
表和架构可以设置磁盘配额。如果加载违反任一配额,操作将失败。有关详细信息,请参阅磁盘配额。
8.3 - 解析器
Vertica 支持多种解析器以加载不同类型的数据。如下所述,某些解析器仅用于 Flex 表。
8.3.1 - DELIMITED
使用 DELIMITED 解析器(默认)通过 COPY 加载分隔的文本数据。您可以指定分隔符、转义字符、如何处理空值以及其他参数。
DELIMITED 解析器支持读取标量类型的一维集合(数组或集)。
DELIMITED 解析器同时支持分摊加载和协作解析。
COPY 选项
以下选项特定于此解析器。有关其他适用选项,请参阅参数。
DELIMITER
表示一个 ASCII 字符,用于分隔文件中每条记录内的各个列。您可以使用 E'\000' 到 E'\177'(包含)范围内的任何 ASCII 值。不能对 DELIMITER 和 NULL 参数使用相同的字符。有关详细信息,请参阅分隔数据。
默认值: 竖线 ('|')。
ENCLOSED [BY]
设置在要其内封装数据的引号字符,允许分隔字符嵌套在字符串值中。可选择范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 字符):E'\000')。默认情况下,ENCLOSED BY 没有值,即数据不会被任何类型的引号字符包围。
ESCAPE [AS]
设置转义字符。设置后,转义字符后面的字符将按字面意思解释,而不是解释为特殊字符。您可以使用 E'\001' 至 E'\177'(包含)范围内的任何 ASCII 值来定义转义字符(包括除 NULL 以外的任何 ASCII 字符:E'\000')。
COPY 语句不会将它读取的数据解释为字符串字面量。它也不遵循与其他 SQL 语句(包括 COPY 参数)相同的转义规则。读入数据时,COPY 仅解释被以下选项定义为特殊值的字符:
-
ESCAPE [AS]
-
DELIMITER
-
ENCLOSED [BY]
-
RECORD TERMINATOR
-
All COLLECTION 选项
默认值: 反斜线 ('\')。
NO ESCAPE
消除转义字符处理。如果不需要任何转义字符并且想要防止数据中的字符不被解释为转义序列,则使用该选项。
RECORD TERMINATOR
- 指定表明数据文件记录结束的字面量字符字符串。有关使用此参数的更多信息,请参见 分隔数据。
TRAILING NULLCOLS
- 指定如果 Vertica 遇到的记录不具有足够数据来匹配表列列表中的列,COPY 将使用 NULL 值插入缺失的列。有关其他信息和示例,请参阅固定宽度格式数据。
COLLECTIONDELIMITER
对于集合类型的列,表示用于分隔每个集合中元素的单个 ASCII 字符。您可以使用 E'\000' 到 E'\177'(包含)范围内的任何 ASCII 值。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。有关详细信息,请参阅分隔数据。
默认值: 逗号 (',')。
COLLECTIONOPEN
, COLLECTIONCLOSE
对于集合类型的列,这些选项指示标记集合开头和结尾的字符。在元素列表中的其他地方使用这些字符而不转义它们是错误的。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。
默认值: 方括号('[' 和 ']')。
COLLECTIONNULLELEMENT
该字符串表示集合中空元素值。可将一个 null 值指定为在范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 值:E'\000')。没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。有关详细信息,请参阅分隔数据。
默认值: 'null'
COLLECTIONENCLOSE
对于集合类型的列,设置在要其内封装单个元素的引号字符,允许分隔字符嵌套在字符串值中。可选择范围包含在 E'\001' 至 E'\177'(包含)的任何 ASCII 值(包括除 NULL 以外的任何 ASCII 字符):E'\000')。
没有任何 COLLECTION 选项可能具有与任何其他 COLLECTION 选项相同的值。
默认: 双引号('"')
示例
以下示例显示了默认行为,其中分隔符为 '|'
=> CREATE TABLE employees (id INT, name VARCHAR(50), department VARCHAR(50));
CREATE TABLE
=> COPY employees FROM STDIN;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 42|Sheldon Cooper|Physics
>> 17|Howard Wolowitz|Astronomy
>> \.
=> SELECT * FROM employees;
id | name | department
----+-----------------+--------------
17 | Howard Wolowitz | Astrophysics
42 | Sheldon Cooper | Physics
(2 rows)
以下示例显示如何使用默认选项加载数组值。
=> CREATE TABLE researchers (id INT, name VARCHAR, grants ARRAY[VARCHAR], values ARRAY[INT]);
CREATE TABLE
=> COPY researchers FROM STDIN;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 42|Sheldon Cooper|[US-7376,DARPA-1567]|[65000,135000]
>> 17|Howard Wolowitz|[NASA-1683,NASA-7867,SPX-76]|[16700,85000,45000]
>> \.
=> SELECT * FROM researchers;
id | name | grants | values
----+-----------------+------------------------------------+---------------------
17 | Howard Wolowitz | ["NASA-1683","NASA-7867","SPX-76"] | [16700,85000,45000]
42 | Sheldon Cooper | ["US-7376","DARPA-1567"] | [65000,135000]
(2 rows)
在以下示例中,集合括在大括号中并由句点分隔,且数组包含空值。
=> COPY researchers FROM STDIN COLLECTIONOPEN '{' COLLECTIONCLOSE '}' COLLECTIONDELIMITER '.';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 19|Leonard|{"us-1672".null."darpa-1963"}|{16200.null.16700}
>> \.
=> SELECT * FROM researchers;
id | name | grants | values
----+-----------------+------------------------------------+---------------------
17 | Howard Wolowitz | ["NASA-1683","NASA-7867","SPX-76"] | [16700,85000,45000]
42 | Sheldon Cooper | ["US-7376","DARPA-1567"] | [65000,135000]
19 | Leonard | ["us-1672",null,"darpa-1963"] | [16200,null,16700]
(3 rows)
8.3.2 - FAVROPARSER
解析来自 Avro 文件的数据。需要满足以下要求:
您可以使用强类型加载 Avro 源(数组、结构或组合)中的复杂类型,或将其作为灵活的复杂类型进行加载。将灵活的复杂类型加载到 VMap 列中的操作与加载到 Flex 表中一样。要加载复杂类型作为 VMap 列,请将列类型指定为 LONG VARBINARY。要保留复杂类型的索引,请将 flatten_maps
设置为 false。
加载到 Flex 表中时,Vertica 会将所有数据加载到 __raw__
(VMap) 列中,包括数据中的复杂类型。
此解析器不支持分摊加载或协作解析。
语法
FAVROPARSER ( [parameter=value[,...]] )
参数
flatten_maps
- 布尔值,是否平展所有 Avro 映射。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。
此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。
默认值:true
flatten_arrays
- 布尔值,是否平展所有 Avro 数组。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。
此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。
默认值:false
flatten_records
- 布尔值,是否平展所有 Avro 记录。键名必须通过嵌套层连接起来。该值为递归值,且会影响加载中的所有数据。
此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。
默认值:true
reject_on_materialized_type_error
布尔值,是否拒绝包含无法强制转换为兼容数据类型的实体化列值的数据行。如果值为 false 且无法强制类型,则解析器将该列中的值设置为 null。
如果该列是强类型复杂类型,而不是可变复杂类型,则复杂类型中的类型不匹配将导致整个列被视为不匹配。解析器不会部分加载复杂类型。
默认值:false
基元数据类型
FAVROPARSER 支持以下基元数据类型,包括复杂类型中的元素类型和字段值。
注意
Vertica 不具有显式 4 字节(32 位整数)或较小类型。相反,Vertica 编码和压缩可自动降低需要小于 64 位的值的存储开销。
Avro 逻辑类型
FAVROPARSER 支持以下 Avro 逻辑类型。目标列必须使用支持逻辑类型的 Vertica 数据类型。当尝试使用无效的逻辑类型加载数据时,将忽略此逻辑类型并使用基础 Avro 类型。
Avro 复杂数据类型
Avro 格式支持某些复杂数据类型。加载到强类型列时,您可以使用 ROW 和 ARRAY 类型来表示这些类型。例如,Avro Record 和 Enums 为结构 (ROW);请参阅 Avro 规范。
您可以使用 ARRAY[ROW] 来匹配 Avro 映射。必须将 ROW 字段命名为 key
和 value
。这些是 Avro 格式用于数据中的字段的名称,解析器通过字段名称将数据与表列进行匹配。
当加载到 Flex 表或使用灵活的复杂类型时,此解析器会按如下方式处理 Avro 复杂类型:
Record
各字段的名称被用作虚拟列名称。如果 flatten_records
为 true,且存在几个嵌套级别,Vertica 将连接 record 名称以创建键名。
Map
每个 map 键的值被用作虚拟列名称。如果 flatten_maps
为 true,且存在几个嵌套级别,Vertica 将连接所有键名以创建键名。
Enum
Vertica 将 Avro Enum 视为 record,将 Enum 的名称作为键,将其值作为值。
Array
Vertica 将 Avro Array 视为键/值对。默认情况下,每个元素的索引作为键。在以下示例中,product_detail
是一个包含字段 product_category
的 Record,即一个 Array:
=> CREATE FLEX TABLE products;
CREATE TABLE
=> COPY products FROM :datafile WITH PARSER FAVROPARSER();
Rows Loaded
-------------
2
(1 row)
=> SELECT MAPTOSTRING(__raw__) FROM products ORDER BY __identity__;
maptostring
--------------------------------------------------------------------------------
{
"__name__": "Order",
"customer_id": "111222",
"order_details": {
"0.__name__": "OrderDetail",
"0.product_detail.__name__": "Product",
"0.product_detail.price": "46.21",
"0.product_detail.product_category": {
"0": "electronics",
"1": "printers",
"2": "computers"
},
"0.product_detail.product_description": "hp printer X11ew description :\
P",
"0.product_detail.product_hash": "\u0000\u0001\u0002\u0003\u0004",
"0.product_detail.product_id": "999012",
"0.product_detail.product_map.one": "1.1",
"0.product_detail.product_map.two": "1.1",
"0.product_detail.product_name": "hp printer X11ew",
"0.product_detail.product_status": "ONLY_FEW_LEFT",
"0.quantity": "3",
"0.total": "354.34"
},
"order_id": "2389646",
"total": "132.43"
}
...
如果 flatten_arrays
为 true,且存在几个嵌套级别,Vertica 将连接索引以创建键名。
=> COPY products FROM :datafile WITH PARSER FAVROPARSER(flatten_arrays=true);
Rows Loaded
-------------
2
(1 row)
=> SELECT MAPTOSTRING(__raw__) FROM products ORDER BY __identity__;
maptostring
--------------------------------------------------------------------------------
{
"__name__": "Order",
"customer_id": "111222",
"order_details.0.__name__": "OrderDetail",
"order_details.0.product_detail.__name__": "Product",
"order_details.0.product_detail.price": "46.21",
"order_details.0.product_detail.product_category.0": "electronics",
"order_details.0.product_detail.product_category.1": "printers",
"order_details.0.product_detail.product_category.2": "computers",
"order_details.0.product_detail.product_description": "hp printer X11ew des\
cription :P",
"order_details.0.product_detail.product_hash": "\u0000\u0001\u0002\u0003\u0\
004",
"order_details.0.product_detail.product_id": "999012",
"order_details.0.product_detail.product_map.one": "1.1",
"order_details.0.product_detail.product_map.two": "1.1",
"order_details.0.product_detail.product_name": "hp printer X11ew",
"order_details.0.product_detail.product_status": "ONLY_FEW_LEFT",
"order_details.0.quantity": "3",
"order_details.0.total": "354.34",
"order_id": "2389646",
"total": "132.43"
}
...
Union
Vertica 将 Avro Union 视为 Array。
示例
此示例演示了如何使用 favroparser
创建 Flex 表并将 Avro 数据加载到其中。加载数据后,您可以查询虚拟列:
=> CREATE FLEX TABLE avro_basic();
CREATE TABLE
=> COPY avro_basic FROM '/home/dbadmin/data/weather.avro' PARSER FAVROPARSER();
Rows Loaded
-------------
5
(1 row)
=> SELECT station, temp, time FROM avro_basic;
station | temp | time
---------+------+---------------
mohali | 0 | -619524000000
lucknow | 22 | -619506000000
norwich | -11 | -619484400000
ams | 111 | -655531200000
baddi | 78 | -655509600000
(5 rows)
有关详细信息,请参阅Avro 数据。
8.3.3 - FJSONPARSER
解析并加载 JSON 文件。此文件可能包含重复的 JSON 数据对象(包括嵌套映射)或 JSON 元素的外部列表。
加载到 Flex 表或混合表中时,解析器将 JSON 数据存储在单值 VMap 中。加载到混合表或列式表中时,解析器将数据直接加载到列名称与 JSON 源数据键相匹配的任何表列。
您可以使用强类型加载 JSON 源(数组、结构或组合)中的复杂类型,或将其作为灵活的复杂类型加载。将灵活的复杂类型加载到 VMap 列中的操作与加载到 Flex 表中一样。要加载复杂类型作为 VMap 列,请将列类型指定为 LONG VARBINARY。要保留复杂类型的索引,请将 flatten_maps
设置为 false。
仅当指定了 record_terminator
时,FJSONPARSER 才支持 协作解析。它不支持分摊加载。
语法
FJSONPARSER ( [parameter=value[,...]] )
参数
flatten_maps
- 布尔值,是否将 JSON 数据中的子映射平展,以句点 (
.
) 分隔映射层级。此值会影响加载中的所有数据,包括嵌套映射。
此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。
默认值:true
flatten_arrays
- 布尔值,是否将列表转换为带有整数键的子映射。列表被平展后,键名会像映射一样连接起来。默认不对列表进行平展。此值影响加载中的所有数据,包括嵌套列表。
此参数仅适用于 Flex 表或 VMap 列,且会在加载强类型复杂类型时被忽略。
默认值:false
reject_on_duplicate
- 布尔值,是忽略重复记录 (false),还是拒绝重复记录 (true)。在任何一种情况下,都会继续加载。
默认值:false
reject_on_empty_key
- 布尔值,是否拒绝包含的字段键不含值的任何行。
默认值:false
omit_empty_keys
- 布尔值,是否忽略数据中不含值的任何字段键。同一记录中的其他字段将加载。
默认值:false
record_terminator
- 设置后,将跳过所有无效的 JSON 记录,并继续解析下一个记录。必须统一终止记录。例如,如果您的输入文件包含通过换行符终止的 JSON 记录,请将此参数设置为
E'\n')
。如果存在任何无效的 JSON 记录,则在下一个 record_terminator
之后继续解析。
即使数据不包含无效的记录,也可以指定显式记录终止符,这样可以提高协作解析和分摊加载的运行效率,从而提升加载性能。
如果忽略此参数,解析将在第一条无效 JSON 记录处结束。
reject_on_materialized_type_error
布尔值,是否拒绝包含无法强制转换为兼容数据类型的实体化列值的数据行。如果值为 false 且无法强制类型,则解析器将该列中的值设置为 null。
如果该列是强类型复杂类型,而不是可变复杂类型,则复杂类型中的类型不匹配将导致整个列被视为不匹配。解析器不会部分加载复杂类型。
默认值:false
start_point
- 字符串,即 JSON 加载数据中用作解析起点的键的名称。解析器忽略
start_point
值之前的所有数据。将为文件中的每个对象加载该值。解析器会处理第一个实例后面的数据,最多到第二个,便会忽略任何保留的数据。
start_point_occurrence
- 整数,您通过
start_point
指定的值的第 n 次出现。如果数据具有多个起始值,而且您知道要在其第几次出现时开始解析,请与 start_point
结合使用。
默认值: 1
suppress_nonalphanumeric_key_chars
- 布尔值,是否禁止显示 JSON 键值中的非字母数字字符。当此参数为 true 时,解析器将用下划线 (
_
) 替换这些字符。
默认值:false
key_separator
- 解析器在连接键名时要使用的字符。
默认: 句点 (.
)
示例
以下示例使用默认参数从 STDIN 加载 JSON 数据:
=> CREATE TABLE people(age INT, name VARCHAR);
CREATE TABLE
=> COPY people FROM STDIN PARSER FJSONPARSER();
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> {"age": 5, "name": "Tim"}
>> {"age": 3}
>> {"name": "Fred"}
>> {"name": "Bob", "age": 10}
>> \.
=> SELECT * FROM people;
age | name
-----+------
| Fred
10 | Bob
5 | Tim
3 |
(4 rows)
以下示例使用 reject_on_duplicate
参数拒绝重复值:
=> CREATE FLEX TABLE json_dupes();
CREATE TABLE
=> COPY json_dupes FROM stdin PARSER fjsonparser(reject_on_duplicate=true)
exceptions '/home/dbadmin/load_errors/json_e.out'
rejected data '/home/dbadmin/load_errors/json_r.out';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> {"a":"1","a":"2","b":"3"}
>> \.
=> \!cat /home/dbadmin/load_errors/json_e.out
COPY: Input record 1 has been rejected (Rejected by user-defined parser).
Please see /home/dbadmin/load_errors/json_r.out, record 1 for the rejected record.
COPY: Loaded 0 rows, rejected 1 rows.
以下示例将加载数组数据:
$ cat addrs.json
{"number": 301, "street": "Grant", "attributes": [1, 2, 3, 4]}
=> CREATE EXTERNAL TABLE customers(number INT, street VARCHAR, attributes ARRAY[INT])
AS COPY FROM 'addrs.json' PARSER fjsonparser();
=> SELECT number, street, attributes FROM customers;
num | street| attributes
-----+-----------+---------------
301 | Grant | [1,2,3,4]
(1 row)
以下示例将加载一个灵活的复杂类型,同时拒绝嵌套记录中具有空键的行。请注意,虽然数据包含两家餐厅,但其中一家的键名是空字符串。此餐厅将被拒绝:
$ cat rest1.json
{
"name" : "Bob's pizzeria",
"cuisine" : "Italian",
"location_city" : ["Cambridge", "Pittsburgh"],
"menu" : [{"item" : "cheese pizza", "" : "$8.25"},
{"item" : "spinach pizza", "price" : "$10.50"}]
}
{
"name" : "Bakersfield Tacos",
"cuisine" : "Mexican",
"location_city" : ["Pittsburgh"],
"menu" : [{"item" : "veggie taco", "price" : "$9.95"},
{"item" : "steak taco", "price" : "$10.95"}]
}
=> CREATE TABLE rest (name VARCHAR, cuisine VARCHAR, location_city LONG VARBINARY, menu LONG VARBINARY);
=> COPY rest FROM '/data/rest1.json'
PARSER fjsonparser(flatten_maps=false, reject_on_empty_key=true);
Rows Loaded
------------
1
(1 row)
=> SELECT maptostring(location_city), maptostring(menu) FROM rest;
maptostring | maptostring
---------------------------+-------------------------------------------------------
{
"0": "Pittsburgh"
} | {
"0": {
"item": "veggie taco",
"price": "$9.95"
},
"1": {
"item": "steak taco",
"price": "$10.95"
}
}
(1 row)
要改为加载部分数据,请使用 omit_empty_keys
在加载其他所有内容时绕过缺失键:
=> COPY rest FROM '/data/rest1.json'
PARSER fjsonparser(flatten_maps=false, omit_empty_keys=true);
Rows Loaded
-------------
2
(1 row)
=> SELECT maptostring(location_city), maptostring(menu) from rest;
maptostring | maptostring
-------------------------------------------------+---------------------------------
{
"0": "Pittsburgh"
} | {
"0": {
"item": "veggie taco",
"price": "$9.95"
},
"1": {
"item": "steak taco",
"price": "$10.95"
}
}
{
"0": "Cambridge",
"1": "Pittsburgh"
} | {
"0": {
"item": "cheese pizza"
},
"1": {
"item": "spinach pizza",
"price": "$10.50"
}
}
(2 rows)
要改为使用强类型加载此数据,请在表中定义复杂类型:
=> CREATE EXTERNAL TABLE restaurants
(name VARCHAR, cuisine VARCHAR,
location_city ARRAY[VARCHAR(80)],
menu ARRAY[ ROW(item VARCHAR(80), price FLOAT) ]
)
AS COPY FROM '/data/rest.json' PARSER fjsonparser();
=> SELECT * FROM restaurants;
name | cuisine | location_city | \
menu
-------------------+---------+----------------------------+--------------------\
--------------------------------------------------------
Bob's pizzeria | Italian | ["Cambridge","Pittsburgh"] | [{"item":"cheese pi\
zza","price":0.0},{"item":"spinach pizza","price":0.0}]
Bakersfield Tacos | Mexican | ["Pittsburgh"] | [{"item":"veggie ta\
co","price":0.0},{"item":"steak taco","price":0.0}]
(2 rows)
有关其他示例,请参阅 JSON 数据。
8.3.4 - ORC
使用包含 COPY 语句的 ORC 子句以 ORC 格式加载数据。将数据加载到 Vertica 时,可读取所有基元类型、UUID 和复杂类型。
加载 ORC 数据时,必须考虑数据中的所有列;不能只选择某些列。
如果表定义包含基元类型的列,且这些列不存在于数据中,则解析器将使用 NULL 填充这些列。如果表定义包含复杂类型的列,则这些列必须存在于数据中。
此解析器不支持分摊加载或协作解析。
语法
ORC ( [ parameter=value[,...] ] )
参数
所有参数均为可选参数。
hive_partition_cols
- 以逗号分隔的列列表,这些列是数据中的分区列。
已弃用
请改用 COPY PARTITION COLUMNS。请参阅
分区文件路径。如果同时使用此参数和 PARTITION COLUMNS,则 COPY 将忽略此参数。
allow_no_match
- 是否接受包含的 glob 没有匹配文件的路径并在查询结果中报告 0 行。如果未设置此参数,当 FROM 子句中的路径与至少一个文件不匹配时,Vertica 将返回错误。
示例
ORC 子句不使用 PARSER 选项:
=> CREATE EXTERNAL TABLE orders (...)
AS COPY FROM 's3://DataLake/orders.orc' ORC;
可以将映射列读取为行数组,如以下示例中所示:
=> CREATE EXTERNAL TABLE orders
(orderkey INT,
custkey INT,
prods ARRAY[ROW(key VARCHAR(10), value DECIMAL(12,2))],
orderdate DATE
) AS COPY FROM '...' ORC;
8.3.5 - PARQUET
使用包含 COPY 语句的 PARQUET
解析器以 Parquet 格式加载数据。将数据加载到 Vertica 时,可读取所有基元类型、UUID 和复杂类型。
默认情况下,Parquet 解析器使用强架构匹配,这意味着数据中的列必须与使用数据的表中的列完全匹配。您可以选择使用弱架构匹配。
加载 Parquet 数据时,Vertica 会缓存 Parquet 元数据以提升效率。此缓存使用本地 TEMP 存储,如果 TEMP 为远程存储,则不使用。请参阅 ParquetMetadataCacheSizeMB 配置参数来更改缓存的大小。
此解析器不支持分摊加载或协作解析。
语法
PARQUET ( [ parameter=value[,...] ] )
参数
所有参数均为可选参数。
hive_partition_cols
- 以逗号分隔的列列表,这些列是数据中的分区列。
已弃用
请改用 COPY PARTITION COLUMNS。请参阅
分区文件路径。如果同时使用此参数和 PARTITION COLUMNS,则 COPY 将忽略此参数。
allow_no_match
- Boolean。是否接受包含的 glob 没有匹配文件的路径并在查询结果中报告 0 行。如果未设置此参数,当 FROM 子句中的路径与至少一个文件不匹配时,Vertica 将返回错误。
allow_long_varbinary_match_complex_type
- Boolean。是否启用灵活的列类型(请参阅可变复杂类型)。如果为 true,Parquet 解析器将允许数据中的复杂类型与定义为 LONG VARBINARY 的表列匹配。如果为 false,Parquet 解析器将需要使用复杂类型的强类型。对于参数集,仍然可以使用强类型。如果您希望将使用灵活的列视为错误,请将此参数设置为 false。
do_soft_schema_match_by_name
- Boolean。是否启用弱架构匹配 (true),而不是使用基于表定义和 parquet 文件中的列顺序的严格匹配(false,默认值)。有关详细信息,请参阅弱架构匹配。
reject_on_materialized_type_error
- 布尔值,仅在
do_soft_schema_match_by_name
为 true 时适用。指定在使用弱架构匹配且无法将值从数据强制转换为目标列类型时要执行的操作。值为 true(默认值)表示拒绝行;值为 false 表示使用 NULL 作为值,或者截断(对于过长的字符串)。有关强制转换类型映射,请参阅类型强制转换表。
弱架构匹配
默认情况下,Parquet 解析器使用强架构匹配。这意味着必须按照与数据中相同的顺序加载 Parquet 数据中的所有列。但是,有时您只想提取某些列,或者您希望能够适应未来 Parquet 架构中的一些更改。
使用 do_soft_schema_match_by_name
参数启用弱架构匹配。此设置具有以下影响:
-
数据中的列通过名称与表中的列匹配。名称必须完全匹配,但不区分大小写。
-
在 Parquet 数据中存在但不属于表定义的列将被忽略。
-
在表定义中存在但不属于 Parquet 数据的列将用 NULL 填充。解析器在 QUERY_EVENTS 中记录 UNMATCHED_TABLE_COLUMNS_PARQUETPARSER 事件。
-
如果 Parquet 数据中存在多个不区分大小写的相同列名,解析器将使用最后一个。(当使用通过区分大小写的工具写入的数据时,可能会出现这种情况。)
-
列类型不需要完全匹配,只要可以将 Parquet 文件中的数据类型强制转换为表使用的类型即可。如果无法强制转换某个类型,解析器会在 QUERY_EVENTS 中记录 TYPE_MISMATCH_COLUMNS_PARQUETPARSER 事件。如果 reject_on_materialized_type_error
为 true,解析器将拒绝行。如果为 false,解析器将使用 NULL,或者对于过长的字符串值,将截断该值。
-
可以定义但不能查询使用复杂类型(基元类型的一维数组除外)的列。
数据类型
Parquet 解析器将 Parquet 数据类型映射到 Vertica 数据类型,如下所示。
以下逻辑类型不受支持:
- EnumLogicalType
- IntervalLogicalType
- JSONLogicalType
- BSONLogicalType
- UnknownLogicalType
Parquet 解析器支持以下物理类型的映射:
类型强制转换和弱架构匹配支持以下映射。
Vertica 仅支持 3 级编码的数组,不支持 2 级编码的数组。
示例
PARQUET 子句不使用 PARSER 选项:
=> COPY sales FROM 's3://DataLake/sales.parquet' PARQUET;
在以下示例中,数据目录不包含文件:
=> CREATE EXTERNAL TABLE customers (...)
AS COPY FROM 'webhdfs:///data/*.parquet' PARQUET;
=> SELECT COUNT(*) FROM customers;
ERROR 7869: No files match when expanding glob: [webhdfs:///data/*.parquet]
要读取零行而不是生成错误,请使用 allow_no_match
参数:
=> CREATE EXTERNAL TABLE customers (...)
AS COPY FROM 'webhdfs:///data/*.parquet'
PARQUET(allow_no_match='true');
=> SELECT COUNT(*) FROM customers;
count
-------
0
(1 row)
要允许将复杂类型(在此示例中为菜单)作为灵活的列类型进行读取,请使用 allow_long_varbinary_match_complex_type
参数:
=> CREATE EXTERNAL TABLE restaurants
(name VARCHAR, cuisine VARCHAR, location_city ARRAY[VARCHAR], menu LONG VARBINARY)
AS COPY FROM '/data/rest*.parquet'
PARQUET(allow_long_varbinary_match_complex_type='True');
要仅读取餐厅数据中的某些列,请使用弱架构匹配:
=> CREATE EXTERNAL TABLE restaurants(name VARCHAR, cuisine VARCHAR)
AS COPY FROM '/data/rest*.parquet'
PARQUET(allow_long_varbinary_match_complex_type='True',
do_soft_schema_match_by_name='True');
=> SELECT * from restaurant;
name | cuisine
-------------------+----------
Bob's pizzeria | Italian
Bakersfield Tacos | Mexican
(2 rows)
8.3.6 - FCEFPARSER
解析 ArcSight 通用事件格式 (CEF) 日志文件。该解析器将值直接加载到列名称与源数据键相匹配的任何表列中。该解析器可将加载到 Flex 表中的数据存储在单个 VMap 中。
该解析器仅可用于 Flex 表。所有 Flex 解析器均会将数据作为单个 VMap 存储在 LONG VARBINAR_raw__
列中。如果某个数据行过大而无法适应该列,该数据行将被拒绝。Vertica 在加载带 NULL 指定列的数据时支持 NULL 值。
语法
FAVROPARSER ( [parameter‑name='value'[,...]] )
参数
delimiter
- 单字符分隔符。
默认值: ' '
record_terminator
- 单字符记录终止符。
**默认 **** 值: **newline
trim
- 布尔值,指定是否从标题名和键值中去掉空格。
默认值: true
reject_on_unescaped_delimiter
- 布尔值,指定是否拒绝包含非转义分隔符的行。CEF 标准不允许出现此类行。
默认值: false
示例
以下示例演示了为 CEF 数据创建 Flex 表的示例,该表包含两个实际列,eventId
和 priority
。
-
创建 Flex 表 cefdata
:
=> create flex table cefdata();
CREATE TABLE
-
使用 Flex 解析器 fcefparser
加载一些基本的 CEF 数据:
=> copy cefdata from stdin parser fcefparser();
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> CEF:0|ArcSight|ArcSight|2.4.1|machine:20|New alert|High|
>> \.
-
使用 maptostring()
函数查看 cefdata
Flex 表的内容:
=> select maptostring(__raw__) from cefdata;
maptostring
-------------------------------------------------------------
{
"deviceproduct" : "ArcSight",
"devicevendor" : "ArcSight",
"deviceversion" : "2.4.1",
"name" : "New alert",
"severity" : "High",
"signatureid" : "machine:20",
"version" : "0"
}
(1 row)
-
从 cefdata
Flex 表中选择一些虚拟列:
= select deviceproduct, severity, deviceversion from cefdata;
deviceproduct | severity | deviceversion
---------------+----------+---------------
ArcSight | High | 2.4.1
(1 row)
有关详细信息,请参阅 通用事件格式 (CEF) 数据
另请参阅
8.3.7 - FCSVPARSER
解析 CSV 格式(逗号分隔值)的数据。使用此解析器将 CSV 数据加载至列式表、Flex 表和混合表中。所有数据均必须以 Unicode UTF-8 格式进行编码。fcsvparser
解析器支持 CSV 数据的 RFC 4180 标准和其他选项,以适应 CSV 文件格式定义的变化。无效记录被拒绝。有关数据格式的详细信息,请参阅处理非 UTF-8 输入。
该解析器仅可用于 Flex 表。所有 Flex 解析器均会将数据作为单个 VMap 存储在 LONG VARBINAR_raw__
列中。如果某个数据行过大而无法适应该列,该数据行将被拒绝。Vertica 在加载带 NULL 指定列的数据时支持 NULL 值。
语法
FCSVPARSER ( [parameter='value'[,...]] )
参数
type
- 解析器的默认参数值,为以下字符串之一:
您在加载符合 RFC 4180 标准的数据(如 MS Excel 文件)时,无须使用 type 参数。请参阅加载 CSV 数据,以了解 RFC4180
的默认参数以及您可为传统 CSV 文件指定的其他选项。
默认值: RFC4180
delimiter
- 用于分隔 CSV 数据中的字段的单字符值。
默认值: ,
(对于 rfc4180
和 traditional
)
escape
- 用作转义字符的单字符值,用于按字面解释数据中的下一个字符。
默认值:
-
rfc4180
: "
-
traditional
: \\
enclosed_by
- 单字符值。使用
enclosed_by
包括一个与分隔符完全相同但应该按字面解释的值。例如,如果数据分隔符为逗号 (,
),则您要在数据 ("my name is jane, and his is jim"
) 中使用逗号。
默认值: "
record_terminator
- 用于指定记录末尾的单字符值。
默认值:
-
rfc4180
: \n
-
traditional
: \r\n
header
- 布尔值,指定是否使用第一行数据作为标题列。当
header=true
(默认)且不存在标题时,fcsvparser 使用默认列标题。默认标题由
ucoln
组成,其中 n 为列偏移数,第一列为 0
。您可以使用 header_names
参数指定自定义列标题名称,如下所述。
如果您指定 header=false
,则 fcsvparser
会将输入的第一行解析为数据,而不是列标题。
默认值: true
header_names
- 列标题名称列表,由解析器的分隔符参数定义的字符分隔。使用此参数可以在没有标题行的 CSV 文件中指定标题名称,或覆盖 CSV 源中存在的列名称。要覆盖一个或多个现有列名,请指定要使用的标题名称。此参数覆盖数据中的任何标题行。
trim
- 布尔值,指定是否从标题名和键值中去掉空格。
默认值: true
omit_empty_keys
- 布尔值,指定解析器如何处理没有值的标头键。如果是 true,则不加载
header
行中的空值键。
默认值: false
reject_on_duplicate
- 布尔值,指定是忽略重复记录 (false),还是拒绝重复记录 (true)。在任何一种情况下,都会继续加载。
默认值:false
reject_on_empty_key
- 布尔值,指定是否拒绝包含的键不含值的任何行。
默认值:false
reject_on_materialized_type_error
- 布尔值,指定是否拒绝解析器无法强制转换为兼容数据类型的任何实体化列值。请参阅加载 CSV 数据。
默认值:false
示例
此示例展示了如何使用 fcsvparser
加载 Flex 表,构建视图,然后查询该视图。
-
为 CSV 数据创建 Flex 表:
=> CREATE FLEX TABLE rfc();
CREATE TABLE
-
使用 fcsvparser
加载来自 STDIN 的数据。指定不存在标题,然后按如下方式输入一些数据:
=> COPY rfc FROM stdin PARSER fcsvparser(header='false');
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 10,10,20
>> 10,"10",30
>> 10,"20""5",90
>> \.
-
运行 compute_flextable_keys_and_build_view
函数,然后查询 rfc_view
。请注意,默认的 enclosed_by
字符允许字段 ("20""5"
) 内出现转义字符 ("
)。因此,所得到的值得以正确解析。由于输入数据中不存在标题,函数为各列添加了
ucoln
:
=> SELECT compute_flextable_keys_and_build_view('rfc');
compute_flextable_keys_and_build_view
--------------------------------------------------------------------------------------------
Please see public.rfc_keys for updated keys
The view public.rfc_view is ready for querying
(1 row)
=> SELECT * FROM rfc_view;
ucol0 | ucol1 | ucol2
-------+-------+-------
10 | 10 | 20
10 | 10 | 30
10 | 20"5 | 90
(3 rows)
有关使用此解析器其他参数的详细信息和示例,请参阅加载 CSV 数据。
另请参阅
8.3.8 - FDELIMITEDPAIRPARSER
解析分隔的数据文件。此解析器提供了解析器 fdelimitedparser
功能的一个子集。当您要加载的数据指定成对列名称且每行均有数据时,使用 fdelimitedpairparser
。
该解析器仅可用于 Flex 表。所有 Flex 解析器均会将数据作为单个 VMap 存储在 LONG VARBINAR_raw__
列中。如果某个数据行过大而无法适应该列,该数据行将被拒绝。Vertica 在加载带 NULL 指定列的数据时支持 NULL 值。
语法
FDELIMITEDPAIRPARSER ( [parameter‑name='value'[,...]] )
参数
delimiter
- 指定单字符分隔符。
默认值: ' '
record_terminator
- 指定单字符记录终止符。
默认值: 换行符
trim
- 布尔值,指定是否从标题名和键值中去掉空格。
默认值: true
示例
以下示例演示了为简单分隔数据创建示例 Flex 表,该表包含两个实际列,分别为 eventId
和 priority
。
-
创建一个表:
=> create flex table CEFData(eventId int default(eventId::int), priority int default(priority::int) );
CREATE TABLE
-
使用 fcefparser
将示例分隔的 Micro Focus ArcSight 日志文件加载到 CEFData
表中:
=> copy CEFData from '/home/release/kmm/flextables/sampleArcSight.txt' parser fdelimitedpairparser();
Rows Loaded | 200
-
加载示例数据文件后,使用 maptostring()
在 CEFData
的 __raw__
列中显示虚拟列:
=> select maptostring(__raw__) from CEFData limit 1; maptostring
-----------------------------------------------------------
"agentassetid" : "4-WwHuD0BABCCQDVAeX21vg==",
"agentzone" : "3083",
"agt" : "265723237",
"ahost" : "svsvm0176",
"aid" : "3tGoHuD0BABCCMDVAeX21vg==",
"art" : "1099267576901",
"assetcriticality" : "0",
"at" : "snort_db",
"atz" : "America/Los_Angeles",
"av" : "5.3.0.19524.0",
"cat" : "attempted-recon",
"categorybehavior" : "/Communicate/Query",
"categorydevicegroup" : "/IDS/Network",
"categoryobject" : "/Host",
"categoryoutcome" : "/Attempt",
"categorysignificance" : "/Recon",
"categorytechnique" : "/Scan",
"categorytupledescription" : "An IDS observed a scan of a host.",
"cnt" : "1",
"cs2" : "3",
"destinationgeocountrycode" : "US",
"destinationgeolocationinfo" : "Richardson",
"destinationgeopostalcode" : "75082",
"destinationgeoregioncode" : "TX",
"destinationzone" : "3133",
"device product" : "Snort",
"device vendor" : "Snort",
"device version" : "1.8",
"deviceseverity" : "2",
"dhost" : "198.198.121.200",
"dlat" : "329913940429",
"dlong" : "-966644973754",
"dst" : "3334896072",
"dtz" : "America/Los_Angeles",
"dvchost" : "unknown:eth1",
"end" : "1364676323451",
"eventid" : "1219383333",
"fdevice product" : "Snort",
"fdevice vendor" : "Snort",
"fdevice version" : "1.8",
"fdtz" : "America/Los_Angeles",
"fdvchost" : "unknown:eth1",
"lblstring2label" : "sig_rev",
"locality" : "0",
"modelconfidence" : "0",
"mrt" : "1364675789222",
"name" : "ICMP PING NMAP",
"oagentassetid" : "4-WwHuD0BABCCQDVAeX21vg==",
"oagentzone" : "3083",
"oagt" : "265723237",
"oahost" : "svsvm0176",
"oaid" : "3tGoHuD0BABCCMDVAeX21vg==",
"oat" : "snort_db",
"oatz" : "America/Los_Angeles",
"oav" : "5.3.0.19524.0",
"originator" : "0",
"priority" : "8",
"proto" : "ICMP",
"relevance" : "10",
"rt" : "1099267573000",
"severity" : "8",
"shost" : "198.198.104.10",
"signature id" : "[1:469]",
"slat" : "329913940429",
"slong" : "-966644973754",
"sourcegeocountrycode" : "US",
"sourcegeolocationinfo" : "Richardson",
"sourcegeopostalcode" : "75082",
"sourcegeoregioncode" : "TX",
"sourcezone" : "3133",
"src" : "3334891530",
"start" : "1364676323451",
"type" : "0"
}
(1 row)
-
选择 eventID
和 priority
实际列以及两个虚拟列 atz
和 destinationgeoregioncode
:
=> select eventID, priority, atz, destinationgeoregioncode from CEFData limit 10;
eventID | priority | atz | destinationgeoregioncode
------------+----------+---------------------+--------------------------
1218325417 | 5 | America/Los_Angeles |
1219383333 | 8 | America/Los_Angeles | TX
1219533691 | 9 | America/Los_Angeles | TX
1220034458 | 5 | America/Los_Angeles | TX
1220034578 | 9 | America/Los_Angeles |
1220067119 | 5 | America/Los_Angeles | TX
1220106960 | 5 | America/Los_Angeles | TX
1220142122 | 5 | America/Los_Angeles | TX
1220312009 | 5 | America/Los_Angeles | TX
1220321355 | 5 | America/Los_Angeles | CA
(10 rows)
另请参阅
8.3.9 - FDELIMITEDPARSER
使用分隔符分隔值,从而解析数据。fdelimitedparser
加载分隔数据,将其存储在单值 VMap 中。
该解析器仅可用于 Flex 表。所有 Flex 解析器均会将数据作为单个 VMap 存储在 LONG VARBINAR_raw__
列中。如果某个数据行过大而无法适应该列,该数据行将被拒绝。Vertica 在加载带 NULL 指定列的数据时支持 NULL 值。
注意
默认情况下,fdelimitedparser
将空字段视为 NULL
,而不是空字符串 (''
)。这种行为使转换更容易。将 NULL 转换成整数 (NULL::int
) 是有效的,而将空字符串转换成整数 (''::int
) 则是无效的。如有需要,请使用 treat_empty_val_as_null
参数更改 fdelimitedparser
的默认行为。
语法
FDLIMITEDPARSER ( [parameter‑name='value'[,...]] )
参数
delimiter
- 单字符分隔符。
默认值: |
record_terminator
- 单字符记录终止符。
默认值: \n
trim
- 布尔值,指定是否从标题名和键值中去掉空格。
默认值: true
header
- 布尔值,指定存在标题列。如果您使用此参数但不存在标题,解析器使用
col###
为列命名。
默认值: true
omit_empty_keys
- 布尔值,指定解析器如何处理没有值的标头键。如果
omit_empty_keys=true
,则不加载 header
行中的空值键。
默认值: false
reject_on_duplicate
- 布尔值,指定是忽略重复记录 (
false
),还是拒绝重复记录 (true
)。在任何一种情况下,都会继续加载。
默认值: false
reject_on_empty_key
- 布尔值,指定是否拒绝包含的键不含值的任何行。
默认值: false
reject_on_materialized_type_error
- 布尔值,指定针对不能用解析器强制转换为兼容的数据类型的实体化列,是否拒绝该列中的任何行值。请参阅使用 Flex 表解析器。
默认值: false
treat_empty_val_as_null
- 布尔值,指定空字段变为
NULLs
,而不是变为空字符串 (''
)。
默认值: true
示例
-
为分隔数据创建 Flex 表:
t=> CREATE FLEX TABLE delim_flex ();
CREATE TABLE
-
使用 fdelimitedparser
加载些来自 STDIN
的分隔数据,并指定逗号 (,
) 列分隔符:
=> COPY delim_flex FROM STDIN parser fdelimitedparser (delimiter=',');
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> deviceproduct, severity, deviceversion
>> ArcSight, High, 2.4.1
>> \.
您现在可以在 delim_flex
Flex 表中查询虚拟列:
=> SELECT deviceproduct, severity, deviceversion from delim_flex;
deviceproduct | severity | deviceversion
---------------+----------+---------------
ArcSight | High | 2.4.1
(1 row)
另请参阅
8.3.10 - FREGEXPARSER
解析正则表达式,将各列与指定正则表达式组的内容相匹配。
该解析器仅可用于 Flex 表。所有 Flex 解析器均会将数据作为单个 VMap 存储在 LONG VARBINAR_raw__
列中。如果某个数据行过大而无法适应该列,该数据行将被拒绝。Vertica 在加载带 NULL 指定列的数据时支持 NULL 值。
语法
FREGEXPARSER ( pattern=[parameter‑name='value'[,...]] )
参数
pattern
- 指定要匹配的数据正则表达式。
默认值: 空字符串 (""
)
use_jit
- 布尔值,指定在解析正则表达式时是否使用实时编译。
默认值:false
record_terminator
- 指定用于分隔输入记录的字符。
默认值: \n
logline_column
- 一个字符串,用于捕获包含与正则表达式相匹配的完整字符串的目标列。
默认值: 空字符串 (""
)
示例
这些示例使用以下正则表达式,它们搜索包括 timestamp
、date
、thread_name
和 thread_id
字符串的信息。
当心
出于显示目的,此示例正则表达式添加了换行符以拆分长文本行。要在查询中使用此表达式,请先复制并编辑示例,以移除任何换行符。
此示例表达式加载任何 thread_id
十六进制值,无论其是否包含 0x
前缀 (<thread_id>(?:0x)?[0-9a-f]+)
。
'^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+)
(?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+)
-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )
?(?<text>.*)'
-
创建一个 Flex 表 (vlog
),以包含 Vertica 日志文件的结果。针对此示例,我们复制了一份目录 /home/dbadmin/data/vertica.log
中的日志文件:
=> create flex table vlog1();
CREATE TABLE
-
将 fregexparser
用于示例正则表达式,以加载日志文件中的数据。请务必在使用此处显示的此表达式之前移除任何行字符:
=> copy vlog1 from '/home/dbadmin/tempdat/KMvertica.log'
PARSER FREGEXPARSER(pattern='^(?<time>\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\.\d+)
(?<thread_name>[A-Za-z ]+):(?<thread_id>(?:0x)?[0-9a-f]+)
-?(?<transaction_id>[0-9a-f])?(?:[(?<component>\w+)]
\<(?<level>\w+)\> )?(?:<(?<elevel>\w+)> @[?(?<enode>\w+)]?: )
?(?<text>.*)'
);
Rows Loaded
-------------
31049
(1 row)
-
成功加载数据后,将 MAPTOSTRING() 函数用于表的 __raw__
列。查询返回的四行 (limt 4
) 为使用 fregexparser
解析的 KMvertica.log
文件的正则表达式结果。输出将显示前面带或不带 0x
的 thread_id
值:
-
=> select maptostring(__raw__) from vlog1 limit 4; maptostring ------------------------------------------------------------------------------------- { "text" : " [Init] <INFO> Log /home/dbadmin/VMart/v_vmart_node0001_catalog/vertica.log opened; #2", "thread_id" : "0x7f2157e287c0", "thread_name" : "Main", "time" : "2017-03-21 23:30:01.704" } { "text" : " [Init] <INFO> Processing command line: /opt/vertica/bin/vertica -D /home/dbadmin/VMart/v_vmart_node0001_catalog -C VMart -n v_vmart_node0001 -h 10.20.100.247 -p 5433 -P 4803 -Y ipv4", "thread_id" : "0x7f2157e287c0", "thread_name" : "Main", "time" : "2017-03-21 23:30:01.704" } { "text" : " [Init] <INFO> Starting up Vertica Analytic Database v8.1.1-20170321", "thread_id" : "7f2157e287c0", "thread_name" : "Main", "time" : "2017-03-21 23:30:01.704" } { "text" : " [Init] <INFO> Compiler Version: 4.8.2 20140120 (Red Hat 4.8.2-15)", "thread_id" : "7f2157e287c0", "thread_name" : "Main", "time" : "2017-03-21 23:30:01.704" } (4 rows)
另请参阅
8.4 - 示例
有关其他 COPY 示例,请参阅特定解析器的参考页,包括:DELIMITED、ORC、PARQUET、FJSONPARSER 和 FAVROPARSER。
指定字符串选项
将 COPY 与 FORMAT、DELIMITER、NULL 和 ENCLOSED BY 选项结合使用:
=> COPY public.customer_dimension (customer_since FORMAT 'YYYY')
FROM STDIN
DELIMITER ','
NULL AS 'null'
ENCLOSED BY '"';
将 COPY 与 DELIMITER 和 NULL 选项结合使用。此示例设置并引用输入文件的 vsql
变量:
=> \set input_file ../myCopyFromLocal/large_table.gzip
=> COPY store.store_dimension
FROM :input_file
DELIMITER '|'
NULL ''
RECORD TERMINATOR E'\f';
包括多个源文件
创建一个表,然后将多个源文件复制到其中:
=> CREATE TABLE sampletab (a int);
CREATE TABLE
=> COPY sampletab FROM '/home/dbadmin/one.dat', 'home/dbadmin/two.dat';
Rows Loaded
-------------
2
(1 row)
使用通配符表示一组文件:
=> COPY myTable FROM 'webhdfs:///mydirectory/ofmanyfiles/*.dat';
通配符可以包含正则表达式:
=> COPY myTable FROM 'webhdfs:///mydirectory/*_[0-9]';
使用单个 COPY 语句指定多个路径:
=> COPY myTable FROM 'webhdfs:///data/sales/01/*.dat', 'webhdfs:///data/sales/02/*.dat',
'webhdfs:///data/sales/historical.dat';
分布加载
加载所有节点共享的数据。如果可能,Vertica 会将加载操作分布到所有节点:
=> COPY sampletab FROM '/data/file.dat' ON ANY NODE;
从两个文件中加载数据。因为第一个加载文件未指定节点(或 ON ANY NODE),因此启动程序将执行加载操作。将加载第二个文件的操作分布到所有节点:
=> COPY sampletab FROM '/data/file1.dat', '/data/file2.dat' ON ANY NODE;
为每个加载文件指定不同的节点:
=> COPY sampletab FROM '/data/file1.dat' ON (v_vmart_node0001, v_vmart_node0002),
'/data/file2.dat' ON (v_vmart_node0003, v_vmart_node0004);
从共享存储中加载数据
要从共享存储中加载数据,请使用相应架构中的 URL:
-
HDFS: [[s]web]hdfs://[nameservice]/path
-
S3: s3://bucket/path
-
Google Cloud: gs://bucket/path
-
Azure: azb://account/container/path
注意
从 HDFS、S3、GCS 和 Azure 加载时默认使用 ON ANY NODE;无需进行指定。
使用默认名称节点或名称服务加载存储在 HDFS 中的文件:
=> COPY t FROM 'webhdfs:///opt/data/file1.dat';
通过特定的 HDFS 名称服务 (testNS) 加载数据。如果数据库配置为从多个 HDFS 群集中读取,则可以指定一个名称服务:
=> COPY t FROM 'webhdfs://testNS/opt/data/file2.csv';
从 S3 存储桶中加载数据:
=> COPY t FROM 's3://AWS_DataLake/*' ORC;
分区数据
可以使用目录结构对数据文件进行分区,例如:
path/created=2016-11-01/region=northeast/*
path/created=2016-11-01/region=central/*
path/created=2016-11-01/region=southeast/*
path/created=2016-11-01/...
path/created=2016-11-02/region=northeast/*
path/created=2016-11-02/region=central/*
path/created=2016-11-02/region=southeast/*
path/created=2016-11-02/...
path/created=2016-11-03/...
path/...
使用 PARTITION COLUMNS 选项加载分区列:
=> CREATE EXTERNAL TABLE records (id int, name varchar(50), created date, region varchar(50))
AS COPY FROM 'webhdfs:///path/*/*/*'
PARTITION COLUMNS created, region;
使用填充内容列
在以下示例中,该表包含名字、姓氏和全名列,但正在加载的数据包含名字、中间名和姓氏列。COPY 语句读取所有源数据,但只加载名字和姓氏的源列。它通过连接每个源数据列(包括中间名)来构造全名数据。中间名被读取为 FILLER 列,因此可以在串联中使用,但在其他情况下会被忽略。(中间名没有表格列。)
=> CREATE TABLE names(first VARCHAR(20), last VARCHAR(20), full VARCHAR(60));
CREATE TABLE
=> COPY names(first,
middle FILLER VARCHAR(20),
last,
full AS first||' '||middle||' '||last)
FROM STDIN;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> Marc|Gregory|Smith
>> Sue|Lucia|Temp
>> Jon|Pete|Hamilton
>> \.
=> SELECT * from names;
first | last | full
-------+----------+--------------------
Jon | Hamilton | Jon Pete Hamilton
Marc | Smith | Marc Gregory Smith
Sue | Temp | Sue Lucia Temp
(3 rows)
将数据加载到 Flex 表中
创建一个 Flex 表并使用 FJSONPARSER 将 JSON 数据复制到其中:
=> CREATE FLEX TABLE darkdata();
CREATE TABLE
=> COPY tweets FROM '/myTest/Flexible/DATA/tweets_12.json' PARSER FJSONPARSER();
Rows Loaded
-------------
12
(1 row)
使用命名管道
COPY 支持遵循与给定文件系统上的文件名称相同的命名约定的命名管道。权限为 open
、write
和 close
。
创建命名管道 pipe1
,并设置两个 vsql
变量:
=> \! mkfifo pipe1
=> \set dir `pwd`/
=> \set file '''':dir'pipe1'''
从命名管道中复制一个未压缩的文件:
=> \! cat pf1.dat > pipe1 &
=> COPY large_tbl FROM :file delimiter '|';
=> SELECT * FROM large_tbl;
=> COMMIT;
加载压缩数据
从命名管道中复制一个 GZIP 文件并解压缩:
=> \! gzip pf1.dat
=> \! cat pf1.dat.gz > pipe1 &
=> COPY large_tbl FROM :file ON site01 GZIP delimiter '|';
=> SELECT * FROM large_tbl;
=> COMMIT;
=> \!gunzip pf1.dat.gz
9 - COPY LOCAL
将 COPY 语句与其 LOCAL
选项配合使用,可以在客户端系统而不是群集主机上加载数据文件。COPY LOCAL 支持 STDIN
和 'pathToData'
参数,但是不支持 [ON nodename]
子句。COPY LOCAL 不支持具有 NATIVE 或 NATIVE VARCHAR 格式的多个文件批量。COPY LOCAL 不支持读取 ORC 或 Parquet 文件;改用 ON NODE。COPY LOCAL 不支持 CURRENT_LOAD_SOURCE()。
COPY LOCAL 选项与平台无关。该语句在所有受支持的 Vertica 平台和驱动程序中的工作方式均相同。有关支持的驱动程序的更多详细信息,请参阅客户端驱动程序。
COPY LOCAL 必须是您使用 ODBC 客户端库进行的任何多语句查询中的第一条语句。将其用作第二个或以后的语句会导致错误。在使用其他客户端库(例如 JDBC)时,COPY LOCAL 应该始终是多语句查询中的第一条语句。另外,不要在同一个查询中多次使用它。
注意
在 Windows 客户端上,由于 Windows API 中存在的限制,您为 COPY LOCAL 文件提供的路径将限制为 216 个字符。
COPY LOCAL
即使发生异常,也不会自动创建异常和拒绝文件。
特权
用户必须具有表的 INSERT 权限以及架构的 USAGE 权限。
Copy Local 的工作原理
COPY LOCAL 通过平台中性的方式加载数据。COPY LOCAL 语句将本地客户端系统中的所有文件加载到 Vertica 主机(服务器会在其中处理文件)。您可以复制各种格式的文件:已解压缩、已压缩、固定宽度格式、bzip 或 gzip 格式或者指定为 bash glob。单个格式(例如全部为 bzip 或 gzip)的文件可以是以逗号分隔的输入文件列表。此外,还可以使用任何适用的 COPY 语句选项(只要数据格式支持该选项即可)。例如,可以定义特定的分隔符,或者定义如何处理 NULL 值等等。
有关使用 COPY LOCAL
选项加载数据的详细信息,请参阅 COPY 以查看语法描述,参阅指定加载数据的位置以查看详细示例。
Vertica 主机会根据需要解压缩并处理文件,无论文件格式如何或从中加载文件的客户端平台如何。一旦服务器拥有复制的文件,Vertica 就会通过跨节点分发文件解析任务(例如编码、压缩、解压缩)来保持性能。
在查询计划中查看 Copy Local 操作
在使用 COPY LOCAL
选项时,GraphViz 查询计划包括用于 Load-Client-File
而不是 Load-File
的标签。以下是查询计划示例中的一部分:
-----------------------------------------------
PLAN: BASE BULKLOAD PLAN (GraphViz Format)
-----------------------------------------------
digraph G {
graph [rankdir=BT, label = " BASE BULKLOAD PLAN \nAll Nodes Vector:
\n\n node[0]=initiator (initiator) Up\n", labelloc=t, labeljust=l ordering=out]
.
.
.
10[label = "Load-Client-File(/tmp/diff) \nOutBlk=[UncTuple]",
color = "green", shape = "ellipse"];
示例
以下示例显示了从本地文件的加载过程。
$ cat > t.dat
12
17
9
^C
=> CREATE TABLE numbers (value INT);
CREATE TABLE
=> COPY numbers FROM LOCAL 't.dat';
Rows Loaded
-------------
3
(1 row)
=> SELECT * FROM numbers;
value
-------
12
17
9
(3 rows)
10 - COPY FROM VERTICA
从其他 Vertica 数据库导入数据。COPY FROM VERTICA 类似于 COPY,但仅支持后者的一部分参数。
重要
源数据库的版本不得比目标数据库版本大一个主要版本 在目标数据库后面。
语法
COPY [[database.]schema-name.]target-table
[( target‑columns )]
FROM VERTICA source‑database.[schema.]source‑table
[( source‑columns )]
[STREAM NAME 'stream name']
[NO COMMIT]
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
目标表
- 所导入数据的目标表。Vertica 将数据从架构表加载到包含列的全部投影中。
-
target‑columns
- target‑table 中列的逗号分隔列表,用于存储所复制的数据。请参阅下面的目标列和源列之间的映射。
您不能将 FILLER 列或复杂类型(原生数组除外)的列用作列定义的一部分。
-
source‑database
- 要导入的数据的源数据库。在启动复制操作之前,当前会话中必须已经存在与该数据库的连接;否则 Vertica 将返回错误。有关详细信息,请参阅
CONNECT TO VERTICA
。
-
[schema.]source‑table
- 作为导入数据来源的表。如果 schema 是除
public
以外的任何其他架构,则必须提供架构名称。
-
source‑columns
- 源表中要导入的列的逗号分隔列表。如果省略,则导出所有列。列不能属于复杂类型。请参阅下面的目标列和源列之间的映射。
STREAM NAME
- COPY 加载流标识符。使用流名称有助于快速识别特定加载。您在加载语句中指定的 STREAM NAME 值出现在 LOAD_STREAMS 系统表的
stream
列中。
NO COMMIT
- 防止
COPY
在完成复制数据时自动提交其事务。有关详细信息,请参阅使用事务暂存加载。
特权
-
源表:选择
-
源表架构: USAGE
-
目标表: INSERT
-
目标表架构: USAGE
目标列和源列之间的映射
将一个数据库中的所有表数据复制到另一个数据库时,如果两个表中的列定义都符合以下条件,COPY FROM VERTICA 可以不用指定列的列表:
如果其中任何一个条件不成立,则 COPY FROM VERTICA 语句必须包含列的列表,这些列表将目标列和源列显式映射到彼此,如下所示:
-
包含相同数量的列。
-
按相同顺序列出源列和目标列。
-
将具有相同(或兼容)数据类型的列配对。
执行 COPY 期间出现节点故障
请参阅处理复制/导出期间的节点故障。
示例
以下示例将整个表的内容从 vmart
数据库复制到当前数据库中具有相同定义的表中:
=> CONNECT TO VERTICA vmart USER dbadmin PASSWORD 'myPassword' ON 'VertTest01',5433;
CONNECT
=> COPY customer_dimension FROM VERTICA vmart.customer_dimension;
Rows Loaded
-------------
500000
(1 row)
=> DISCONNECT vmart;
DISCONNECT
有关更多示例,请参阅从另一个 Vertica 数据库复制数据。
另请参阅
导出到 VERTICA
11 - CREATE 语句
CREATE 语句允许您创建新的数据库对象,例如表和用户。
11.1 - CREATE ACCESS POLICY
创建一个访问策略,筛选用户和角色对表数据的访问。您可以为表的行和列创建访问策略。Vertica 对每个查询应用访问策略筛选器,并仅返回当前用户或角色允许的数据。
您不能对原生数组以外的复杂数据类型的列设置访问策略。如果表包含复杂类型的列,您仍然可以对其他列设置行访问策略和列访问策略。
语法
CREATE ACCESS POLICY ON [[database.]schema.]table
{ FOR COLUMN column | FOR ROWS WHERE } expression [GRANT TRUSTED] { ENABLE | DISABLE }
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 包含目标列或行的表。
-
FOR COLUMN 列
- 应用此访问策略的列。该列可以是原生数组,但不支持其他复杂类型。(请参阅复杂类型。)
FOR ROWS WHERE
- 应用此访问策略的行。
- 表达式
- 指定访问行或列数据的条件的 SQL 表达式:
GRANT TRUSTED
指定 GRANT 语句在确定用户是否可以对目标表执行 DML 操作时优先于访问策略。如果省略,则只有在访问策略允许用户查看原始未更改状态的存储数据时,用户才能修改表数据。有关详细信息,请参阅访问策略和 DML 操作。
重要
GRANT TRUSTED 仅影响 DML 操作,并且不允许用户查看访问策略将屏蔽的数据。指定此选项可能允许具有某些授权的用户更新他们无法查看的数据。
ENABLE | DISABLE
- 是否启用访问策略。您可以使用 ALTER ACCESS POLICY 启用和禁用现有的访问策略。
特权
非超级用户:表的所有权
限制
访问策略具有以下限制:
另请参阅
11.2 - CREATE AUTHENTICATION
创建并启用与用户或角色关联的身份验证记录。身份验证记录在创建后自动启用。
语法
CREATE AUTHENTICATION auth‑record‑name
METHOD 'auth‑method'
access‑method
[ FALLTHROUGH ]
参数
特权
DBADMIN
示例
请参阅创建身份验证记录。
另请参阅
11.3 - 创建 CA 捆绑包
创建证书颁发机构 (CA) 捆绑包。这些包含根 CA 证书。
语法
CREATE CA BUNDLE name [CERTIFICATES ca_cert[, ca_cert[, ...]]
参数
name
- CA 捆绑包的名称。
ca_cert
- CA 证书的名称。如果未指定证书,则捆绑包将为空。
特权
CA 捆绑包中 CA 证书的所有权。
示例
请参阅管理 CA 捆绑包。
另请参阅
11.4 - CREATE CERTIFICATE
创建或导入证书、证书颁发机构 (CA) 或中间 CA。这些证书可以与 ALTER TLS CONFIGURATION 一起使用来设置客户端-服务器 TLS、LDAPLink TLS、LDAPAuth TLS 和节点间 TLS。
CREATE CERTIFICATE 生成 x509v3 证书。
语法
CREATE [TEMP[ORARY]] [CA] CERTIFICATE certificate_name
{AS cert [KEY key_name]
| SUBJECT subject
[ SIGNED BY ca_cert ]
[ VALID FOR days ]
[ EXTENSIONS ext = val[,...] ]
[ KEY private_key ]}
参数
TEMPORARY
- 使用会话范围创建。密钥存储在内存中,仅对当前会话有效。
CA
- 将证书指定为 CA 或中间证书。如果省略,则该操作会创建一个普通证书。
- certificate_name
- 证书的名称。
-
AS cert
- 导入的证书(字符串)。
此参数应包括整个证书链,不包括 CA 证书。
-
KEY key_name
- 密钥的名称。
只需为您打算在 Vertica 中签署其他证书的客户端/服务器证书和 CA 证书设置此参数。如果您导入的 CA 证书仅用于验证其他证书,则无需指定密钥。
-
SUBJECT subject
- 向(字符串)颁发证书的实体。
-
SIGNED BY ca_cert
- 签署证书的 CA 的名称。
添加 CA 证书时,该参数可选。指定该参数将创建一个不能用于签署其他 CA 证书的中间 CA。
创建证书时,此参数是必需的。
-
VALID FOR days
- 证书的有效天数。
-
EXTENSIONS ext = val
- 指定证书扩展的字符串。有关扩展的完整列表,请参阅 OpenSSL 文档。
-
KEY private_key
- 证书私钥的名称。
导入证书时,此参数是必需的。
特权
超级用户
默认扩展
CREATE CERTIFICATE 生成 x509v3 证书并默认包含多个扩展。这些因您创建的证书类型而异:
CA 证书:
-
'basicConstraints' = 'critical, CA:true'
-
'keyUsage' = 'critical, digitalSignature, keyCertSign'
-
'nsComment' = Vertica generated [CA] certificate'
-
'subjectKeyIdentifier' = 'hash'
证书:
-
'basicConstraints' = 'CA:false'
-
'keyUsage' = 'critical, digitalSignature, keyEncipherment'
示例
请参阅生成 TLS 证书和密钥。
另请参阅
11.5 - CREATE DIRECTED QUERY
保存输入查询与通过优化器提示注释的查询之间的关联。
语法
优化器生成
CREATE DIRECTED QUERY OPT[IMIZER] directedqueryID [COMMENT 'comments'] input-query
用户定义(自定义)
CREATE DIRECTED QUERY CUSTOM directedqueryID [COMMENT 'comments'] annotated-query
参数
OPT[IMIZER]
- 指示查询优化器通过 input-query 生成一个注释查询,然后在新的定向查询中将两者关联起来。
CUSTOM
- 指定将 annotated-query 与之前由 SAVE QUERY 指定的查询相关联。
- directedqueryID
- 用于定向查询的唯一标识符,字符串 符合标识符中描述的约定。
-
COMMENT 'comments'
- 有关定向查询的注释,最多 128 个字符。注释可在以后作为非常有用的参考,例如说明为何创建指定的定向查询。
如果忽略此实参,Vertica 会插入以下注释之一:
- input-query
- 要与优化器生成的定向查询关联的输入查询。输入查询仅支持一个优化器提示
:v
(alias IGNORECONST)。
- annotated-query
- 具有嵌入式优化器提示的查询,与最近通过 SAVE QUERY 保存的输入查询关联。
特权
超级用户
描述
CREATE DIRECTED QUERY 将输入查询与使用优化器提示进行注释的查询相关联。它将此关联存储在一个唯一标识符下。CREATE DIRECTED QUERY 有两种变体:
在这两种情形中,Vertica 都会将带注释的查询与输入查询相关联,并将其关联注册在 query_name
下的系统表 DIRECTED_QUERIES 中。
当心
Vertica 将保存的查询与定向查询相关联,而不检查两者是否兼容。请小心安排 SAVE QUERY 和 CREATE DIRECTED QUERY CUSTOM 的顺序,以使保存的查询和定向查询正确匹配。
另请参阅
创建定向查询
11.6 - CREATE EXTERNAL TABLE AS COPY
CREATE EXTERNAL TABLE AS COPY 为 Vertica 数据库外部的数据创建表定义。该语句是 CREATE TABLE 和 COPY 语句的组合,支持每个语句的部分参数。
取消 CREATE EXTERNAL TABLE AS COPY 语句会导致不可预测的结果。如果您需要进行更改,请让语句完成,删除表,然后重试。
可以使用 ALTER TABLE 更改列的数据类型,而不是删除并重新创建表。
您可以将 CREATE EXTERNAL TABLE AS COPY 用于除 Place 软件包中的类型以外的任何类型。
注意
Vertica 不会为外部表创建超投影,因为外部表未存储在数据库中。
语法
CREATE EXTERNAL TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name
( column-definition[,...] )
[{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES]
AS COPY
[ ( { column-as-expression | column }
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char' ]
[ ENFORCELENGTH ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ FILLER datatype ]
[ FORMAT 'format' ]
[ NULL [ AS ] 'string' ]
[ TRIM 'byte' ]
[,...] ) ]
[ COLUMN OPTION ( column
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char' ]
[ ENFORCELENGTH ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ FORMAT 'format' ]
[ NULL [ AS ] 'string' ]
[ TRIM 'byte' ]
[,...] ) ]
FROM {
{ 'path-to-data'
[ ON { nodename | (nodeset) | ANY NODE | EACH NODE } ] [ compression ] }[,...]
[ PARTITION COLUMNS column[,...] ]
|
LOCAL 'path-to-data' [ compression ] [,...]
|
VERTICA source-database.[source-schema.]source-table[( source-column[,...] ) ]
}
[ NATIVE
| FIXEDWIDTH COLSIZES {( integer )[,...]}
| NATIVE VARCHAR
| ORC
| PARQUET
]
[ ABORT ON ERROR ]
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED BY 'char' [ AND 'char' ] ]
[ ENFORCELENGTH ]
[ ERROR TOLERANCE ]
[ ESCAPE AS 'char' | NO ESCAPE ]
[ EXCEPTIONS 'path' [ ON nodename ] [,...] ]
[ [ WITH ] FILTER filter( [ arg=value[,...] ] ) ]
[ NULL [ AS ] 'string' ]
[ [ WITH ] PARSER parser([arg=value [,...] ]) ]
[ RECORD TERMINATOR 'string' ]
[ REJECTED DATA 'path' [ ON nodename ] [,...] ]
[ REJECTMAX integer ]
[ SKIP integer ]
[ SKIP BYTES integer ]
[ TRAILING NULLCOLS ]
[ TRIM 'byte' ]
参数
对于所有支持的参数,请参阅 CREATE TABLE 和 COPY 语句。有关将此语句与 UDL 配合使用的信息,请参阅用户定义的加载 (UDL)。
有关使用 COPY 参数的其他指导,请参阅指定加载数据的位置。
特权
具有以下权限的超级用户或非超级用户:
分区数据
可以使用其目录结构对数据进行分区,Vertica 可以利用该分区来提高外部表的查询性能。有关详细信息,请参阅分区文件路径。
如果在读取数据时看到意外结果,请验证文件路径中的 glob 是否与分区结构正确对齐。请参阅外部表故障排除。
ORC 和 Parquet 数据
使用 ORC 和 Parquet 格式时,Vertica 支持 COPY
语句和列数据结构中的一些附加选项。请参阅 ORC 和 PARQUET。
示例
以下示例为存储在 HDFS 中的分隔数据定义了一个外部表:
=> CREATE EXTERNAL TABLE sales (itemID INT, date DATE, price FLOAT)
AS COPY FROM 'hdfs:///data/ext1.csv' DELIMITER ',';
以下示例使用存储在 S3 中的 ORC 格式的数据。数据有两个分区列。有关分区的详细信息,请参阅分区文件路径。
=> CREATE EXTERNAL TABLE records (id int, name varchar(50), created date, region varchar(50))
AS COPY FROM 's3://datalake/sales/*/*/*'
PARTITION COLUMNS created, region;
下面的示例演示了,如何才能从本地目录(没有分区和 glob)中的所有 Parquet 文件读取数据:
=> CREATE EXTERNAL TABLE sales (itemID INT, date DATE, price FLOAT)
AS COPY FROM '/data/sales/*.parquet' PARQUET;
以下示例为包含数组的数据创建一个外部表:
=> CREATE EXTERNAL TABLE cust (cust_custkey int,
cust_custname varchar(50),
cust_custstaddress ARRAY[varchar(100)],
cust_custaddressln2 ARRAY[varchar(100)],
cust_custcity ARRAY[varchar(50)],
cust_custstate ARRAY[char(2)],
cust_custzip ARRAY[int],
cust_email varchar(50), cust_phone varchar(30))
AS COPY FROM 'webhdfs://data/*.parquet' PARQUET;
要允许没有超级用户访问权限的用户将外部表与本地文件系统、S3 或 GCS 上的数据配合使用,请为 'user' 使用创建一个位置,并授予对该位置的访问权限。本例显示了为一个名为 Bob 的用户授予对数据位于 /tmp(包含任何深度的子目录)之下的所有外部表的访问权限:
=> CREATE LOCATION '/tmp' ALL NODES USAGE 'user';
=> GRANT ALL ON LOCATION '/tmp' to Bob;
以下示例显示了使用用户定义源的 CREATE EXTERNAL TABLE:
=> CREATE SOURCE curl AS LANGUAGE 'C++' NAME 'CurlSourceFactory' LIBRARY curllib;
=> CREATE EXTERNAL TABLE curl_table1 as COPY SOURCE CurlSourceFactory;
另请参阅
创建外部表
11.7 - CREATE FAULT GROUP
仅限企业模式
创建容错组,其可包含以下内容:
-
一个或多个节点
-
一个或多个子容错组
-
一个或多个节点以及一个或多个子容错组
CREATE FAULT GROUP
创建空的容错组。使用 ALTER FAULT GROUP 将节点或其他容错组添加到现有容错组。
语法
CREATE FAULT GROUP name
参数
- name
- 要创建的容错组的名称,在所有容错组中唯一,其中 name 符合标识符中描述的约定。
特权
超级用户
示例
以下命令会创建名为 parent0
的容错组:
=> CREATE FAULT GROUP parent0;
CREATE FAULT GROUP
使用 ALTER FAULT GROUP 将节点或其他容错组添加到 parent0
容错组。
另请参阅
11.8 - CREATE FLEXIBLE TABLE
在逻辑架构中创建 flexible (Flex) 表。
创建 Flex 表时,Vertica 会自动创建两个依赖对象:
Flex 表需要键表和视图。这些对象均不能独立于 Flex 表而存在。
语法
使用列定义创建:
CREATE [[ scope ] TEMP[ORARY]] FLEX[IBLE] TABLE [ IF NOT EXISTS ]
[[database.]schema.]table-name
( [ column‑definition[,...] [, table-constraint ][,...] ] )
[ ORDER BY column[,...] ]
[ segmentation‑spec ]
[ KSAFE [k‑num] ]
[ partition-clause]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
[ DISK_QUOTA quota ]
从其他表创建:
CREATE FLEX[IBLE] TABLE [[database.]schema.] table-name
[ ( column-name-list ) ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
AS query [ ENCODED BY column-ref-list ]
[ DISK_QUOTA quota ]
参数
有关常规参数描述,请参阅 CREATE TABLE;对于特定于临时 Flex 表的参数,请参阅 CREATE TEMPORARY TABLE 和创建 Flex 表。
您无法在任何虚拟列(键)上对 Flex 表进行分区。
特权
非超级用户:表架构上的 CREATE 权限
默认列
CREATE 语句可以省略指定任何列定义。CREATE FLEXIBLE TABLE 总是自动创建两列:
__raw__
- LONG VARBINARY 类型列,用于存储您加载的非结构化数据。默认情况下,此列具有
NOT NULL
约束。
__identity__
- IDENTITY 列,用于在未定义其他列时进行分段和排序。
默认投影
在您创建 Flex 表和键表时,Vertica 会自动为它们创建
超投影。
如果通过一个或多个 ORDER BY、ENCODED BY、SEGMENTED BY 或 KSAFE 子句创建 Flex 表,则可使用该子句的信息创建投射。如果未使用任何子句,Vertica 将使用以下默认值:
示例
以下示例将创建一个名为 darkdata
的 Flex 表,而不指定任何列信息。Vertica 将在创建表的过程中创建默认的超投影和伙伴实例投影:
=> CREATE FLEXIBLE TABLE darkdata();
CREATE TABLE
=> \dj darkdata1*
List of projections
Schema | Name | Owner | Node | Comment
--------+----------------------+---------+------------------+---------
public | darkdata1_b0 | dbadmin | |
public | darkdata1_b1 | dbadmin | |
public | darkdata1_keys_super | dbadmin | v_vmart_node0001 |
public | darkdata1_keys_super | dbadmin | v_vmart_node0002 |
public | darkdata1_keys_super | dbadmin | v_vmart_node0003 |
(5 rows)
=> SELECT export_objects('','darkdata1_b0');
CREATE PROJECTION public.darkdata1_b0 /*+basename(darkdata1),createtype(P)*/
(
__identity__,
__raw__
)
AS
SELECT darkdata1.__identity__,
darkdata1.__raw__
FROM public.darkdata1
ORDER BY darkdata1.__identity__
SEGMENTED BY hash(darkdata1.__identity__) ALL NODES OFFSET 0;
SELECT MARK_DESIGN_KSAFE(1);
(1 row)
=> select export_objects('','darkdata1_keys_super');
CREATE PROJECTION public.darkdata1_keys_super /*+basename(darkdata1_keys),createtype(P)*/
(
key_name,
frequency,
data_type_guess
)
AS
SELECT darkdata1_keys.key_name,
darkdata1_keys.frequency,
darkdata1_keys.data_type_guess
FROM public.darkdata1_keys
ORDER BY darkdata1_keys.frequency
UNSEGMENTED ALL NODES;
SELECT MARK_DESIGN_KSAFE(1);
(1 row)
以下示例将以下面一个列定义创建名为 darkdata1
的表:date_col
。该语句将 partition by
子句指定为按年为数据分区。Vertica 将在创建表的过程中创建默认的超投影和伙伴实例投影:
=> CREATE FLEX TABLE darkdata1 (date_col date NOT NULL) partition by
extract('year' from date_col);
CREATE TABLE
另请参阅
11.9 - CREATE FLEXIBLE EXTERNAL TABLE AS COPY
CREATE FLEXIBLE EXTERNAL TABLE AS COPY 会创建灵活的外部表。此语句结合语句 CREATE FLEXIBLE TABLE 和 COPY 语句,支持每个语句的部分参数。
此外,还可以使用用户定义的加载函数 (UDL) 创建外部 Flex 表。有关创建和使用 Flex 表的详细信息,请参阅“使用 Flex 表”。
注意
在您创建外部表时,Vertica 不会为其创建超投影。
有关创建和使用 Flex 表的详细信息,请参阅“使用 Flex 表”中的创建 Flex 表。
当心
取消
CREATE FLEX EXTERNAL TABLE AS COPY
语句可能会导致不可预知的结果。Vertica 建议您允许语句完成,然后在表存在后使用
DROP TABLE。
语法
CREATE FLEX[IBLE] EXTERNAL TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name
( [ column‑definition[,...] ] )
[ INCLUDE | EXCLUDE [SCHEMA] PRIVILEGES ]
AS COPY [ ( { column-as-expression | column } [ FILLER datatype ] ]
FROM {
'path‑to‑data' [ ON nodename | ON ANY NODE | ON (nodeset) ] input‑format [,...]
| [ WITH ] UDL-clause[...]
}
[ ABORT ON ERROR ]
[ DELIMITER [ AS ] 'char' ]
[ ENCLOSED [ BY ] 'char' ]
[ ENFORCELENGTH ]
[ ESCAPE [ AS ] 'char' | NO ESCAPE ]
[ EXCEPTIONS 'path' [ ON nodename ] [,...] ]
[ NULL [ AS ] 'string' ]
[ RECORD TERMINATOR 'string' ]
[ REJECTED DATA 'path' [ ON nodename ][,...] ]
[ REJECTMAX integer ]
[ SKIP integer ]
[ SKIP BYTES integer ]
[ TRAILING NULLCOLS ]
[ TRIM 'byte' ]
参数
有关参数描述,请参阅 CREATE TABLE 和参数。
注意
CREATE FLEXIBLE EXTERNAL TABLE AS COPY 仅支持部分 CREATE TABLE 和 COPY 参数。
特权
具有以下权限的超级用户或非超级用户:
示例
要创建外部 Flex 表:
=> CREATE flex external table mountains() AS COPY FROM 'home/release/KData/kmm_ountains.json' PARSER fjsonparser();
CREATE TABLE
与其他 Flex 表一样,创建外部 Flex 表会生成两个常规表:命名表及其关联的 _keys
表。键表不是外部表:
=> \dt mountains
List of tables
Schema | Name | Kind | Owner | Comment
--------+-----------+-------+---------+---------
public | mountains | table | release |
(1 row)
可以使用帮助程序函数 COMPUTE_FLEXTABLE_KEYS_AND_BUILD_VIEW 计算键并创建外部表视图:
=> SELECT compute_flextable_keys_and_build_view ('appLog');
compute_flextable_keys_and_build_view
--------------------------------------------------------------------------------------------------
Please see public.appLog_keys for updated keys
The view public.appLog_view is ready for querying
(1 row)
检查 _keys
表中的键,以获取帮助应用程序的运行结果:
=> SELECT * FROM appLog_keys;
key_name | frequency | data_type_guess
----------------------------------------------------------+-----------+------------------
contributors | 8 | varchar(20)
coordinates | 8 | varchar(20)
created_at | 8 | varchar(60)
entities.hashtags | 8 | long varbinary(186)
.
.
.
retweeted_status.user.time_zone | 1 | varchar(20)
retweeted_status.user.url | 1 | varchar(68)
retweeted_status.user.utc_offset | 1 | varchar(20)
retweeted_status.user.verified | 1 | varchar(20)
(125 rows)
您可以查询视图:
=> SELECT "user.lang" FROM appLog_view;
user.lang
-----------
it
en
es
en
en
es
tr
en
(12 rows)
另请参阅
11.10 - CREATE FUNCTION 语句
Vertica 为每种类型的用户定义的扩展提供 CREATE 语句。每个 CREATE 语句都会向 Vertica 编录添加一个用户定义的函数:
Vertica 还提供 CREATE FUNCTION (SQL),它将 SQL 表达式存储为您可以在查询中调用的函数。
11.10.1 - CREATE AGGREGATE FUNCTION
向编录添加用户定义的聚合函数 (UDAF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE AGGREGATE FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载聚合函数。当您调用 SQL 函数时,Vertica 会将输入表传递给该函数进行处理。
语法
CREATE [ OR REPLACE ] AGGREGATE FUNCTION [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,目前仅
C++
(默认)。
-
NAME 'factory'
- 生成函数实例的工厂类的名称。
-
LIBRARY library
- 包含函数的共享库的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。
默认值: FENCED
特权
非超级用户:
-
函数架构的 CREATE 权限
-
函数库的 USAGE 权限
示例
以下示例演示了加载名为 AggregateFunctions
的库,然后定义名为 ag_avg
和 ag_cat
的函数。这些函数映射到库中的 AverageFactory
和 ConcatenateFactory
类:
=> CREATE LIBRARY AggregateFunctions AS '/opt/vertica/sdk/examples/build/AggregateFunctions.so';
CREATE LIBRARY
=> CREATE AGGREGATE FUNCTION ag_avg AS LANGUAGE 'C++' NAME 'AverageFactory'
library AggregateFunctions;
CREATE AGGREGATE FUNCTION
=> CREATE AGGREGATE FUNCTION ag_cat AS LANGUAGE 'C++' NAME 'ConcatenateFactory'
library AggregateFunctions;
CREATE AGGREGATE FUNCTION
=> \x
Expanded display is on.
select * from user_functions;
-[ RECORD 1 ]----------+------------------------------------------------------------------
schema_name | public
function_name | ag_avg
procedure_type | User Defined Aggregate
function_return_type | Numeric
function_argument_type | Numeric
function_definition | Class 'AverageFactory' in Library 'public.AggregateFunctions'
volatility |
is_strict | f
is_fenced | f
comment |
-[ RECORD 2 ]----------+------------------------------------------------------------------
schema_name | public
function_name | ag_cat
procedure_type | User Defined Aggregate
function_return_type | Varchar
function_argument_type | Varchar
function_definition | Class 'ConcatenateFactory' in Library 'public.AggregateFunctions'
volatility |
is_strict | f
is_fenced | f
comment |
另请参阅
11.10.2 - CREATE ANALYTIC FUNCTION
向编录添加用户定义的分析函数 (UDAnF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE ANALYTIC FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载分析函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。
语法
CREATE [ OR REPLACE ] ANALYTIC FUNCTION [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。
-
LIBRARY library
- 包含函数的库的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。
默认值: FENCED
特权
非超级用户:
-
函数架构的 CREATE 权限
-
函数库的 USAGE 权限
示例
此示例基于 AnalyticFunctions
库中名为 RankFactory
的工厂类创建名为 an_rank
的分析函数:
=> CREATE ANALYTIC FUNCTION an_rank AS LANGUAGE 'C++'
NAME 'RankFactory' LIBRARY AnalyticFunctions;
另请参阅
分析函数 (UDAnF)
11.10.3 - CREATE FILTER
向编录添加用户定义的加载筛选函数。包含筛选函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE FILTER 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载筛选函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。
重要
安装不受信任的 UDL 函数可能会影响服务器安全。UDxs 可以包含任意代码。尤其是用户定义的源函数可以从任意位置读取数据。恰当的安全限制要由函数的开发人员来实施。超级用户不得向不受信任用户授予对 UDx 的访问权限。
语法
CREATE [ OR REPLACE ] FILTER [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory' LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
-
LIBRARY library
- C++ 库共享对象文件、Python 文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。
默认值: FENCED
特权
超级用户
示例
以下示例演示了如何加载名为 iConverterLib
的库,然后定义了名为 Iconverter
的筛选函数,该函数映射到库中的 iConverterFactory
工厂类:
=> CREATE LIBRARY iConverterLib as '/opt/vertica/sdk/examples/build/IconverterLib.so';
CREATE LIBRARY
=> CREATE FILTER Iconverter AS LANGUAGE 'C++' NAME 'IconverterFactory' LIBRARY IconverterLib;
CREATE FILTER FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name | public
function_name | Iconverter
procedure_type | User Defined Filter
function_return_type |
function_argument_type |
function_definition |
volatility |
is_strict | f
is_fenced | f
comment |
另请参阅
11.10.4 - CREATE FUNCTION (SQL)
将 SQL 表达式存储为函数,以在查询中使用。用户定义的 SQL 函数对于执行复杂的查询和组合 Vertica 内置函数很有用。您只需在给定查询中调用该函数。如果搜索路径中存在多个具有相同名称和实参类型的 SQL 函数,Vertica 将调用它找到的第一个匹配项。
SQL 函数在所有情况下都被修整,包括 DDL。
语法
CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ]
[[database.]schema.]function( [ arg_list ] )
RETURN return_type
AS
BEGIN
RETURN expression;
END;
参数
OR REPLACE
- 如果存在相同名称和实参的函数,请将其替换。如果您只更改函数实参,Vertica 会忽略此选项并使用相同的名称保留这两个函数。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
- 要创建的 SQL 函数,其中 function 符合标识符中描述的约定。
-
arg_list
- 实参名称及其数据类型的逗号分隔列表,按以下格式指定:
argname argtype[,...]
其中:
-
return_type
- 此函数返回的数据类型。
-
RETURN 表达式
- SQL 函数主体,其中 expression 可能包含 CREATE FUNCTION 语句中指定的内置函数、运算符和实参名称。
表达式末尾的分号是必需的。
注意
CREATE FUNCTION 仅允许一个 RETURN 表达式。Return 表达式不支持以下内容:
特权
非超级用户:
-
函数架构的 CREATE 权限
-
函数库的 USAGE 权限
严格性和可变性
Vertica 根据 SQL 函数的定义推断该函数的
严格性和可变性(
稳定、
不可变或
易变)。然后,Vertica 确定使用是否正确,例如期待不可变函数却提供了易变函数的情况。
SQL 函数和视图
可以在使用 SQL 函数的查询中创建视图,然后查询这些视图。创建视图时,SQL 函数会将对用户定义的函数的调用替换为视图定义中的函数主体。因此,当用户定义的函数的主体被替换后,视图也应被替换。
示例
请参阅创建用户定义的 SQL 函数。
另请参阅
11.10.5 - CREATE FUNCTION(标量)
向编录添加用户定义的标量函数 (UDSF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
UDSF 接受单个数据行并返回单个值。只要可以使用原生 Vertica 函数或语句(CREATE TABLE 及其 PARTITION BY 或任何分段子句除外),便可以使用这些函数。
CREATE FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载 UDx。当您调用函数时,Vertica 会将参数传递给库中的函数进行处理。
语法
CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。
-
LIBRARY library
- C++ 共享对象文件、Python 文件、Java Jar 文件或 R 函数文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。以 Java 编写的函数和 R 函数始终在隔离模式下运行。
默认值: FENCED
特权
-
函数架构的 CREATE 权限
-
函数库的 USAGE 权限
示例
以下示例加载了名为 ScalarFunctions
的库,然后定义了名为 Add2ints
的函数,该函数映射到库中的 Add2intsInfo
工厂类:
=> CREATE LIBRARY ScalarFunctions AS '/opt/vertica/sdk/examples/build/ScalarFunctions.so';
CREATE LIBRARY
=> CREATE FUNCTION Add2Ints AS LANGUAGE 'C++' NAME 'Add2IntsFactory' LIBRARY ScalarFunctions;
CREATE FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM USER_FUNCTIONS;
-[ RECORD 1 ]----------+----------------------------------------------------
schema_name | public
function_name | Add2Ints
procedure_type | User Defined Function
function_return_type | Integer
function_argument_type | Integer, Integer
function_definition | Class 'Add2IntsFactory' in Library 'public.ScalarFunctions'
volatility | volatile
is_strict | f
is_fenced | t
comment |
=> \x
Expanded display is off.
=> -- Try a simple call to the function
=> SELECT Add2Ints(23,19);
Add2Ints
----------
42
(1 row)
以下示例使用了返回 ROW 的标量函数:
=> CREATE FUNCTION div_with_rem AS LANGUAGE 'C++' NAME 'DivFactory' LIBRARY ScalarFunctions;
=> SELECT div_with_rem(18,5);
div_with_rem
------------------------------
{"quotient":3,"remainder":3}
(1 row)
另请参阅
开发用户定义的扩展 (UDx)
11.10.6 - CREATE PARSER
向编录添加用户定义的加载解析器函数。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE PARSER 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载解析器函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。
重要
安装不受信任的 UDL 函数可能会影响服务器安全。UDxs 可以包含任意代码。尤其是用户定义的源函数可以从任意位置读取数据。恰当的安全限制要由函数的开发人员来实施。超级用户不得向不受信任用户授予对 UDx 的访问权限。
语法
CREATE [ OR REPLACE ] PARSER [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
-
LIBRARY library
- C++ 库共享对象文件、Python 文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。
默认值: FENCED
特权
超级用户
示例
以下示例演示了如何加载名为 BasicIntegrerParserLib
的库,然后定义了名为 BasicIntegerParser
的解析器函数,该函数映射到库中的 BasicIntegerParserFactory
工厂类:
=> CREATE LIBRARY BasicIntegerParserLib as '/opt/vertica/sdk/examples/build/BasicIntegerParser.so';
CREATE LIBRARY
=> CREATE PARSER BasicIntegerParser AS LANGUAGE 'C++' NAME 'BasicIntegerParserFactory' LIBRARY BasicIntegerParserLib;
CREATE PARSER FUNCTION
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name | public
function_name | BasicIntegerParser
procedure_type | User Defined Parser
function_return_type |
function_argument_type |
function_definition |
volatility |
is_strict | f
is_fenced | f
comment |
另请参阅
11.10.7 - CREATE SOURCE
向编录添加用户定义的负载源函数。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE SOURCE 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载负载源函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的函数进行处理。
重要
安装不受信任的 UDL 函数可能会影响服务器安全。UDxs 可以包含任意代码。尤其是用户定义的源函数可以从任意位置读取数据。恰当的安全限制要由函数的开发人员来实施。超级用户不得向不受信任用户授予对 UDx 的访问权限。
语法
CREATE [ OR REPLACE ] SOURCE [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。 此名称与 RegisterFactory 类使用的名称相同。
-
LIBRARY library
- C++ 库共享对象文件或 Java Jar 文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。
默认: FENCED
特权
超级用户
示例
以下示例演示了如何加载名为 curllib
的库,然后定义了名为 curl
的源函数,该函数映射到库中的 CurlSourceFactory
工厂类:
=> CREATE LIBRARY curllib as '/opt/vertica/sdk/examples/build/cURLLib.so';
CREATE LIBRARY
=> CREATE SOURCE curl AS LANGUAGE 'C++' NAME 'CurlSourceFactory' LIBRARY curllib;
CREATE SOURCE
=> \x
Expanded display is on.
=> SELECT * FROM user_functions;
-[ RECORD 1 ]----------+--------------------
schema_name | public
function_name | curl
procedure_type | User Defined Source
function_return_type |
function_argument_type |
function_definition |
volatility |
is_strict | f
is_fenced | f
comment |
另请参阅
11.10.8 - CREATE TRANSFORM FUNCTION
向编录添加用户定义的转换函数 (UDTF)。包含该函数的库必须先前已使用 CREATE LIBRARY 添加。
CREATE TRANSFORM FUNCTION 根据工厂类提供的数据自动确定函数参数和返回值。Vertica 支持重载转换函数。当您调用 SQL 函数时,Vertica 会将输入表传递给库中的转换函数进行处理。
语法
CREATE [ OR REPLACE ] TRANSFORM FUNCTION [ IF NOT EXISTS ]
[[database.]schema.]function AS
[ LANGUAGE 'language' ]
NAME 'factory'
LIBRARY library
[ FENCED | NOT FENCED ]
参数
OR REPLACE
如果存在具有相同名称和实参的函数,则会替换它。例如,您可以使用它在围栏模式和非围栏模式之间进行切换。如果您不使用此指令并且该函数已存在,则 CREATE 语句将返回一个回退错误。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
IF NOT EXISTS
如果存在具有相同名称和实参的函数,则会返回该函数而不会创建它。
OR REPLACE 和 IF NOT EXISTS 是互斥的。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
function
要创建的函数的名称。该名称用于函数的 SQL 调用。它不需要匹配工厂名称,但是如果这两个名称相同或相似,可以减少困惑。
函数名必须符合标识符的限制。
-
LANGUAGE 'language'
- 用于开发此函数的语言,为以下语言之一:
-
NAME 'factory'
- 生成函数实例的工厂类的名称。
-
LIBRARY library
- C++ 共享对象文件、Python 文件、Java Jar 文件或 R 函数文件的名称。此库必须已由 CREATE LIBRARY 加载。
FENCED | NOT FENCED
- 启用或禁用此函数的隔离模式。以 Java 编写的函数和 R 函数始终在隔离模式下运行。
默认值: FENCED
特权
非超级用户:
-
函数架构的 CREATE 权限
-
函数库的 USAGE 权限
限制
包括 UDTF 的查询不能:
示例
以下示例加载了名为 TransformFunctions
的库,然后定义了名为 tokenize
的函数,该函数映射到库中的 TokenFactory
工厂类:
=> CREATE LIBRARY TransformFunctions AS
'/home/dbadmin/TransformFunctions.so';
CREATE LIBRARY
=> CREATE TRANSFORM FUNCTION tokenize
AS LANGUAGE 'C++' NAME 'TokenFactory' LIBRARY TransformFunctions;
CREATE TRANSFORM FUNCTION
另请参阅
11.11 - CREATE HCATALOG SCHEMA
使用 HCatalog 连接器为存储在 Hive 数据仓库中的数据定义架构。有关详细信息,请参阅使用 HCatalog 连接器。
大多数可选参数均从 Hadoop 配置文件(如果可用)读出。如果按照为 HCatalog 配置 Vertica 中的描述复制了 Hadoop 配置文件,则可以忽略多数参数。默认情况下,此语句使用这些配置文件中指定的值。如果配置文件是完整的,则以下语句有效:
=> CREATE HCATALOG SCHEMA hcat;
如果配置文件中未指定值,并且参数列表中显示了默认值,则使用该默认值。
某些参数仅在您使用 HiveServer2(默认值)时适用。仅当您使用的是旧版 Hadoop 服务 WebHCat 时,其他选项才适用。使用 HiveServer2 时,使用 HIVESERVER2_HOSTNAME 指定服务器主机。使用 WebHCat 时,使用 WEBSERVICE_HOSTNAME 指定服务器主机。
如果需要使用 WebHCat,还必须将 HCatalogConnectorUseHiveServer2 配置参数设置为 0。请参阅Hadoop 参数。
创建架构后,您可以使用 ALTER HCATALOG SCHEMA 更改许多(但不是全部)参数。
语法
CREATE HCATALOG SCHEMA [IF NOT EXISTS] schemaName
[AUTHORIZATION user-id]
[WITH [param=value [,...] ] ]
参数
[IF NOT EXISTS]
- 如果给定默认值,则当 schemaName 中指定的架构已经存在时,该语句将无错退出。
- schemaName
- 要在 Vertica 编录中创建的架构的名称。Hive 数据库中的表将通过此架构提供。
-
AUTHORIZATION user-id
- 要拥有正在创建的架构的 Vertica 帐户的名称。如果正在使用 Kerberos 身份验证,则此参数将被忽略;在这种情况下,使用当前的 vsql 用户。
参数
HOSTNAME
- 存储 Hive 数据仓库的元存储信息的数据库服务器的主机名、IP 地址或 URI。
如果您指定此参数且未同时指定 PORT
,则此值必须采用 hive-site.xml 中用于 hive.metastore.uris 的 URI 格式。
如果 Hive 元存储支持高可用性,您可以为此值指定逗号分隔的 URI 列表。
如果未指定此值,则 hive-site.xml 必须可用。
PORT
- 运行 metastore 数据库的端口号。如果指定此参数,则还必须指定
HOSTNAME
并且它必须是名称或 IP 地址(不是 URI)。
HIVESERVER2_HOSTNAME
- HiveServer2 服务的主机名或 IP 地址。如果在 hive-site.xml 中设置以下属性之一,则此参数可选:
如果您使用 WebHCat,则忽略此参数。
WEBSERVICE_HOSTNAME
- WebHCat 服务的主机名或 IP 地址(如果使用 WebHCat 而不是 HiveServer2)。如果未指定此值,则 webhcat-site.xml 必须可用。
WEBSERVICE_PORT
- 运行 WebHCat 服务的端口号(如果使用 WebHCat 而不是 HiveServer2)。如果未指定此值,则 webhcat-site.xml 必须可用。
WEBHDFS_ADDRESS
- WebHDFS 服务的主机和端口(“主机:端口”)。此参数仅用于读取 ORC 和 Parquet 文件。如果未设置此值,则 hdfs-site.xml 必须可用,以通过 HCatalog 连接器读取这些文件类型。
HCATALOG_SCHEMA
- Vertica 架构映射至的 Hive 架构或数据库的名称。默认值为 schemaName。
CUSTOM_PARTITIONS
- Hive 架构是否使用自定义分区位置('YES' 或 'NO')。如果架构使用自定义分区位置,则 Vertica 会在执行查询时查询 Hive 以获取这些位置。这些额外的 Hive 查询可能很昂贵,因此仅在需要时才使用此参数。默认值为 'NO'(禁用)。有关详细信息,请参阅使用分区数据。
HCATALOG_USER
- 调用 HiveServer2 或 WebHCat 服务器时使用的 HCatalog 用户的用户名。默认为当前数据库用户。
HCATALOG_CONNECTION_TIMEOUT
- HCatalog 连接器等待成功连接到 HiveServer 或 WebHCat 服务器的秒数。值 0 表示无限期等待。
HCATALOG_SLOW_TRANSFER_LIMIT
- 来自 HiveServer2 或 WebHCat 服务器且为 HCatalog 连接器所接受的最低数据传输率(以每秒字节数为单位)。有关详细信息,请参阅 HCATALOG_SLOW_TRANSFER_TIME。
HCATALOG_SLOW_TRANSFER_TIME
- 强制采用数据传输率下限之前 HCatalog 连接器等待的秒数。此时间过后,HCatalog 连接器将测试数据传输率是否至少达到了 HCATALOG_SLOW_TRANSFER_LIMIT 中设置的值。如果未达到,HCatalog 连接器会断开连接并终止查询。
SSL_CONFIG
- Hadoop ssl-client.xml 配置文件的路径。如果您使用 HiveServer2 并且它使用 SSL 线路加密,则此参数是必需的。如果您使用 WebHCat,则忽略此参数。
HCATALOG_CONNECTOR_TIMEOUT、HCATALOG_SLOW_TRANSFER_LIMIT 和 HCATALOG_SLOW_TRANSFER_TIME 的默认值由数据库配置参数 HCatConnectionTimeout、HCatSlowTransferLimit 和 HCatSlowTransferTime 设置。有关详细信息,请参阅Hadoop 参数。
配置文件
如果您在创建架构时未覆盖这些值,HCatalog 连接器将使用 Hadoop 配置文件中的以下值。
特权
用户必须是超级用户或具有数据库的所有权限才能使用此语句。
用户还需要通过以下方式之一访问 Hive 数据:
-
如果 Hive 不使用授权服务(Sentry 或 Ranger)来管理访问,则对 hcatalog_schema 具有 USAGE 权限。
-
如果 Hive 使用授权服务来管理访问,则通过授权服务获得权限。在这种情况下,您必须将 EnableHCatImpersonation 设置为 0,以作为 Vertica 主体访问数据,或者授予用户访问 HDFS 数据的权限。对于 Sentry,您可以使用 ACL 同步来管理 HDFS 访问。
-
成为 dbadmin 用户,无论有无授权服务均可访问。
示例
以下示例展示了如何使用 CREATE HCATALOG SCHEMA 为存储在 Hive 数据库中的表定义新架构,然后查询包含有关这些表的信息的系统表:
=> CREATE HCATALOG SCHEMA hcat WITH HOSTNAME='hcathost' PORT=9083
HCATALOG_SCHEMA='default' HIVESERVER2_HOSTNAME='hs.example.com'
SSL_CONFIG='/etc/hadoop/conf/ssl-client.xml' HCATALOG_USER='admin';
CREATE SCHEMA
=> \x
Expanded display is on.
=> SELECT * FROM v_catalog.hcatalog_schemata;
-[ RECORD 1 ]----------------+-------------------------------------------
schema_id | 45035996273748224
schema_name | hcat
schema_owner_id | 45035996273704962
schema_owner | admin
create_time | 2017-12-05 14:43:03.353404-05
hostname | hcathost
port | -1
hiveserver2_hostname | hs.example.com
webservice_hostname |
webservice_port | 50111
webhdfs_address | hs.example.com:50070
hcatalog_schema_name | default
ssl_config | /etc/hadoop/conf/ssl-client.xml
hcatalog_user_name | admin
hcatalog_connection_timeout | -1
hcatalog_slow_transfer_limit | -1
hcatalog_slow_transfer_time | -1
custom_partitions | f
=> SELECT * FROM v_catalog.hcatalog_table_list;
-[ RECORD 1 ]------+------------------
table_schema_id | 45035996273748224
table_schema | hcat
hcatalog_schema | default
table_name | nation
hcatalog_user_name | admin
-[ RECORD 2 ]------+------------------
table_schema_id | 45035996273748224
table_schema | hcat
hcatalog_schema | default
table_name | raw
hcatalog_user_name | admin
-[ RECORD 3 ]------+------------------
table_schema_id | 45035996273748224
table_schema | hcat
hcatalog_schema | default
table_name | raw_rcfile
hcatalog_user_name | admin
-[ RECORD 4 ]------+------------------
table_schema_id | 45035996273748224
table_schema | hcat
hcatalog_schema | default
table_name | raw_sequence
hcatalog_user_name | admin
以下示例展示了如何指定多个元存储主机。
=> CREATE HCATALOG SCHEMA hcat
WITH HOSTNAME='thrift://node1.example.com:9083,thrift://node2.example.com:9083';
以下示例展示了如何包含自定义分区位置:
=> CREATE HCATALOG SCHEMA hcat WITH HCATALOG_SCHEMA='default'
HIVESERVER2_HOSTNAME='hs.example.com'
CUSTOM_PARTITIONS='yes';
11.12 - CREATE KEY
创建私钥。
语法
CREATE [TEMP[ORARY]] KEY name
TYPE type
[PASSWORD password]
{LENGTH length | AS key}
参数
TEMPORARY
- 使用会话范围创建。密钥存储在内存中,仅对当前会话有效。
-
KEY name
- 密钥的名称。
-
TYPE type
- 密钥类型:“AES”或“RSA”。
-
PASSWORD password
- 密钥的密码(字符串)。
-
LENGTH length
- 密钥的大小(以位为单位)。
示例:2048
-
AS key
- 要导入的现有密钥字符串。例如:
-----BEGIN RSA PRIVATE KEY-----...ABCD1234...-----END RSA PRIVATE KEY-----
特权
超级用户
示例
请参阅生成 TLS 证书和密钥。
另请参阅
11.13 - CREATE LIBRARY
将包含用户定义的扩展 (UDx) 的库加载到 Vertica 编录。Vertica 自动将库文件和支持库的副本分发到所有群集节点。
因为库被添加至数据库编录,因此数据库重新启动后也将如此。
在编录中加载库后,即可使用 CREATE FUNCTION 等语句定义该库中包含的扩展。有关详细信息,请参阅开发用户定义的扩展 (UDx)。
语法
CREATE [OR REPLACE] LIBRARY
[[database.]schema.]name
AS 'path'
[ DEPENDS 'depends-path' ]
[ LANGUAGE 'language' ]
参数
OR REPLACE
- 如果存在相同名称的库,请将其替换。编录中定义的引用更新库的 UDx 会自动开始使用新的库文件。
如果您不使用此指令并且库已经存在,则 CREATE 语句会返回错误。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- name
- 要创建的库的名称。这是在库中创建函数时使用的名称(请参阅创建 UDx 函数)。虽然不是必需的,但最好匹配文件名。
-
AS path
- 要加载的库的路径,可以是启动程序节点文件系统上的绝对路径,也可以是其他支持的文件系统或对象存储的 URI。
-
DEPENDS 'depends-path'
此库所依赖的文件或库,启动程序节点的文件系统或其他受支持的文件系统或对象存储中的一个或多个文件或目录。对于目录,路径条目以斜杠 (/
) 结束,后跟通配符 (*
)(可选)。要指定多个文件,请使用冒号 (:
) 分隔条目。
如果任何路径条目包含冒号(例如 URI),请在整个 DEPENDS 路径两端加上括号,且单个路径元素使用双引号,如下例所示:
DEPENDS '["s3://mybucket/gson-2.3.1.jar"]'
要指定具有多个目录级别的库,请参阅多级库依赖项。
DEPENDS 对使用 R 编写的库没有影响。R 软件包必须本地安装在每个节点上,包括外部依赖项。
重要
CREATE LIBRARY 的性能在 Eon 模式下会降低,这与 DEPENDS 子句指定的依赖关系的数量和深度成正比。
如果 Java 库依赖于本机库(SO 文件),请使用 DEPENDS 指定路径并调用 UDx 中的 System.loadLibrary()
以从该路径加载本机库。
-
LANGUAGE 'language'
- 库中函数的编程语言,下列之一:
特权
超级用户,或者架构上的 UDXDEVELOPER 和 CREATE。非超级用户必须显式启用 UDXDEVELOPER 角色,如下例所示:
=> SET ROLE UDXDEVELOPER;
SET
-- Not required, but you can confirm the role as follows:
=> SHOW ENABLED ROLES;
name | setting
---------------+--------------
enabled roles | udxdeveloper
(1 row)
=> CREATE LIBRARY MyLib AS '/home/dbadmin/my_lib.so';
CREATE LIBRARY
-- Create functions...
-- UDXDEVELOPER also grants DROP (replace):
=> CREATE OR REPLACE LIBRARY MyLib AS '/home/dbadmin/my_lib.so';
要求
-
Vertica 会制作自己的库文件副本。后期修改或删除该语句中指定的原始文件不会影响编录中定义的库。要更新库,请使用 ALTER LIBRARY。
-
加载库并不能保证该功能可以正常工作。CREATE LIBRARY 会对库文件执行一些基本检查,以验证库文件是否兼容 Vertica。如果语句检测到库未正确编译或发现了其他一些基本的不兼容性,则语句失败。但是,CREATE LIBRARY 无法检测到共享库中的许多其他问题。
如果 DEPENDS 子句指定具有多个目录级别的库,Vertica 将按照库路径包含该库的所有子目录。例如,以下 CREATE LIBRARY 语句使 UDx 库 mylib
能够导入它在 site‑packages
的子目录中找到的所有 Python 包和模块:
=> CREATE LIBRARY mylib AS '/path/to/python_udx' DEPENDS '/path/to/python/site-packages' LANGUAGE 'Python';
重要
DEPENDS 可以指定深度达 100 级的 Java 库依赖项。
示例
在 dbadmin 帐户的主目录中加载库:
=> CREATE LIBRARY MyFunctions AS '/home/dbadmin/my_functions.so';
加载位于您启动 vsql
的目录中的库:
=> \set libfile '\''`pwd`'/MyOtherFunctions.so\'';
=> CREATE LIBRARY MyOtherFunctions AS :libfile;
从云端加载库:
=> CREATE LIBRARY SomeFunctions AS 'S3://mybucket/extensions.so';
加载依赖于同一目录中多个 JAR 文件的库:
=> CREATE LIBRARY DeleteVowelsLib AS '/home/dbadmin/JavaLib.jar'
DEPENDS '/home/dbadmin/mylibs/*' LANGUAGE 'Java';
加载具有多个显式依赖项的库:
=> CREATE LIBRARY mylib AS '/path/to/java_udx'
DEPENDS '/path/to/jars/this.jar:/path/to/jars/that.jar' LANGUAGE 'Java';
在云中加载具有依赖项的库:
=> CREATE LIBRARY s3lib AS 's3://mybucket/UdlLib.jar'
DEPENDS '["s3://mybucket/gson-2.3.1.jar"]' LANGUAGE 'Java';
11.14 - CREATE LOAD BALANCE GROUP
创建可通过负载均衡路由规则定位的一组网络地址。您可以使用网络地址列表或基于一个或多个容错组或子群集创建组。
注意
您不能将一个节点的多个网络地址添加到同一个负载均衡组。
语法
CREATE LOAD BALANCE GROUP group_name WITH {
ADDRESS address[,...]
| FAULT GROUP fault_group[,...] FILTER 'IP_range'
| SUBCLUSTER subcluster[,...] FILTER 'IP_range'
}
[ POLICY 'policy_setting' ]
参数
-
group_name
- 要创建的组的名称。以后在定义负载均衡规则时使用此名称。
-
address[,...]
- 您之前创建的逗号分隔的网络地址列表。
-
fault_group[,...]
- 逗号分隔的容错组列表,用作负载均衡组的基础。
-
subcluster[,...]
- 逗号分隔的子群集列表,用作负载均衡组的基础。
注意
与容错组一样,您必须在要成为负载均衡组一部分的子群集中的节点上创建网络地址。
-
IP_range
- 以 CIDR 表示法包含在来自容错组或子群集的负载均衡组中的 IP 地址范围。此范围可以是 IPv4 或 IPv6。只有网络地址的 IP 地址在此范围内的节点才会添加到负载均衡组中。
-
policy_setting
- 确定最初联系的节点如何从组中选择目标,为以下之一:
特权
超级用户
示例
以下语句演示了创建一个包含多个网络地址的负载均衡组:
=> CREATE NETWORK ADDRESS addr01 ON v_vmart_node0001 WITH '10.20.110.21';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS addr02 ON v_vmart_node0002 WITH '10.20.110.22';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS addr03 on v_vmart_node0003 WITH '10.20.110.23';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS addr04 on v_vmart_node0004 WITH '10.20.110.24';
CREATE NETWORK ADDRESS
=> CREATE LOAD BALANCE GROUP group_1 WITH ADDRESS addr01, addr02;
CREATE LOAD BALANCE GROUP
=> CREATE LOAD BALANCE GROUP group_2 WITH ADDRESS addr03, addr04;
CREATE LOAD BALANCE GROUP
=> SELECT * FROM LOAD_BALANCE_GROUPS;
name | policy | filter | type | object_name
------------+------------+-----------------+-----------------------+-------------
group_1 | ROUNDROBIN | | Network Address Group | addr01
group_1 | ROUNDROBIN | | Network Address Group | addr02
group_2 | ROUNDROBIN | | Network Address Group | addr03
group_2 | ROUNDROBIN | | Network Address Group | addr04
(4 rows)
此示例演示使用容错组创建负载均衡组:
=> CREATE FAULT GROUP fault_1;
CREATE FAULT GROUP
=> ALTER FAULT GROUP fault_1 ADD NODE v_vmart_node0001;
ALTER FAULT GROUP
=> ALTER FAULT GROUP fault_1 ADD NODE v_vmart_node0002;
ALTER FAULT GROUP
=> ALTER FAULT GROUP fault_1 ADD NODE v_vmart_node0003;
ALTER FAULT GROUP
=> ALTER FAULT GROUP fault_1 ADD NODE v_vmart_node0004;
ALTER FAULT GROUP
=> SELECT node_name,node_address,node_address_family,export_address
FROM v_catalog.nodes;
node_name | node_address | node_address_family | export_address
------------------+--------------+---------------------+----------------
v_vmart_node0001 | 10.20.110.21 | ipv4 | 10.20.110.21
v_vmart_node0002 | 10.20.110.22 | ipv4 | 10.20.110.22
v_vmart_node0003 | 10.20.110.23 | ipv4 | 10.20.110.23
v_vmart_node0004 | 10.20.110.24 | ipv4 | 10.20.110.24
(4 rows)
=> CREATE LOAD BALANCE GROUP group_all WITH FAULT GROUP fault_1 FILTER
'0.0.0.0/0';
CREATE LOAD BALANCE GROUP
=> CREATE LOAD BALANCE GROUP group_some WITH FAULT GROUP fault_1 FILTER
'10.20.110.21/30';
CREATE LOAD BALANCE GROUP
=> SELECT * FROM LOAD_BALANCE_GROUPS;
name | policy | filter | type | object_name
----------------+------------+-----------------+-----------------------+-------------
group_all | ROUNDROBIN | 0.0.0.0/0 | Fault Group | fault_1
group_some | ROUNDROBIN | 10.20.110.21/30 | Fault Group | fault_1
(2 rows)
另请参阅
11.15 - CREATE LOCAL TEMPORARY VIEW
创建或替换本地临时视图。视图是只读内容,所以不支持插入、更新、删除或复制操作。本地临时视图是会话范围的视图,因此仅在当前视图中供其创建者可见。会话结束时,Vertica 会删除视图。
注意
Vertica 不支持全局临时视图。
语法
CREATE [OR REPLACE] LOCAL TEMP[ORARY] VIEW view [ (column[,...] ) ] AS query
参数
OR REPLACE
- 指定覆盖现有视图 view-name。如果您省略此选项并且 view-name 已经存在,则
CREATE VIEW
返回错误。
- 视图
- 标识要创建的视图,其中 view 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
- 列
[,...]
- 由最多 9800 个用作视图列名称的名称组成的列表。Vertica 按照各自列表的顺序将视图列名称映射到查询列。默认情况下,视图使用在查询中指定的列名称。
-
AS query
- 临时视图执行的
SELECT
语句。SELECT
语句可以引用表、临时表以及其他视图。
特权
请参阅创建视图。
示例
以下 CREATE LOCAL TEMPORARY VIEW
语句将会创建临时视图 myview
。此视图会将 store.store_sales_fact
表中所列的各个客户的所有收入相加,并按州对结果进行分组:
=> CREATE LOCAL TEMP VIEW myview AS
SELECT SUM(annual_income), customer_state FROM public.customer_dimension
WHERE customer_key IN (SELECT customer_key FROM store.store_sales_fact)
GROUP BY customer_state
ORDER BY customer_state ASC;
以下示例使用临时视图 myview
,该视图具有 WHERE
子句,以将结果限制为大于 20 亿美元的合并收入:
=> SELECT * FROM myview WHERE SUM > 2000000000;
SUM | customer_state
-------------+----------------
2723441590 | AZ
29253817091 | CA
4907216137 | CO
3769455689 | CT
3330524215 | FL
4581840709 | IL
3310667307 | IN
2793284639 | MA
5225333668 | MI
2128169759 | NV
2806150503 | PA
2832710696 | TN
14215397659 | TX
2642551509 | UT
(14 rows)
另请参阅
11.16 - CREATE LOCATION
创建可供 Vertica 存储数据的存储位置。创建该位置后,可以在其中存储策略,以将该存储位置分配给将在此位置存储数据的数据库对象。
当心
如果没有技术问题阻止您使用 CREATE LOCATION
添加一个或多个网络文件系统 (NFS) 存储位置,则 Vertica 不支持 NFS 数据或编录存储,MapR 挂载点除外。您将无法对任何其他 NFS 数据运行查询。在 MapR 文件系统上创建位置时,您必须指定 ALL NODES SHARED
。
如果您使用 HDFS 存储位置,则在启动 Vertica 时 HDFS 数据必须可用。HDFS 群集必须可以运行,且 ROS 文件必须存在。如果您已移动数据文件,或者它们已损坏,或者 HDFS 群集没有响应,则 Vertica 无法启动。
语法
CREATE LOCATION 'path'
[NODE 'node' | ALL NODES]
[SHARED]
[USAGE 'usage']
[LABEL 'label']
[LIMIT 'size']
参数
- 路径
- 存储此位置数据的位置。位置所基于的文件系统类型决定了 path 格式:
HDFS 存储位置有其他要求。
-
ALL NODES | NODE 'node
'
- 在其上定义存储位置的一个或多个节点,为以下之一:
SHARED
- 指示 path 设置的位置被共享(为所有节点使用),而非本地于每个节点。您不能使用 SHARED 指定单个节点;您必须使用 ALL NODES。
多数远程文件系统(例如 HDFS 和 S3)都被共享。对于这些文件系统,path 实参表示远程文件系统中所有节点存储数据的单个位置。如果使用远程文件系统,您必须指定 SHARED,即使对于单节点群集也是如此。
注意
如果 path 设置为 S3 公共存储,则始终隐含 SHARED
并且可以省略。
已弃用
SHARED DATA 和 SHARED DATA,TEMP 存储位置已被弃用。
-
USAGE 'usage'
- 存储位置可以保存的数据类型,其中 usage 为以下之一:
-
DATA,TEMP
(默认值):存储位置可以存储 DML 生成的永久和临时数据,以及临时表的数据。
-
TEMP
:path 指定的位置,用于存储 DML 生成的临时数据。如果 path 设置为 S3,则仅当 RemoteStorageForTemp 配置参数设置为 1 且 TEMP
必须使用 ALL NODES SHARED 加以限定。有关详细信息,请参阅临时数据的 S3 存储。
-
DATA
:存储位置只能存储永久数据。
-
USER
:具有 READ 和 WRITE 权限的用户可以访问此存储位置的数据和外部表。
-
DEPOT
:该存储位置用于在
Eon 模式中存储存储库。仅在本地 Linux 文件系统上创建 DEPOT
存储位置。
Vertica 允许每个节点有单个 DEPOT
存储位置。如果要将存储库移动到不同的位置(例如,在不同的文件系统上),您必须首先删除旧的存储库存储位置,然后创建新位置。
-
LABEL 'label'
- 存储位置的标签,在将存储位置分配给数据对象时使用。当以后在为数据对象分配存储位置时会使用此名称。
重要
您必须为存储库存储位置提供标签。
-
LIMIT 'size'
仅当存储位置使用类型设置为 DEPOT
时才有效,指定存储库可以从存储位置的文件系统中分配的最大磁盘空间量。
您可以通过两种方式指定 size:
重要
存储库大小不能超过其所在文件系统磁盘空间的 80%。如果指定的值太大,Vertica 会发出警告并自动将该值更改为文件系统大小的 80%。
如果未指定限制,则将其设置为 60%。
特权
超级用户
文件系统访问
Vertica 进程必须对要存储数据的位置具有读写权限。每个文件系统都有自己的要求:
示例
在本地 Linux 文件系统中创建一个存储位置,用于临时数据存储:
=> CREATE LOCATION '/home/dbadmin/testloc' USAGE 'TEMP' LABEL 'tempfiles';
在 HDFS 上创建存储位置。HDFS 群集不使用 Kerberos:
=> CREATE LOCATION 'hdfs://hadoopNS/vertica/colddata' ALL NODES SHARED
USAGE 'data' LABEL 'coldstorage';
在使用 Kerberos 的 Hadoop 群集上创建相同的存储位置。请注意报告正在使用的主体的输出:
=> CREATE LOCATION 'hdfs://hadoopNS/vertica/colddata' ALL NODES SHARED
USAGE 'data' LABEL 'coldstorage';
NOTICE 0: Performing HDFS operations using kerberos principal [vertica/hadoop.example.com]
CREATE LOCATION
为用户数据创建一个位置,授予对这些数据的访问权限以及使用这些数据创建外部表:
=> CREATE LOCATION '/tmp' ALL NODES USAGE 'user';
CREATE LOCATION
=> GRANT ALL ON LOCATION '/tmp' to Bob;
GRANT PRIVILEGE
=> CREATE EXTERNAL TABLE ext1 (x integer) AS COPY FROM '/tmp/data/ext1.dat' DELIMITER ',';
CREATE TABLE
在 S3 上创建用户存储位置和角色,以便没有自己的 S3 凭据的用户可以使用服务器凭据从 S3 读取数据:
--- set database-level credential (once):
=> ALTER DATABASE DEFAULT SET AWSAuth = 'myaccesskeyid123456:mysecretaccesskey123456789012345678901234';
=> CREATE LOCATION 's3://datalake' SHARED USAGE 'USER' LABEL 's3user';
=> CREATE ROLE ExtUsers;
--- Assign users to this role using GRANT (Role).
=> GRANT READ ON LOCATION 's3://datalake' TO ExtUsers;
另请参阅
11.17 - CREATE NETWORK ADDRESS
创建可用作连接负载均衡策略一部分的网络地址。网络地址会在 Vertica 编录中为与节点关联的 IP 地址和端口号创建名称。节点可以有多个网络地址,网络上的每个 IP 地址最多一个。
语法
CREATE NETWORK ADDRESS name ON node WITH 'ip-address' [PORT port-number] [ENABLED | DISABLED]
参数
-
name
- 新网络地址的名称。创建连接负载均衡组时使用此名称。
-
节点
- 要在其上创建网络地址的节点的名称。这应该是出现在系统表 NODES 的
node_name
列中的节点的名称。
-
ip-address
- 节点上要与网络地址关联的 IPv4 或 IPv6 地址。
注意
Vertica 不会验证您在此参数中提供的 IP 地址是否实际与指定节点相关联。确保 IP 地址实际上属于该节点。否则,您的负载均衡策略可能会将客户端连接发送到错误的节点或非 Vertica 主机。Vertica 拒绝对节点无效的 IP 地址。例如,它会检查 IP 地址是否在 127.0.0.0/8 的环回地址范围内。如果发现 IP 地址无效,则 CREATE NETWORK ADDRESS 返回错误。
-
PORT port-number
- 设置网络地址的端口号。更改端口号时必须提供网络地址。
ENABLED | DISABLED
- 启用或禁用网络地址。
特权
超级用户
示例
创建三个网络地址,一个用于三节点群集中的每个节点:
=> SELECT node_name,export_address from v_catalog.nodes;
node_name | export_address
---------------------+----------------
v_vmart_br_node0001 | 10.20.100.62
v_vmart_br_node0002 | 10.20.100.63
v_vmart_br_node0003 | 10.20.100.64
(3 rows)
=> CREATE NETWORK ADDRESS node01 ON v_vmart_br_node0001 WITH '10.20.100.62';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS node02 ON v_vmart_br_node0002 WITH '10.20.100.63';
CREATE NETWORK ADDRESS
=> CREATE NETWORK ADDRESS node03 ON v_vmart_br_node0003 WITH '10.20.100.64';
另请参阅
11.18 - CREATE NETWORK INTERFACE
标识节点所属的网络接口。
当您要配置从单个节点到其他 Vertica 群集的导入/导出操作时,请使用此语句。默认情况下,安装 Vertica 时,它会为所有连接的网络创建接口。只有在安装 Vertica 后网络拓扑发生变化的情况下,您才需要 CREATE NETWORK INTERFACE。
语法
CREATE NETWORK INTERFACE network‑interface‑name ON node‑name [WITH] 'node‑IP‑address' [PORT port-number] [ENABLED | DISABLED]
- network‑interface‑name
- 分配给网络接口的名称,其中 network-interface-name 符合标识符中描述的约定。
- node‑name
- 节点的名称。
- node‑IP‑address
- 节点的 IP 地址,公共或私有 IP 地址。有关详细信息,请参阅使用公共和专用 IP 网络。
- PORT port-number
- 设置网络接口的端口号。更改端口号时必须提供网络接口。
- [ENABLED | DISABLED]
- 启用或禁用网络接口。
特权
超级用户
示例
创建网络接口:
=> CREATE NETWORK INTERFACE mynetwork ON v_vmart_node0001 WITH '123.4.5.6' PORT 456 ENABLED;
11.19 - CREATE NOTIFIER
创建基于推送的通知程序,以从 Vertica 发送事件通知和消息。
语法
CREATE NOTIFIER [ IF NOT EXISTS ] notifier‑name ACTION 'notifier‑type'
[ ENABLE | DISABLE ]
[ MAXPAYLOAD 'max‑payload‑size' ]
MAXMEMORYSIZE 'max‑memory‑size'
[ TLSMODE 'tls‑mode' ]
[ CA BUNDLE bundle‑name [ CERTIFICATE certificate‑name ] ]
[ IDENTIFIED BY 'uuid' ]
[ [NO] CHECK COMMITTED ]
[ PARAMETERS 'adapter‑params' ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
- notifier‑name
- 此通知程序的唯一标识符。
-
ACTION 'notifier‑type'
- 字符串,通知程序的类型,为以下之一:
-
URL,具有以下格式,用于标识一个或多个目标 Kafka 服务器:
kafka://kafka-server-ip-address:port-number
要在 Kafka 服务器不可用时启用故障转移,请在逗号分隔的列表中指定其他主机。例如:
kafka://192.0.2.0:9092,192.0.2.1:9092,192.0.2.2:9092
-
syslog
:通知会发送到 syslog。要使用这种类型的通知程序,您必须设置 SyslogEnabled
参数:
=> ALTER DATABASE DEFAULT SET SyslogEnabled = 1
此通知程序类型监视的事件不会记录到
MONITORING_EVENTS 或 vertica.log
。
ENABLE | DISABLE
- 指定启用还是禁用通知程序。
默认值: ENABLE
。
MAXPAYLOAD
- 消息的最大大小,最多 10^9 字节,以 KB 或 MB 为单位指定,如下所示:
MAXPAYLOAD integer{K|M}
存在以下限制:
默认值:
MAXMEMORYSIZE
- 内部通知程序的最大大小,最大为 2 TB,以 KB、MB、GB 或 TB 为单位指定,如下所示:
MAXMEMORYSIZE integer{K|M|G|T}
MAXMEMORYSIZE
必须大于 MAXPAYLOAD
。
如果消息队列的大小超过 MAXMEMORYSIZE
,通知程序将删除多余的消息。
-
TLSMODE 'tls‑mode'
指定通知程序和端点之间的连接类型,可以是以下类型之一:
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
CA BUNDLE bundle‑name
指定 CA 捆绑包。如果 TLSMODE
需要,捆绑包中的证书可用于验证 Kafka 服务器的证书。
如果为当前使用 disable
的通知程序指定了 CA 捆绑包,而不会验证 Kafka 服务器的证书,则在连接到 Kafka 服务器时,将不使用该捆绑包。除非将 TLSMODE
更改为验证服务器证书行为,否则此行为会持续存在。
对 CA 捆绑包内容的更改,在通知程序后禁用并重新启用或在数据库重新启动后生效。但是,对通知程序所用的 CA 捆绑包的更改会立即生效。
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
CERTIFICATE certificate‑name
指定一个供端点验证的客户端证书。
如果通知程序 ACTION
为 'syslog'
,则该参数无效;您必须为 TLS 配置 syslog 才能为这些 Vertica syslog 通知程序启用加密。
-
IDENTIFIED BY uuid
- 指定通知程序的唯一标识符。如果设置,则此通知程序发布的所有消息都具有此属性。
[NO] CHECK COMMITTED
- 指定在发送队列中的下一条消息之前等待传递确认。
某些消息传递系统(如 syslog)不支持传递确认。
-
PARAMETERS 'adapter‑params'
- 指定以字符串形式传递给适配器的一个或多个可选适配器参数。适配器参数仅适用于与通知程序关联的适配器。
对于 Kafka 通知程序,请参阅 Kafka 和 Vertica 配置设置。
对于 syslog 通知程序,使用
eventSeverity=severity
指定事件的严重性,其中 severity 为以下之一:
-
0
:紧急
-
1
:警报
-
2
:严重
-
3
:错误
-
4
:警告
-
5
:注意
-
6
:信息
-
7
:Debug
默认情况下,大多数 syslog 实现不记录严重级别为 7 的事件。您必须配置 syslog 来记录这些类型的事件。
特权
超级用户
SASL_SSL Kafka 配置的加密通知程序
按照此步骤,为使用 SASL_SSL 的 Kafka 端点创建或更改通知程序。请注意,每当您更改给定通知程序的 TLSMODE、证书或 CA 捆绑包时,都必须重复此步骤。
-
在设置 TLSMODE、证书和 CA 捆绑包时,使用 CREATE 或 ALTER 以禁用通知程序。
=> ALTER NOTIFIER encrypted_notifier
DISABLE
TLSMODE 'verify-ca'
CA BUNDLE ca_bundle2;
-
更改通知程序并为 SASL_SSL 设置适合的 rdkafka 适配器参数。
=> ALTER NOTIFIER encrypted_notifier PARAMETERS
'sasl.username=user;sasl.password=password;sasl.mechanism=PLAIN;security.protocol=SASL_SSL';
-
启用通知程序。
=> ALTER NOTIFIER encrypted_notifier ENABLE;
示例
Kafka 通知程序
创建 Kafka 通知程序:
=> CREATE NOTIFIER my_dc_notifier
ACTION 'kafka://172.16.20.10:9092'
MAXMEMORYSIZE '1G'
IDENTIFIED BY 'f8b0278a-3282-4e1a-9c86-e0f3f042a971'
NO CHECK COMMITTED;
使用特定于适配器的参数创建通知程序:
=> CREATE NOTIFIER my_notifier
ACTION 'kafka://127.0.0.1:9092'
MAXMEMORYSIZE '10M'
PARAMETERS 'queue.buffering.max.ms=1000';
创建使用加密连接并使用提供的 CA 捆绑包验证 Kafka 服务器证书的通知程序:
=> CREATE NOTIFIER encrypted_notifier
ACTION 'kafka://127.0.0.1:9092'
MAXMEMORYSIZE '10M'
TLSMODE 'verify-ca'
CA BUNDLE ca_bundle;
Syslog 通知程序
以下示例创建了一个通知程序,当
数据收集器 (DC) 组件 LoginFailures
更新时,它会向 syslog 写入一条消息:
-
为当前数据库启用 syslog 通知程序:
=> ALTER DATABASE DEFAULT SET SyslogEnabled = 1;
-
创建并启用系统日志通知程序 v_syslog_notifier
:
=> CREATE NOTIFIER v_syslog_notifier ACTION 'syslog'
ENABLE
MAXMEMORYSIZE '10M'
IDENTIFIED BY 'f8b0278a-3282-4e1a-9c86-e0f3f042a971'
PARAMETERS 'eventSeverity = 5';
-
配置 syslog 通知程序 v_syslog_notifier
以更新具有 SET_DATA_COLLECTOR_NOTIFY_POLICY 的 LoginFailures
DC 组件:
=> SELECT SET_DATA_COLLECTOR_NOTIFY_POLICY('LoginFailures','v_syslog_notifier', 'Login failed!', true);
当用户未能以用户 Bob 身份进行身份验证时,此通知程序将以下消息写入 syslog(默认位置:/var/log/messages):Apr 25 16:04:58 vertica_host_01 vertica: Event Posted: Event Code:21 Event Id:0 Event Severity: Notice [5] PostedTimestamp: 2022-04-25 16:04:58.083063 ExpirationTimestamp: 2022-04-25 16:04:58.083063 EventCodeDescription: Notifier ProblemDescription: (Login failed!) { "_db":"VMart", "_schema":"v_internal", "_table":"dc_login_failures", "_uuid":"f8b0278a-3282-4e1a-9c86-e0f3f042a971", "authentication_method":"Reject", "client_authentication_name":"default: Reject", "client_hostname":"::1", "client_label":"", "client_os_user_name":"dbadmin", "client_pid":523418, "client_version":"", "database_name":"dbadmin", "effective_protocol":"3.8", "node_name":"v_vmart_node0001", "reason":"REJECT", "requested_protocol":"3.8", "ssl_client_fingerprint":"", "ssl_client_subject":"", "time":"2022-04-25 16:04:58.082568-05", "user_name":"Bob" }#012 DatabaseName: VMart Hostname: vertica_host_01
有关 syslog 通知程序的详细信息,请参阅为 syslog 配置报告。
另请参阅
11.20 - CREATE PROCEDURE(外部)
仅限企业模式
将外部过程添加到 Vertica。有关详细信息,请参阅外部过程。
语法
CREATE PROCEDURE [ IF NOT EXISTS ]
[[database.]schema.]procedure( [ argument-list ] )
AS executable
LANGUAGE 'EXTERNAL'
USER OS-user
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
此选项无法与 OR REPLACE
结合使用。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
过程
- 为外部过程指定名称,其中 procedure-name符合标识符中描述的约定。
- argument-list
- 过程实参的逗号分隔列表,其中每个实参指定如下:
[ argname ] argtype
- executable
- 过程目录中可执行程序的名称,字符串。
- OS-user
- 文件的所有者,字符串。所有者:
-
不能是 root
-
必须对 executable 具有执行权限
特权
超级用户
系统安全
-
过程文件必须由数据库管理员(OS 帐户)或同一组中作为管理员的用户拥有。过程文件还必须启用集 UID 属性,并允许该组的读取和执行权限。
-
您使用 CREATE PROCEDURE(外部) 创建的外部过程始终以 Linux dbadmin 权限运行。如果 dbadmin 或伪超级用户授予非 dbadmin 权限以使用 GRANT(过程) 运行过程,请注意非 dbadmin 用户以完全 Linux dbadmin 权限运行该过程。
示例
以下示例展示了如何为过程文件 helloplanet.sh
创建一个名为 helloplanet
的过程。此文件接受一个 VARCHAR 实参。
创建文件:
#!/bin/bash
echo "hello planet argument: $1" >> /tmp/myprocedure.log
使用以下 SQL 创建过程:
=> CREATE PROCEDURE helloplanet(arg1 varchar) AS 'helloplanet.sh' LANGUAGE 'external' USER 'dbadmin';
另请参阅
11.21 - CREATE PROCEDURE(存储)
创建存储过程。
语法
CREATE [ OR REPLACE ] PROCEDURE [ IF NOT EXISTS ]
[[database.]schema.]procedure( [ parameter-list ] )
[ LANGUAGE 'language-name' ]
[ SECURITY { DEFINER | INVOKER } ]
AS $$ source $$;
参数
OR REPLACE
- 如果已存在相同名称的过程,请将其替换。对原始过程具有权限的用户和角色在新过程中保留这些权限。
此选项无法与 IF NOT EXISTS
结合使用。
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
此选项无法与 OR REPLACE
结合使用。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
过程
- 存储过程的名称,其中 procedure-name符合标识符中描述的约定。
- parameter-list
- 正式参数的逗号分隔列表,每个参数指定如下:
[ parameter-mode ] parameter-name parameter-type
- language-name
- 指定过程 source 的语言,为以下之一(两个选项均涉及 PLvSQL;PLpgSQL 包括在内以保持与现有脚本的兼容性):
默认值: PLvSQL
SECURITY { DEFINER | INVOKER }
- 确定在调用过程时要使用的权限并执行它,就好像用户为以下之一:
-
DEFINER:定义过程的用户
-
INVOKER:调用过程的用户
使用 SECURITY DEFINER 的过程以该用户身份有效地执行过程,因此,对数据库的更改似乎是由过程的定义者(而不是其调用者)执行的。
当心
对 SECURITY DEFINER 使用不当会导致
混淆代理问题,并在您的系统中引入 SQL 注入等漏洞。
有关详细信息,请参阅执行存储过程。
- 源
- 过程源代码。有关详细信息,请参阅范围和结构。
特权
非超级用户:对过程架构的 CREATE 权限
示例
有关更复杂的示例,请参阅 存储过程:用例和示例
此过程打印其实参:
=> CREATE PROCEDURE raiseXY(IN x INT, y VARCHAR) LANGUAGE PLvSQL AS $$
BEGIN
RAISE NOTICE 'x = %', x;
RAISE NOTICE 'y = %', y;
-- some processing statements
END;
$$;
CALL raiseXY(3, 'some string');
NOTICE 2005: x = 3
NOTICE 2005: y = some string
有关 RAISE NOTICE 的详细信息,请参阅错误和诊断。
另请参阅
11.22 - CREATE PROFILE
创建一个配置文件以控制用户的密码要求。
语法
CREATE PROFILE profile‑name LIMIT [
PASSWORD_LIFE_TIME setting
PASSWORD_MIN_LIFE_TIME setting
PASSWORD_GRACE_TIME setting
FAILED_LOGIN_ATTEMPTS setting
PASSWORD_LOCK_TIME setting
PASSWORD_REUSE_MAX setting
PASSWORD_REUSE_TIME setting
PASSWORD_MAX_LENGTH setting
PASSWORD_MIN_LENGTH setting
PASSWORD_MIN_LETTERS setting
PASSWORD_MIN_UPPERCASE_LETTERS setting
PASSWORD_MIN_LOWERCASE_LETTERS setting
PASSWORD_MIN_DIGITS setting
PASSWORD_MIN_SYMBOLS setting
PASSWORD_MIN_CHAR_CHANGE setting ]
参数
注意
所有未在新配置文件中明确设置的参数均设置为 default
,并从默认配置文件继承其设置。
特权
超级用户
配置文件设置和客户端身份验证
以下配置文件设置会影响客户端身份验证方法,例如 LDAP 或 GSS:
-
FAILED_LOGIN_ATTEMPTS
-
PASSWORD_LOCK_TIME
所有其他配置文件设置仅供 Vertica 用于管理其密码。
示例
=> CREATE PROFILE sample_profile LIMIT PASSWORD_MAX_LENGTH 20;
另请参阅
11.23 - 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 投影不支持复杂类型。
11.23.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,以指定分区范围没有上限。
有关其他要求和使用详细信息,请参阅 分区范围投影。
特权
非超级用户:
示例
请参阅:
11.23.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 不会将实时聚合投影视为
超投影,即使是包含所有表列的投影也是如此。有关其他要求和限制,请参阅创建实时聚合投影。
示例
请参阅实时聚合投影示例。
11.23.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 投影示例。
11.23.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 结果。
11.23.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 时间较慢。
11.23.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;
11.23.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;
11.23.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)
11.24 - CREATE RESOURCE POOL
创建自定义资源池并设置一个或多个资源池参数。
语法
CREATE RESOURCE POOL pool‑name [ FOR subcluster-spec ] [ parameter‑name setting ]...
参数
- pool‑name
- 资源池的名称。内置池名称不能用于用户定义的池。
注意
如果使用大写字母指定资源池名称,Vertica 会将它们转换为小写字母。
-
FOR subcluster‑spec
- 仅限 Eon 模式,指定将此资源池与某个子群集关联,其中 subcluster-spec 为以下之一:
-
SUBCLUSTER subcluster-name
:为现有子群集创建资源池。您不能连接到此子群集,否则 Vertica 会返回错误。
CURRENT SUBCLUSTER
:为连接到的子群集创建资源池。
如果忽略,则在全局创建资源池。尝试创建与特定于子群集的资源池同名的全局资源池时会返回错误。
- parameter‑name
- 要设置的参数,如下所示。
- 设置
要在 parameter‑name 上设置的值。要将此参数重置为其默认值,请指定 DEFAULT
。
-
CASCADE TO
指定一个辅助资源池,用于执行其
[RUNTIMECAP](#RUNTIMECAP)
设置超出分配资源池的查询:
CASCADE TO secondary‑pool
-
CPUAFFINITYMODE
指定资源池是单独使用还是共用
[CPUAFFINITYSET](#CPUAFFINITYSET)
中指定的 CPU。
CPUAFFINITYMODE { SHARED | EXCLUSIVE | ANY }
-
SHARED
:在此池中运行的查询与其他 Vertica 资源池共享其 CPUAFFINITYSET
CPU。
-
EXCLUSIVE
:仅将 CPUAFFINITYSET
CPU 专用于此资源池,不用于其他 Vertica 资源池。如果将 CPUAFFINITYSET
设置为百分比,那么仅为此资源池分配可用于 Vertica 的 CPU 资源百分比。
-
ANY
(默认值):此资源池中的查询可以在任何 CPU 上运行,如果 CPUAFFINITYSET
指定 CPU 资源,则此查询无效。
重要
CPUAFFINITYMODE
CPUAFFINITYSET
必须在同一语句中一起设置。
-
CPUAFFINITYSET
指定此资源池可用的 CPU。所有群集节点必须具有相同的 CPU 数量。分配给该集合的 CPU 资源对常规资源池不可用。
CPUAFFINITYSET {
'cpu‑index[,...]'
| 'cpu‑indexi-cpu‑indexn'
| 'integer%'
| NONE
}
-
cpu‑index[,...]
:将以一个或多个逗号分隔的 CPU 专用于此池。
-
cpu‑indexi-cpu‑indexn
:将一系列连续的 CPU 索引专用于此池
-
integer%
:此池可用的所有可用 CPU 的百分比。Vertica 将此百分比向下舍入以包括整个 CPU 单元。
-
NONE
(默认值):没有关联集分配给该资源池。与该池关联的查询可在任何 CPU 上执行。
重要
CPUAFFINITYSET
CPUAFFINITYMODE
必须在同一语句中一起设置。
-
EXECUTIONPARALLELISM
限制用于处理此资源池中发出的任何单一查询的线程数量。
EXECUTIONPARALLELISM { limit | AUTO }
-
MAXCONCURRENCY
设置群集中资源池可用的最大并发执行槽数:
MAXCONCURRENCY { integer | NONE }
NONE
(默认)指定不限数量的并发执行槽。
-
MAXMEMORYSIZE
通过从
GENERAL
池中借用内存,资源池可以增加的每个节点的最大大小:
MAXMEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
| NONE
}
MAXQUERYMEMORYSIZE
此池可以在运行时分配以处理查询的最大内存量。如果查询需要的内存超过此设置,Vertica 将停止执行并返回错误。
设置此参数如下:
MAXQUERYMEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
| NONE
}
-
integer%
:百分比
此池的 MAXMEMORYSIZE
。
-
integer{K|M|G|T}
:以千字节、兆字节、千兆字节或太字节为单位的内存量,最大为
MAXMEMORYSIZE
。
-
NONE
(默认值):无限制;池可以从 GENERAL 池中借用任意数量的可用内存,其限制由以下设置:
MAXMEMORYSIZE
。
-
MEMORYSIZE
每个节点分配给此池的 Vertica 资源管理器可用的总内存量:
MEMORYSIZE {
'integer%'
| 'integer{K|M|G|T}'
}
默认值: 0%。没有分配任何内存,资源池从
GENERAL
池中借用内存。
-
PLANNEDCONCURRENCY
指定资源池中并发执行的查询首选数量。此设置适用于整个群集:
PLANNEDCONCURRENCY { num‑queries | AUTO }
对于不同节点上逻辑核数不同的群集,AUTO
可以在每个节点上应用不同的方法。分布式查询的运行方式类似于最低的有效计划并发性能。单节点查询以发起方的计划并发性能运行。
提示
请仅在评估一段时间的性能后再更改此参数。
-
PRIORITY
指定此池中的查询在争用
GENERAL
池中资源时的优先级:
PRIORITY { integer | HOLD }
默认值: 0
-
QUEUETIMEOUT
指定请求在被拒绝之前可以等待池资源多长时间:
QUEUETIMEOUT { integer | NONE }
-
integer:最长等待时间(以秒为单位)
-
NONE
:没有最长等待时间,请求可以无限排队。
默认值: 300 秒
-
RUNTIMECAP
通过设置池中的查询可以执行的最大时间,可以防止查询失控。如果查询超出此设置,它会尝试级联到辅助池。
RUNTIMECAP { 'interval' | NONE }
-
interval:1 分钟或 100 秒的间隔;不应超过 1 年。
-
NONE
(默认值):在此池中运行的查询没有时间限制。
要以天为单位指定一个值,请提供整数值。要提供小于一天的值,请以 hours:minutes:seconds
格式提供间隔。例如,值为 1:30:00
时,则等于 90 分钟。
如果用户或会话也具有 RUNTIMECAP
,则会应用较短的限制。
-
RUNTIMEPRIORITY
确定资源管理器应如何将运行时资源(CPU、I/O 带宽)的优先级分配给已在此资源池中运行的查询:
RUNTIMEPRIORITY { HIGH | MEDIUM | LOW }
默认值: MEDIUM
-
RUNTIMEPRIORITYTHRESHOLD
以秒为单位指定一个时间限制,在资源管理器为其分配资源池 RUNTIMEPRIORITY
之前,必须完成一个查询。所有查询从 HIGH
优先级开始运行。如果查询的持续时间超过了此阈值,它将分配到资源池的 RUNTIMEPRIORITY
。
RUNTIMEPRIORITYTHRESHOLD seconds
默认值: 2
SINGLEINITIATOR
默认情况下,已设置为 false 以实现向后兼容性。切勿更改此设置。
特权
超级用户
示例
此示例显示了如何创建具有 1800 MB MEMORYSIZE
的资源池。
=> CREATE RESOURCE POOL ceo_pool MEMORYSIZE '1800M' PRIORITY 10;
CREATE RESOURCE POOL
使用 ALTER USER
语句将假设已存在的 CEO 报告用户与上述资源池相关联。
=> GRANT USAGE ON RESOURCE POOL ceo_pool to ceo_user;
GRANT PRIVILEGE
=> ALTER USER ceo_user RESOURCE POOL ceo_pool;
ALTER USER
发出以下命令确认 ceo_user 与 ceo_pool 相关联:
=> SELECT * FROM users WHERE user_name ='ceo_user';
-[ RECORD 1 ]-----+--------------------------------------------------
user_id | 45035996273733402
user_name | ceo_user
is_super_user | f
profile_name | default
is_locked | f
lock_time |
resource_pool | ceo_pool
memory_cap_kb | unlimited
temp_space_cap_kb | unlimited
run_time_cap | unlimited
all_roles |
default_roles |
search_path | "$user", public, v_catalog, v_monitor, v_internal
此示例显示了如何创建和指定辅助资源池。
=> CREATE RESOURCE POOL rp3 RUNTIMECAP '5 minutes';
=> CREATE RESOURCE POOL rp2 RUNTIMECAP '3 minutes' CASCADE TO rp3;
=> CREATE RESOURCE POOL rp1 RUNTIMECAP '1 minute' CASCADE TO rp2;
=> SET SESSION RESOURCE_POOL = rp1;
此 Eon 模式示例确认当前子群集名称,然后为当前子群集创建资源池:
=> SELECT CURRENT_SUBCLUSTER_NAME();
CURRENT_SUBCLUSTER_NAME
-------------------------
analytics_1
(1 row)
=> CREATE RESOURCE POOL dashboard FOR SUBCLUSTER analytics_1;
CREATE RESOURCE POOL
另请参阅
11.24.1 - 内置池
Vertica 预先配置了内置池来完成各种系统任务:
有关资源池设置的详细信息,请参阅 ALTER RESOURCE POOL。
GENERAL
一个通用池,用于答复未关联到特定
资源池的请求。为所有其他池分配内存后剩下的任何内存将自动分配给 GENERAL 池。GENERAL 池的 MEMORYSIZE 参数未定义(变量),但是 GENERAL 池的大小必须至少为 1GB,而且不得小于系统内存的 25%。
GENERAL 池的 MAXMEMORYSIZE 参数具有特殊意义,当设置为 % 值时,它表示计算机上
资源管理器可用于查询的总物理内存的百分比。默认情况下,它设置为 95%。MAXMEMORYSIZE 控制资源管理器可用于查询的内存总量,不论将它是设置为百分比还是特定的值(例如,“10GB”)。
用户定义的池可以从 GENERAL 池中借用内存,以满足需要额外内存的请求,直到达到该池的 MAXMEMORYSIZE 参数。如果将池配置为 MEMORYSIZE 等于 MAXMEMORYSIZE,则它不能从 GENERAL 池中借用任何内存。当多个池从 GENERAL 池请求内存时,它们将有权根据各自的优先级设置访问通用池内存。通过这种方式,GENERAL 池可以灵活地解释正常使用各个资源池产生的时间点偏差。
如果编录使用的总内存超过 5%,Vertica 会建议减少 GENERAL 池的 MAXMEMORYSIZE。您可以按以下方式计算编录使用的 GENERAL 池内存的百分比:
=> WITH memory_use_metadata AS (SELECT node_name, memory_size_kb FROM resource_pool_status WHERE pool_name='metadata'),
memory_use_general AS (SELECT node_name, memory_size_kb FROM resource_pool_status WHERE pool_name='general')
SELECT m.node_name, ((m.memory_size_kb/g.memory_size_kb) * 100)::NUMERIC(4,2) pct_catalog_usage
FROM memory_use_metadata m JOIN memory_use_general g ON m.node_name = g.node_name;
node_name | pct_catalog_usage
------------------+-------------------
v_vmart_node0001 | 0.41
v_vmart_node0002 | 0.37
v_vmart_node0003 | 0.36
(3 rows)
BLOBDATA
控制内存中的 blob 的资源使用情况量。内存中的 blob 是许多机器学习 SQL 函数使用的对象。如果计划处理大型机器学习工作负载,则应调整此池。有关优化池的信息,请参阅为机器学习进行调整。
如果使用 BLOBDATA 池的查询超出该池的查询计划预算,则它会溢出到磁盘。有关优化查询预算的详细信息,请参阅查询预算。
DBD
控制
Database Designer 处理的资源使用情况。使用此池由配置参数 DBDUseOnlyDesignerResourcePool 启用,默认情况下该参数设置为 false。
默认情况下,此池的 QUEUETIMEOUT 设置为 0。当资源面临压力时,此设置可使 DBD 立即超时,而不是排队等待运行。Database Designer 随后会请求用户在有更多的资源可用时再运行设计器。
重要
请勿更改 QUEUETIMEOUT 或任何 DBD 资源池参数。
JVM
控制 Java 用户定义的扩展使用的 Java 虚拟机资源。当 Java UDx 启动 JVM 时,它会从 JVM 资源池中获取指定的资源。Vertica 不会提前为 JVM 池保留内存。必要时,池可以扩展到物理内存的 10% 或 2 GB 内存,以较小者为准。如果您正在缓冲大量数据,可能需要增加 JVM 资源池的大小。
您可以通过更改其配置设置调整 JVM 资源池的大小。与其他资源池不同的是,JVM 资源池在会话关闭前不会释放资源。
跟踪为编录数据和存储数据结构分配的内存。随着 Vertica 元数据使用更多资源,此池的大小会增加。分配给 METADATA 池的内存将从 GENERAL 池中减去,从而使 Vertica 资源管理器能够更有效地利用可用资源。如果 METADATA 资源池达到 GENERAL 池的 75%,Vertica 将停止更新 METADATA 内存大小并在 vertica.log
中显示警告消息。您可以通过配置参数 EnableMetadataMemoryTracking 启用或禁用 METADATA 池。
如果您创建了一个“虚拟”或“交换”资源池来保护操作系统使用的资源,您可以将该池替换为 METADATA 池。
用户不能更改 METADATA 资源池的参数。
RECOVERY
由恢复数据库的另一个节点时发出的查询使用。MAXCONCURRENCY 参数用于确定要使用多少个并发恢复线程。可以使用 PLANNEDCONCURRENCY 参数(默认情况下,设置为 MAXCONCURRENCY
的两倍)优化分摊内存来恢复查询的方式。
请参阅为恢复进行调整。
REFRESH
由
PROJECTION_REFRESHES
操作发出的查询使用。
刷新当前不使用多个并发线程,因此,对 MAXCONCURRENCY 值的更改无效。
请参阅场景:对刷新进行优化。
SYSQUERY
对所有系统监控和编录表运行查询。SYSQUERY 池保留系统表查询的资源,以便它们不会被可用资源争用拦截。
TM
Tuple Mover (TM) 池。可以为 TM 池设置 MAXCONCURRENCY 参数,以允许并发 TM 操作。
请参阅调整 Tuple Mover 池设置。
11.24.2 - 内置资源池配置
要查看内置资源池的当前和默认配置,请分别查询系统表 RESOURCE_POOLS 和 RESOURCE_POOL_DEFAULTS。 以下部分提供了这些信息,并指出了哪些内置池参数可以使用 ALTER RESOURCE POOL 进行修改:
GENERAL
参数
|
设置
|
MEMORYSIZE |
空/不能设置 |
MAXMEMORYSIZE |
供所有资源池使用的最大内存,为以下之一:
MAXMEMORYSIZE {
'integer%'
'integer{K|M|G|T}'
}
当心
将此参数设置为 100% 将生成潜在交换的警告。
例如,如果您的节点有 64GB 内存,则将 MAXMEMORYSIZE 设置为 50% 会分配一半的可用内存。因此,所有资源池可用的最大内存量为 32GB。
默认值: 95%
|
MAXQUERYMEMORYSIZE |
此池为处理任何查询分配的最大内存量:
MAXQUERYMEMORYSIZE {
'integer%'
|
'integer{K|M|G|T}'
}
|
EXECUTIONPARALLELISM |
默认值: AUTO |
PRIORITY |
默认值: 0 |
RUNTIMEPRIORITY |
默认值: 中 |
RUNTIMEPRIORITYTHRESHOLD |
默认值: 2 |
QUEUETIMEOUT |
默认值: 00:05(分钟) |
RUNTIMECAP |
通过设置池中的查询可以执行的最大时间,可以防止查询失控。如果查询超出此设置,它会尝试级联到辅助池。
RUNTIMECAP { 'interval' | NONE }
|
PLANNEDCONCURRENCY |
您希望对资源池运行的并发查询数,此整数 ≥ 4。如果设置为 AUTO(默认),Vertica 会在查询运行时自动设置 PLANNEDCONCURRENCY,选择这两个值中较小的值:
重要
在具有大量内核的系统中,默认的 AUTO 设置 PLANNEDCONCURRENCY 可能会太低。在这种情况下,将参数设置为实际的核心数:
ALTER RESOURCE POOL general PLANNEDCONCURRENCY #cores;
默认值: AUTO
|
MAXCONCURRENCY |
默认值: Empty
当心
必须设置为 ≥ 1,否则 Vertica 将生成警告,指出系统查询可能无法执行。
|
SINGLEINITIATOR |
默认值: False。
重要
用于向后兼容性不要更换。
|
CPUAFFINITYSET |
默认值: Empty |
CPUAFFINITYMODE |
默认值: ANY |
CASCADETO |
默认值: Empty |
|
BLOBDATA
DBD
JVM
RECOVERY
参数
|
默认设置
|
MEMORYSIZE |
0% |
MAXMEMORYSIZE |
通过从
GENERAL 池中借用内存,资源池可以增加的每个节点的最大大小:
MAXMEMORYSIZE {
'integer%'
'integer{K|M|G|T}' |
NONE
}
当心
设置必须解析为 ≥ 25%。Vertica 将生成警告,指出系统查询可能无法执行。
|
MAXQUERYMEMORYSIZE |
空/不能设置 |
EXECUTIONPARALLELISM |
AUTO |
PRIORITY |
以下几项之一:
当心
仅可在 Vertica 技术支持的指导下更改这些设置。
|
RUNTIMEPRIORITY |
中 |
RUNTIMEPRIORITYTHRESHOLD |
60 |
QUEUETIMEOUT |
00:05(分钟) |
RUNTIMECAP |
NONE |
PLANNEDCONCURRENCY |
AUTO |
MAXCONCURRENCY |
默认情况下,设置如下:
(numberCores / 2) + 1
因此,对于具有四个内核的系统,MAXCONCURRENCY 的默认设置为 3。
|
SINGLEINITIATOR |
True。
重要
用于向后兼容性不要更换。
|
CPUAFFINITYSET |
空/不能设置 |
CPUAFFINITYMODE |
ANY/无法设置 |
CASCADETO |
空/不能设置 |
|
REFRESH
SYSQUERY
TM
11.25 - CREATE ROLE
创建
角色。创建角色后,使用 GRANT 语句指定角色权限。
语法
CREATE ROLE role
参数
- 角色
- 新角色的名称,其中 role 符合标识符中描述的约定。
特权
超级用户
示例
此示例显示了如何创建名为 roleA 的空角色。
=> CREATE ROLE roleA;
CREATE ROLE
另请参阅
11.26 - CREATE ROUTING RULE
创建负载均衡路由规则,将传入客户端连接从 IP 地址范围定向到一组 Vertica 节点。此组 Vertica 节点由负载均衡组定义。创建路由规则后,如果客户端选择使用负载均衡,则源自规则 IP 地址范围的任何客户端连接都将重定向到负载均衡组中的节点之一。
语法
CREATE ROUTING RULE rule_name ROUTE 'address_range' TO group_name
参数
-
rule_name
- 路由规则的名称。
-
``` address_range ```
- CIDR 格式的 IPv4 或 IPv6 地址范围。设置此规则适用的客户端连接的地址范围。
-
group_name
- 负载均衡组的名称,用于处理来自地址范围的客户端连接。可以使用 CREATE LOAD BALANCE GROUP 语句创建此组。
特权
超级用户。
示例
以下示例创建了一个路由规则,可将 192.168.1.0 至 192.168.1.255 范围内的所有客户端连接路由到名为 internal_clients 的负载均衡组:
=> CREATE ROUTING RULE internal_clients ROUTE '192.168.1.0/24' TO internal_clients;
CREATE ROUTING RULE
另请参阅
11.27 - CREATE SCHEMA
定义架构。
语法
CREATE SCHEMA [ IF NOT EXISTS ] [database.]schema
[ AUTHORIZATION username]
[ DEFAULT { INCLUDE | EXCLUDE } [ SCHEMA ] PRIVILEGES ]
[ DISK_QUOTA quota ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
- 数据库
- 要在其中创建架构的数据库的名称。如果指定,则必须是当前数据库。
- 架构
- 要创建的架构的名称,具有以下要求:
AUTHORIZATION
username
- 仅对超级用户有效,用于将架构的所有权分配给其他用户。默认情况下,还会为创建架构的用户分配所有权。
创建架构后,可以使用
ALTER SCHEMA
将所有权重新分配给其他用户。
DEFAULT {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES
指定是否启用或禁用指定架构中新表的默认权限继承:
如果忽略 INCLUDE PRIVILEGES
,则必须显式授予所需表的架构权限。
有关详细信息,请参阅启用架构继承。
DISK_QUOTA
配额
- 字符串,一个整数,后跟支持的单位:K、M、G 或 T。导致架构的使用率超出设置的配额的数据加载、DML 和 ILM 操作失败。有关详细信息,请参阅磁盘配额。
如果未指定,则架构没有配额。
特权
支持的子语句
CREATE SCHEMA
可以包含一个或多个子语句,例如,在新架构中创建表或投影。支持的子语句包括:
CREATE SCHEMA
语句和所有子语句均被视为单个事务。如果任何语句失败,Vertica 将回退整个事务。将为新架构的所有者分配在此事务中创建的所有对象的所有权。
例如,以下 CREATE SCHEMA
语句还将授予对新架构的权限,并创建一个表和该表的视图:
=> \c - Joan
You are now connected as user "Joan".
=> CREATE SCHEMA s1
GRANT USAGE, CREATE ON SCHEMA s1 TO public
CREATE TABLE s1.t1 (a varchar)
CREATE VIEW s1.t1v AS SELECT * FROM s1.t1;
CREATE SCHEMA
=> \dtv s1.*
List of tables
Schema | Name | Kind | Owner | Comment
--------+------+-------+-------+---------
s1 | t1 | table | Joan |
s1 | t1v | view | Joan |
(2 rows)
示例
创建架构 s1
:
=> CREATE SCHEMA s1;
如果架构 s2
尚未存在,则创建此架构:
=> CREATE SCHEMA IF NOT EXISTS s2;
如果此架构已存在,Vertica 将返回回退消息:
=> CREATE SCHEMA IF NOT EXISTS s2;
NOTICE 4214: Object "s2" already exists; nothing was done
在架构 s1
中创建表 t1
,然后授予用户 Fred
和 Aniket
对所有现有表的访问权限以及对表 t1
的所有权限:
=> CREATE TABLE s1.t1 (c INT);
CREATE TABLE
=> GRANT USAGE ON SCHEMA s1 TO Fred, Aniket;
GRANT PRIVILEGE
=> GRANT ALL PRIVILEGES ON TABLE s1.t1 TO Fred, Aniket;
GRANT PRIVILEGE
启用新架构 s3
上的继承,以便在其中创建的所有表都会自动继承其权限。在这种情况下,新表 s3.t2
将继承 USAGE、CREATE 和 SELECT 权限,这些权限会自动授予所有数据库用户:
=> CREATE SCHEMA s3 DEFAULT INCLUDE SCHEMA PRIVILEGES; CREATE SCHEMA => GRANT USAGE, CREATE, SELECT, INSERT ON SCHEMA S3 TO PUBLIC; GRANT PRIVILEGE => CREATE TABLE s3.t2(i int); WARNING 6978: 表“t2”将包括架构“s3”的 CREATE TABLE 权限
另请参阅
11.28 - CREATE SEQUENCE
定义新的命名序列号生成器对象。与 AUTO_INCREMENT 和 IDENTITY 序列一样,命名序列允许您设置主键列的默认值。序列保证了唯一性,并避免了约束强制执行问题及开销。
有关序列类型及其用法的详细信息,请参阅序列。
语法
CREATE SEQUENCE [ IF NOT EXISTS ] [[database.]schema.]sequence
[ INCREMENT [ BY ] integer ]
[ MINVALUE integer | NO MINVALUE ]
[ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] integer ]
[ CACHE integer | NO CACHE ]
[ CYCLE | NO CYCLE ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
序列
- 标识要创建的序列,其中 sequence 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
INCREMENT [BY] integer
一个正整数或负整数,指定每次调用 NEXTVAL 时序列的增减数量,默认设置为 1。
注意
将此参数设置为 integer 时,可确保列值始终至少增加 integer。但是,列值的增量有时可能会超过 integer,但如果您还设置了 NO CACHE
参数则除外。
-
MINVALUE integer | NO MINVALUE
- 确定序列可生成的最小值。如果忽略此子句或指定 NO MINVALUE(默认值),则将使用默认值:升序序列和降序序列分别为 1 和 ‑263‑1。
-
MAXVALUE integer | NO MAXVALUE
- 确定序列的最大值。如果忽略此子句或指定 NO MAXVALUE(默认值),则将使用默认值:升序序列和降序序列分别为 263‑1 和 ‑1。
-
START [WITH] integer
- 将序列起始值设置为 integer。下一次调用 NEXTVAL 时将返回 integer。如果忽略此子句,则升序序列的起始值将设置为
MINVALUE
,降序序列的起始值将设置为 MAXVALUE
。
-
CACHE integer | NO CACHE
- 指定是否在每个节点上缓存唯一的序列号,以便提高访问速度。
CACHE
需要一个整数实参,如下所示:
-
>1 指定每个节点在每个会话中缓存的唯一编号的数量。
当心
如果将序列缓存设置为较低的数字,则节点可能会更频繁地请求一组新的缓存值。提供新缓存时,Vertica 必须锁定编录。在 Vertica 释放锁之前,其他数据库活动(例如表插入)会被阻止,这将对整体性能产生不利影响。
-
0 或 1 指定禁用缓存(等同于 NO CACHE
)。
如果忽略此子句,序列缓存将设置为 250,000。
有关命名序列缓存的详细信息,请参阅分发命名序列。
CYCLE | NO CYCLE
- 指定序列是否可以在达到其最小值或最大值时回绕:
特权
非超级用户:对架构的 CREATE 权限
示例
请参阅创建和使用命名序列。
另请参阅
11.29 - CREATE SUBNET
标识 Vertica 数据库的节点所属的子网。使用此语句可配置从数据库到其他 Vertica 群集的导入/导出操作。
语法
CREATE SUBNET subnet-name WITH 'subnet‑prefix'
参数
- subnet‑name
- 您分配给子网的名称,其中 subnet‑name 符合标识符中描述的约定。
- subnet‑prefix
- 对于 IPv4 地址,子网前缀采用点分数字格式,对于 IPv6 地址,采用四个冒号分隔的四位十六进制数字。请参阅系统表
NETWORK_INTERFACES
,以获取所有可用 IP 网络的前缀。
然后配置数据库,将子网用于导入/导出。有关详细信息,请参阅识别用于导入/导出的数据库或节点。
特权
超级用户
示例
=> CREATE SUBNET mySubnet WITH '123.4.5.6';
=> CREATE SUBNET mysubnet WITH 'fd9b:1fcc:1dc4:78d3::';
11.30 - CREATE TABLE
在逻辑架构中创建一个表。
语法
使用列定义创建:
CREATE TABLE [ IF NOT EXISTS ] [[database.]schema.]table
( column-definition[,...] [, table-constraint [,...]] )
[ ORDER BY column[,...] ]
[ segmentation-spec ]
[ KSAFE [safety] ]
[ partition-clause]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
[ DISK_QUOTA quota ]
从其他表创建:
CREATE TABLE [ IF NOT EXISTS ] [[database.]schema.]table
{ AS-clause | LIKE-clause }
[ DISK_QUOTA quota ]
AS 子句:
[ ( column-name-list ) ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query [ ENCODED BY column-ref-list ] [ segmentation-spec ]
LIKE 子句:
LIKE [[database.]schema.]existing-table
[ {INCLUDING | EXCLUDING} PROJECTIONS ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
参数
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 要创建的表的名称,在架构的所有序列、表、投影、视图和模型的名称中必须是唯一的。
- column-definition
- 列名称、数据类型和可选约束。一个表最多可以有 9800 列。表中至少有一列必须是标量类型或原生数组。
- table-constraint
- 表级别约束,与列约束相反。
-
ORDER BY column[,...]
对外部表无效,指定 SELECT
列表中的列,基于该列表对为此表自动创建的超投影进行排序。ORDER BY
子句不能包含限定符 ASC
或 DESC
。Vertica 始终按升序存储投影数据。
如果省略
ORDER BY
子句,Vertica 将使用 SELECT
列表顺序作为投影排序顺序。
-
segmentation-spec
对外部表无效,指定如何为此表的自动投影分发数据。提供以下子句之一:
如果省略此子句,Vertica 将生成自动投影,并使用默认哈希分段。
-
KSAFE [safety]
对外部表无效,指定为此表创建的 自动投影的 K-safety,其中 k‑num 必须等于或大于系统 K-safety。如果您省略此选项,投影将使用系统 K-safety 水平。
- partition-clause
- 对外部表无效,通过 PARTITION BY 子句对表数据存储进行逻辑划分:
PARTITION BY partition-expression
[ GROUP BY group-expression ] [ ACTIVEPARTITIONCOUNT integer ]
- column-name-list
只有从查询 (
AS query
) 创建表时有效,定义映射到查询输出的列名称。如果忽略此列表,Vertica 将使用查询输出列名称。
该子句和 ENCODED BY
子句互斥。列名称列表对外部表无效。
column-name-list 中的名称必须与查询列的个数相同。
例如:
CREATE TABLE customer_occupations (name, profession)
AS SELECT customer_name, occupation FROM customer_dimension;
-
{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES
默认继承此表的架构权限:
有关详细信息,请参阅继承的权限。
-
AS query
根据查询结果创建并加载一个表,按如下方式指定:
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query
查询不能包含复杂类型的列。
-
ENCODED BY column-ref-list
该列表中的列来自源表且以逗号分隔,其中每列由以下一个或两个编码选项限定:
此选项和 column-name-list 是互斥的。此选项对于外部表无效。
-
LIKE existing-table
- 通过复制现有表创建表。您可以使用以下选项之一限定 LIKE 子句:
-
EXCLUDING PROJECTIONS(默认值):不要从源表中复制投影。
-
INCLUDING PROJECTIONS:从新表的源表中复制当前投影。
-
{INCLUDE|EXCLUDE} [SCHEMA] PRIVILEGES:请参阅以上描述)。
DISK_QUOTA
配额
- 字符串,一个整数,后跟支持的单位:K、M、G 或 T。导致表的使用率超出设置的配额的数据加载、DML 和 ILM 操作失败。有关详细信息,请参阅磁盘配额。
如果未指定,则表没有配额。
特权
超级用户可以设置磁盘配额。
非超级用户:
-
对表架构的 CREATE 权限
-
如果创建包含命名序列的表:
-
对于序列对象的 SELECT 权限
-
对于序列架构的 USAGE 权限
-
如果使用 LIKE 子句创建表,则为源表所有者
复杂类型的限制
原生表中使用的复杂类型除了其参考页面上列出的个别类型的限制外,还有一些限制:
-
原生表必须至少有一个基本类型或原生数组(基本类型的一维数组)的列。如果一个 Flex 表有真实的列,它也必须至少有一个满足这个限制的列。
-
复杂类型列不能在 ORDER BY 或 PARTITION BY 子句中使用,也不能用作 FILLER 列。
-
复杂类型列不能有 约束。
-
返回复杂类型的表达式不能用作投影列,并且投影不能按复杂类型的列进行分段或排序。
-
具有复杂类型列的表不能使用 DEFAULT 和 SET USING。
示例
以下示例将在公共架构中创建一个表:
CREATE TABLE public.Premium_Customer
(
ID IDENTITY ,
lname varchar(25),
fname varchar(25),
store_membership_card int
);
以下示例将使用 LIKE 从该表创建一个新表:
=> CREATE TABLE All_Customers LIKE Premium_Customer;
CREATE TABLE
以下示例将使用 AS 子句从一个表中选择要在新表中使用的列:
=> CREATE TABLE cust_basic_profile AS SELECT
customer_key, customer_gender, customer_age, marital_status, annual_income, occupation
FROM customer_dimension WHERE customer_age>18 AND customer_gender !='';
CREATE TABLE
=> SELECT customer_age, annual_income, occupation FROM cust_basic_profile
WHERE customer_age > 23 ORDER BY customer_age;
customer_age | annual_income | occupation
--------------+---------------+--------------------
24 | 469210 | Hairdresser
24 | 140833 | Butler
24 | 558867 | Lumberjack
24 | 529117 | Mechanic
24 | 322062 | Acrobat
24 | 213734 | Writer
...
以下示例将使用数组列创建一个表:
=> CREATE TABLE orders(
orderkey INT,
custkey INT,
prodkey ARRAY[VARCHAR(10)],
orderprices ARRAY[DECIMAL(12,2)],
orderdate DATE
);
以下示例使用 ROW 复杂类型:
=> CREATE TABLE inventory
(store INT, products ROW(name VARCHAR, code VARCHAR));
以下示例使用配额:
=> CREATE SCHEMA internal DISK_QUOTA '10T';
CREATE SCHEMA
=> CREATE TABLE internal.sales (...) DISK_QUOTA '5T';
CREATE TABLE
=> CREATE TABLE internal.leads (...) DISK_QUOTA '12T';
WARNING 0: Table leads has disk quota greater than its schema internal
另请参阅
11.30.1 - Column-definition
指定将应用于某一列的名称、数据类型和约束。
语法
column-name data-type
[ column‑constraint ][...]
[ ENCODING encoding-type ]
[ ACCESSRANK integer ]
参数
-
column-name
- 要创建或添加的列的名称。
-
data-type
- Vertica 支持的数据类型。
提示
在 CREATE TABLE 语句中指定最大列宽时,请对任何字符串类型使用以字节(八位字节)为单位的宽度。每个 UTF-8 字符可能需要 4 个字节,但欧洲语言的每个字符一般需要多于一个字节,而东方语言的每个字符一般需要少于三个字节。
-
column‑constraint
- Vertica 支持的约束类型,例如,NOT NULL 或 UNIQUE。有关常规信息,请参阅 约束。
-
ENCODING encoding-type
列编码类型,默认设置为 AUTO。
-
ACCESSRANK {{< codevar >}}integer{{< /codevar >}}
覆盖列的默认访问等级。使用此参数可提高或降低 Vertica 访问列的速度。有关详细信息,请参阅覆盖默认的列等级。
示例
以下示例在 Employee_Dimension
架构中创建了一个名为 public
的表,及其相关联的超投影。Employee_key
列被指定为主键,并为 Employee_gender
列定义指定了 RLE 编码。
=> CREATE TABLE public.Employee_Dimension (
Employee_key integer PRIMARY KEY NOT NULL,
Employee_gender varchar(8) ENCODING RLE,
Courtesy_title varchar(8),
Employee_first_name varchar(64),
Employee_middle_initial varchar(8),
Employee_last_name varchar(64)
);
11.30.2 - Column-name-list
用于在通过查询创建表或临时表时重命名列;还可用于指定列的编码类型和
访问等级。
语法
column-name-list
[ ENCODING encoding‑type ]
[ ACCESSRANK integer ]
[ GROUPED ( column‑reference[,...] ) ]
参数
- column‑name
- 为列指定新名称。
ENCODING
encoding‑type
- 指定要在列上使用的编码的类型。默认编码类型为“AUTO”。
-
ACCESSRANK integer
- 覆盖列的默认访问等级,对于确定列访问的优先级很有用。请参阅确定列访问速度的优先级。
GROUPED
- 将两个或多个列分组。有关详细信息,请参阅 GROUPED 子句。
要求
-
列表中的列不能指定该列的数据类型或任何约束。这些是从已查询表中派生的。
-
如果查询输出包含表达式简单列以外的表达式(例如,常数或函数),则必须为该表达式指定别名,或者列名称列表中必须包括所有已查询列。
-
CREATE TABLE 可以在列名称列表或查询的 ENCODED BY 子句之一中指定编码类型和访问等级,但不能同时在两者中指定。例如,以下 CREATE TABLE 语句将在列名称列表中的两列上设置编码和访问等级:
=> CREATE TABLE promo1 (state ENCODING RLE ACCESSRANK 1, zip ENCODING RLE,...)
AS SELECT * FROM customer_dimension ORDER BY customer_state;
下一个语句在查询的 ENCODED BY 子句中指定相同的编码和访问等级。
=> CREATE TABLE promo2
AS SELECT * FROM customer_dimension ORDER BY customer_state
ENCODED BY customer_state ENCODING RLE ACCESSRANK 1, customer_zip ENCODING RLE;
11.30.3 - Column-constraint
为某一列的元数据添加约束。有关详细信息,请参阅约束。
语法
[ { AUTO_INCREMENT | IDENTITY } [ (args) ] ]
[ CONSTRAINT constraint‑name ] {
[ CHECK (expression) [ ENABLED | DISABLED ] ]
[ [ DEFAULT expression ] [ SET USING expression } | DEFAULT USING expression ]
[ NULL | NOT NULL ]
[ { PRIMARY KEY [ ENABLED | DISABLED ] REFERENCES table [( column )] } ]
[ UNIQUE [ ENABLED | DISABLED ] ]
}
参数
注意
您可以通过使用关键字
ENABLED
或
DISABLED
进行限定来指定强制执行某些约束。请参阅下面的
强制执行约束。
AUTO_INCREMENT | IDENTITY
- 创建一个表列,其值将由数据库自动生成和管理。不能更改或加载此列中的值。只能在一个表列上设置此约束。
AUTO_INCREMENT
和 IDENTITY
是同义词。有关此约束和可选实参的详细信息,请参阅 AUTO_INCREMENT 和 IDENTITY 序列。
这些选项对临时表无效。
-
CONSTRAINT constraint‑name
- 为约束分配名称,对以下约束有效:
-
PRIMARY KEY
-
REFERENCES
(外键)
-
CHECK
-
UNIQUE
如果忘记为这些约束分配名称,Vertica 会分配其自己的名称。有关详细信息,请参阅对约束进行命名。
Vertica 建议对所有约束进行命名。
-
CHECK (expression)
- 添加检查条件 expression,该条件将返回布尔值。
DEFAULT
- 指定此列的默认值:
DEFAULT default‑expr
如果操作忽略了此列中的值,Vertica 将评估 DEFAULT
表达式并在加载操作时设置此列。有关有效表达式的详细信息,请参阅定义列值。
SET USING
- 指定通过指定的表达式设置此列中的值:
SET USING using‑expr
仅当调用了函数
REFRESH_COLUMNS
时,Vertica 才会评估 SET USING
表达式并刷新列值。有关有效表达式的详细信息,请参阅定义列值。
DEFAULT USING
- 定义具有
DEFAULT
和 SET USING
约束的列,为两者指定相同的表达式。 DEFAULT USING
列支持的表达式与 SET USING
列相同,并遵从相同的限制。
NULL | NOT NULL
- 指定列是否可以包含 null 值:
如果忽略此约束,则除主键列之外的所有列的默认值将为 NULL
,Vertica 始终将其设置为 NOT NULL
。
外部表: 如果指定 NOT NULL
且列包含 null 值,则查询可能会返回错误或产生异常行为。仅当您确定列不包含 null 值时,再为外部表列指定 NOT NULL
。
PRIMARY KEY
- 将此列标识为表的主键。
REFERENCES
- 将此列标识为外键:
REFERENCES table [column]
其中 column 是 table 中的主键。如果省略了 column,Vertica 将引用 table 中的主键。
UNIQUE
- 要求列数据对于所有表行都是唯一的。
特权
表所有者或用户 WITH GRANT OPTION 是授予者。
强制执行约束
可以使用关键字 ENABLED
或 DISABLED
限定以下约束:
如果省略了 ENABLED
或 DISABLED
,Vertica 会通过检查相应的配置参数来确定是否自动启用约束:
-
EnableNewPrimaryKeysByDefault
-
EnableNewUniqueKeysByDefault
-
EnableNewCheckConstraintsByDefault
有关详细信息,请参阅约束强制执行。
11.30.4 - 分区子句
通过表定义中的 PARTITION BY 子句指定表数据的分区:
PARTITION BY partition‑expression [ GROUP BY group‑expression ] [ active‑partition‑count‑expr ]
-
PARTITION BY partition‑expression
- 对于每个表行,解析为从一个或多个表列派生的分区键。
当心
避免对 LONG VARBINARY 和 LONG VARCHAR 列上的表进行分区。这样做会对性能产生不利影响。
-
GROUP BY group‑expression
- 对于每个表行,解析为从分区键派生的分区组键。Vertica 使用组键将分区合并到单独的分区组中。GROUP BY 必须使用与 PARTITION BY 相同的表达式。例如:
...PARTITION BY (i+j) GROUP BY (
CASE WHEN (i+j) < 5 THEN 1
WHEN (i+j) < 10 THEN 2
ELSE 3);
有关按组对表数据进行分区的详细信息,请参阅分区分组和分层分区。
- active‑partition‑count‑expr
- 指定此表的活动分区数量,具体如下:
此设置将取代配置参数 ActivePartitionCount。有关用法的详细信息,请参阅活动和非活动分区。
分区要求和限制
PARTITION BY 表达式可以指定叶表达式、函数和运算符。以下要求和限制适用:
- 所有的表投影必须包含表达式引用的所有列;否则 Vertica 将无法解析表达式。
- 表达式可以引用多个列,但是它必须在每一行解析为一个非 null 值。
注意
可以使用函数
ZEROIFNULL 来避免出现 null 相关错误。此函数可以检查 PARTITION BY 表达式中的 null 值并将其评估为 0。例如:
CREATE TABLE t1 (a int, b int) PARTITION BY (ZEROIFNULL(a)); CREATE TABLE
- 所有叶表达式都必须为常数或表列。
- 所有其他表达式必须为函数和运算符。以下限制适用于函数: * 必须为
不可变,即在不同时间和区域设置以及其他会话 - 或特定环境条件下返回相同的值。 * 不可以为聚合函数。 * 不可以为 Vertica 元函数。
- 表达式不可以包含查询。
- 表达式不可以包含用户定义的数据类型,如 Geometry。
GROUP BY 表达式不支持 modulo (%) 运算。
示例
以下语句创建 store_orders
表并将数据加载到其中。CREATE TABLE 语句包含一个简单的分区子句,指定按年份对数据进行分区:
=> CREATE TABLE public.store_orders
(
order_no int,
order_date timestamp NOT NULL,
shipper varchar(20),
ship_date date
)
UNSEGMENTED ALL NODES
PARTITION BY YEAR(order_date);
CREATE TABLE
=> COPY store_orders FROM '/home/dbadmin/export_store_orders_data.txt';
41834
当 COPY 将新表数据加载到 ROS 存储中时,Tuple Mover 会将每年的订单划分为单独的分区,且将这些分区合并到 ROS 容器中,以执行表的分区子句。
在这种情况下,Tuple Mover 为加载的数据创建四个分区键(2017、2016、2015 和 2014),并将数据相应划分到单独的 ROS 容器中:
=> SELECT dump_table_partition_keys('store_orders');
... Partition keys on node v_vmart_node0001
Projection 'store_orders_super'
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017
Storage [ROS container]
No of partition keys: 1
Partition keys: 2016
Storage [ROS container]
No of partition keys: 1
Partition keys: 2015
Storage [ROS container]
No of partition keys: 1
Partition keys: 2014
Partition keys on node v_vmart_node0002
Projection 'store_orders_super'
Storage [ROS container]
No of partition keys: 1
Partition keys: 2017
...
(1 row)
当新数据加载到 store_orders
中时,Tuple Mover 会将其合并到适当的分区中,以此根据需要创建新的分区键。
另请参阅
分区表
11.30.5 - Table-constraint
为表元数据添加约束。您可以使用
CREATE TABLE
指定表约束,或使用
ALTER TABLE
将约束添加到现有表。有关详细信息,请参阅设置约束。
注意
向视图中所引用的表添加约束不会对视图产生影响。
语法
[ CONSTRAINT constraint-name ]
{
... PRIMARY KEY (column[,... ]) [ ENABLED | DISABLED ]
... | FOREIGN KEY (column[,... ] ) REFERENCES table [ (column[,...]) ]
... | UNIQUE (column[,...]) [ ENABLED | DISABLED ]
... | CHECK (expression) [ ENABLED | DISABLED ]
}
参数
-
CONSTRAINT constraint‑name
- 为约束分配名称。Vertica 建议对所有约束进行命名。
PRIMARY KEY
- 定义一个或多个
NOT NULL
列作为主键,如下所示:
PRIMARY KEY (column[,...]) [ ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名主键约束,Vertica 会分配名称 C_PRIMARY
。
FOREIGN KEY
- 添加引用完整性约束,以将一个或多个列定义为外键,如下所示:
FOREIGN KEY (column[,... ]) REFERENCES table [(column[,... ])]
如果省略了 column,Vertica 将引用 table 中的主键。
如果您没有命名外键约束,Vertica 会分配名称 C_FOREIGN
。
重要
添加外键约束需要以下权限(除了 ALTER TABLE 也需要的权限外):
-
对引用表的 REFERENCES 权限
-
对引用表架构的 USAGE 权限
UNIQUE
- 指定一个列或一组列中的数据对于所有表行都是唯一的,如下所示:
UNIQUE (column[,...]) [ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名唯一约束,Vertica 会分配名称 C_UNIQUE
。
CHECK
- 指定检查条件,即一个返回布尔值的表达式,如下所示:
CHECK (expression) [ENABLED | DISABLED]
可以使用关键字 ENABLED
或 DISABLED
来限定此子句。请参阅下面的强制执行约束。
如果您没有命名检查约束,Vertica 会分配名称 C_CHECK
。
权限
非超级用户:表所有者,或以下权限:
强制执行约束
表可以使用关键字 ENABLED
或 DISABLED
指定 Vertica 是否自动强制执行主键、唯一键或检查约束。如果省略了 ENABLED
或 DISABLED
,Vertica 会通过检查相应的配置参数来确定是否自动启用约束:
-
EnableNewPrimaryKeysByDefault
-
EnableNewUniqueKeysByDefault
-
EnableNewCheckConstraintsByDefault
有关详细信息,请参阅约束强制执行。
示例
以下示例将使用主键约束创建一个表 (t01
)。
CREATE TABLE t01 (id int CONSTRAINT sampleconstraint PRIMARY KEY);
CREATE TABLE
此示例没有使用约束创建相同表,然后添加约束 ALTER TABLE ADD CONSTRAINT
CREATE TABLE t01 (id int);
CREATE TABLE
ALTER TABLE t01 ADD CONSTRAINT sampleconstraint PRIMARY KEY(id);
WARNING 2623: Column "id" definition changed to NOT NULL
ALTER TABLE
以下示例创建一个包含两列的表 (addapk
),向表中添加第三列,然后在第三列上添加主键约束。
=> CREATE TABLE addapk (col1 INT, col2 INT);
CREATE TABLE
=> ALTER TABLE addapk ADD COLUMN col3 INT;
ALTER TABLE
=> ALTER TABLE addapk ADD CONSTRAINT col3constraint PRIMARY KEY (col3) ENABLED;
WARNING 2623: Column "col3" definition changed to NOT NULL
ALTER TABLE
使用示例表 addapk
,检查是否启用了主键约束(is_enabled
为 t
)。
=> SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_name IN ('addapk');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
col3constraint | col3 | p | t
(1 row)
此示例使用 ALTER TABLE ALTER CONSTRAINT
禁用约束。
=> ALTER TABLE addapk ALTER CONSTRAINT col3constraint DISABLED;
检查主键现在是否已禁用(is_enabled
为 f
)。
=> SELECT constraint_name, column_name, constraint_type, is_enabled FROM PRIMARY_KEYS WHERE table_name IN ('addapk');
constraint_name | column_name | constraint_type | is_enabled
-----------------+-------------+-----------------+------------
col3constraint | col3 | p | f
(1 row)
有关约束的一般讨论,请参阅约束。有关创建和命名约束的其他示例,请参阅对约束进行命名。
11.31 - CREATE TEMPORARY TABLE
创建数据仅存在于当前会话中的表。默认情况下,临时表数据对其他会话不可见。
语法
使用列定义创建:
CREATE [ scope ] TEMP[ORARY] TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name
( column-definition[,...] )
[ table-constraint ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ NO PROJECTION ]
[ ORDER BY table-column[,...] ]
[ segmentation-spec ]
[ KSAFE [safety-level] ]
[ {INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES ]
[ DISK_QUOTA quota ]
从其他表创建:
CREATE TEMP[ORARY] TABLE [ IF NOT EXISTS ] [[database.]schema.]table-name
[ ( column-name-list ) ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query [ ENCODED BY column-ref-list ]
[ DISK_QUOTA quota ]
参数
- scope
- 表定义的可见性:
如果未指定范围,Vertica 将使用通过 DefaultTempTableLocal 配置参数设置的默认值。
不论此设置如何,都可通过 ON COMMIT DELETE 和 ON COMMIT PRESERVE 关键字(见下文)设置临时表数据的保留策略。
有关详细信息,请参阅创建临时表。
IF NOT EXISTS
如果存在同名对象,请不要创建它并继续。如果忽略此选项且对象存在,Vertica 将生成 ROLLBACK 错误消息。在上述两种情况下,如果对象已经存在,则不会创建它。
IF NOT EXISTS
子句适用于以下 SQL 脚本:可在某个对象不存在时创建该对象。
请参阅 ON_ERROR_STOP 了解相关信息。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
如果未指定架构,系统将在默认架构中创建表。
-
table-name
- 要创建的表的名称,其中 table-name 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
-
column-definition
- 列名称和类型。一个表最多可以有 9800 列。
-
table-constraint
- 为表元数据添加约束。
ON COMMIT
- 数据为事务范围还是会话范围数据:
ON COMMIT {PRESERVE | DELETE} ROWS
NO PROJECTION
- 防止 Vertica 为此表创建自动投影。仅当数据显式加载到此表中时才会创建超投影。
NO PROJECTION 对以下子句无效:
{INCLUDE | EXCLUDE} [SCHEMA] PRIVILEGES
默认继承此表的架构权限:
有关详细信息,请参阅继承的权限。
-
ORDER BY table-column[,...]
对外部表无效,指定 SELECT
列表中的列,基于该列表对为此表自动创建的超投影进行排序。ORDER BY
子句不能包含限定符 ASC
或 DESC
。Vertica 始终按升序存储投影数据。
如果省略
ORDER BY
子句,Vertica 将使用 SELECT
列表顺序作为投影排序顺序。
- segmentation-spec
对外部表无效,指定如何为此表的自动投影分发数据。提供以下子句之一:
如果省略此子句,Vertica 将生成自动投影,并使用默认哈希分段。
-
KSAFE [safety-level]
对外部表无效,指定为此表创建的 自动投影的 K-safety,其中 k‑num 必须等于或大于系统 K-safety。如果您省略此选项,投影将使用系统 K-safety 水平。
Eon 模式: 无论系统 K-safety 如何,临时表的 K-safety 始终设置为 0。如果 CREATE TEMPORARY TABLE
语句将 k‑num 设置为大于 0,Vertica 会返回警告。
- column-name-list
只有从查询 (
AS query
) 创建表时有效,定义映射到查询输出的列名称。如果忽略此列表,Vertica 将使用查询输出列名称。
该子句和 ENCODED BY
子句互斥。列名称列表对外部表无效。
column-name-list 中的名称必须与查询列的个数相同。
例如:
CREATE TEMP TABLE customer_occupations (name, profession)
AS SELECT customer_name, occupation FROM customer_dimension;
-
AS query
根据查询结果创建并加载一个表,按如下方式指定:
AS [ /*+ LABEL */ ] [ AT {{< codevar >}}epoch{{< /codevar >}} ] query
查询不能包含复杂类型的列。
ENCODED BY
column-ref-list
该列表中的列来自源表且以逗号分隔,其中每列由以下一个或两个编码选项限定:
此选项和 column-name-list 是互斥的。此选项对于外部表无效。
DISK_QUOTA
配额
- 字符串,一个整数,后跟支持的单位:K、M、G 或 T。如果架构设置了配额,则此值必须小于架构配额。导致表的使用率超出设置配额的数据加载和 ILM 操作失败。有关详细信息,请参阅磁盘配额。
如果未指定,则表没有配额。
磁盘配额对全局临时表有效,对本地临时表无效。
特权
必须具有以下权限:
-
对表架构的 CREATE 权限
-
如果创建包含命名序列的临时表:
-
对于序列对象的 SELECT 权限
-
对于序列架构的 USAGE 权限
限制
-
对临时表的查询与对持久表的查询面临相同的 SQL 支持限制。
-
不可以将投影添加到非空的全局临时表 (ON COMMIT PRESERVE ROWS)。请确保投影在加载数据之前已存在。请参阅自动投影。
-
尽管可以为定义时指定了 ON COMMIT DELETE ROWS 的临时表添加投影,但需要注意的是,您可能会丢失所有数据。
-
无法对会话范围临时数据执行合并操作。
-
一般来说,使用系统(虚拟)表时,会话范围临时表数据不可见。
-
临时表不会恢复。如果某个节点发生故障,使用临时表的查询也会失败。重新启动会话并填充临时表。
-
本地临时表不能设置磁盘配额。
示例
请参阅创建临时表。
另请参阅
11.32 - CREATE TEXT INDEX
创建用于执行文本搜索的文本索引。如果表中的数据已分区,则文本索引中会显示一个额外的列用于显示分区。
语法
CREATE TEXT INDEX [[database.]schema.]txtindex-name
ON [schema.]source-table (unique-id, text-field [, column-name,...])
[STEMMER {stemmer-name(stemmer-input-data-type)| NONE}]
[TOKENIZER tokenizer-name(tokenizer-input-data-type)];
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
如果未指定架构,系统将在默认架构中创建表。
-
txtindex‑name
- 文本索引名称。
-
source‑table
- 要索引的源表。
-
unique‑id
- 源表中包含唯一标识符的列的名称。允许任何数据类型。该列必须是源表中的主键。
-
text‑field
- 源表中包含文本字段的列的名称。有效的数据类型为:
-
CHAR
-
VARCHAR
-
LONG VARCHAR
-
VARBINARY
-
LONG VARBINARY
允许 null 值。
-
column‑name
- 要作为附加列包含的一列或多列的名称。
-
stemmer‑name
- 词干分析器的名称。
-
stemmer‑input‑data‑type
- stemmer-name 函数的输入数据类型。
-
tokenizer‑name
- 指定分词器的名称。
-
tokenizer‑input‑data‑type
- 此值为 tokenizer-name 函数的输入数据类型。可以接受任意数量的实参。
如果使用了 Vertica 分词器,则可以省略此参数。
特权
索引可自动继承其父表的查询权限。将允许表所有者和 dbadmin 创建和/或修改索引。
重要
请勿更改文本索引的内容或定义。如果更改了文本索引的内容或定义,则结果将不能与源表适当地匹配。
要求
示例
以下示例显示如何使用 CREATE TEXT INDEX 语句在表 t_log 上创建附加有未索引列的文本索引:
=> CREATE TEXT INDEX t_log_index ON t_log (id, text, day_of_week);
CREATE INDEX
=> SELECT * FROM t_log_index;
token | doc_id | day_of_week
-----------------------+--------+-------------
'catalog | 1 | Monday
'dbadmin' | 2 | Monday
2014-06-04 | 1 | Monday
2014-06-04 | 2 | Monday
2014-06-04 | 3 | Monday
2014-06-04 | 4 | Monday
2014-06-04 | 5 | Monday
2014-06-04 | 6 | Monday
2014-06-04 | 7 | Monday
2014-06-04 | 8 | Monday
45035996273704966 | 3 | Tuesday
45035996273704968 | 4 | Tuesday
<INFO> | 1 | Tuesday
<INFO> | 6 | Tuesday
<INFO> | 7 | Tuesday
<INFO> | 8 | Tuesday
<WARNING> | 2 | Tuesday
<WARNING> | 3 | Tuesday
<WARNING> | 4 | Tuesday
<WARNING> | 5 | Tuesday
...
(97 rows)
以下示例显示了从已分区的源表创建的文本索引 tpart_index:
=> SELECT * FROM tpart_index;
token | doc_id | partition
------------------------+--------+-----------
0 | 4 | 2014
0 | 5 | 2014
11:00:49.568 | 4 | 2014
11:00:49.568 | 5 | 2014
11:00:49.569 | 6 | 2014
<INFO> | 6 | 2014
<WARNING> | 4 | 2014
<WARNING> | 5 | 2014
Database | 6 | 2014
Execute: | 6 | 2014
Object | 4 | 2014
Object | 5 | 2014
[Catalog] | 4 | 2014
[Catalog] | 5 | 2014
'catalog | 1 | 2013
'dbadmin' | 2 | 2013
0 | 3 | 2013
11:00:49.568 | 1 | 2013
11:00:49.568 | 2 | 2013
11:00:49.568 | 3 | 2013
11:00:49.570 | 7 | 2013
11:00:49.571 | 8 | 2013
45035996273704966 | 3 | 2013
...
(89 rows)
另请参阅
11.33 - CREATE TLS CONFIGURATION
创建 TLS CONFIGURATION 对象。有关现有 TLS CONFIGURATION 对象的信息,请查询 TLS_CONFIGURATIONS。
要修改现有的 TLS CONFIGURATION 对象,请参阅 ALTER TLS CONFIGURATION。
语法
CREATE TLS CONFIGURATION tls_config_name {
[ CERTIFICATE { NULL | cert_name } ]
[ CA CERTIFICATES ca_cert_name [,...] ]
[ CIPHER SUITES { '' | 'openssl_cipher [,...]' } ]
[ TLSMODE 'tlsmode' ]
}
参数
-
tls_config_name
- TLS CONFIGURATION 对象的名称。
-
cert_name
- 使用 CREATE CERTIFICATE 创建的证书。
-
ca_cert_name
- 使用 CREATE CERTIFICATE 创建的 CA 证书。
-
openssl_cipher
- 要使用的密码套件的逗号分隔列表,而不是默认的密码套件集。为该参数提供空字符串会清除备用密码套件列表,并指示指定的 TLS CONFIGURATION 使用默认密码套件集。
要查看启用的密码套件,请使用 LIST_ENABLED_CIPHERS。
- tlsmode
- Vertica 如何建立 TLS 连接以及处理客户端证书(为以下几项之一,按安全性升序排列):
-
DISABLE
:禁用 TLS。此参数的所有其他选项都启用 TLS。
-
ENABLE
:启用 TLS。Vertica 不检查客户端证书。
-
TRY_VERIFY
:如果出现以下任一情况,则建立 TLS 连接:
如果其他主机提供无效证书,则连接将使用纯文本。
-
VERIFY_CA
:如果 Vertica 验证其他主机的证书来自受信任的 CA,则连接成功。如果其他主机不提供证书,则连接使用纯文本。
-
VERIFY_FULL
:如果 Vertica 验证其他主机的证书来自受信任的 CA,并且证书的 cn
(通用名称)或 subjectAltName
属性与其他主机的主机名或 IP 地址匹配,则连接成功。
请注意,对于客户端证书,cn
将用于用户名,因此 subjectAltName
必须与其他主机的主机名或 IP 地址匹配。
VERIFY_FULL
不受客户端-服务器 TLS(server
TLS CONFIGURATION 上下文)支持,且行为与 VERIFY_CA
相同。
11.34 - CREATE USER
将名称添加到授权数据库用户列表。
语法
CREATE USER user‑name [ account‑parameter value[,...] ]
参数
- user‑name
- 新用户的名称,其中 user‑name 符合标识符中描述的约定。
-
account‑parameter value
- 一个或多个用户帐户参数设置(见下文)。
用户帐户参数
将一个或多个用户帐户参数指定为逗号分隔的列表:
account‑parameter setting[,...]
特权
超级用户
用户名称最佳实践
Vertica 数据库用户名称在逻辑上独立于服务器运行的操作系统的用户名称。如果特定服务器中所有用户也具有服务器计算机的帐户,则有必要分配与操作系统用户名称匹配的数据库用户名称。但是,接受远程连接的服务器可能拥有许多没有本地操作系统帐户的数据库用户。在这种情况下,无需连接数据库和系统用户名称。
示例
=> CREATE USER Fred IDENTIFIED BY 'Mxyzptlk';
=> GRANT USAGE ON SCHEMA PUBLIC to Fred;
另请参阅
11.35 - CREATE VIEW
定义
视图。视图是只读内容,所以不支持插入、更新、删除或复制操作。
语法
CREATE [ OR REPLACE ] VIEW [[database.]schema.]view [ (column[,...]) ]
[ {INCLUDE|EXCLUDE} [SCHEMA] PRIVILEGES ] AS query
参数
OR REPLACE
- 指定覆盖现有视图 view-name。如果您省略此选项并且 view-name 已经存在,则
CREATE VIEW
返回错误。
在执行 CREATE OR REPLACE 之前分配给视图的任何权限都保留在更新后的视图上。请参阅GRANT(视图)。
-
[database]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 视图
- 标识要创建的视图,其中 view 符合标识符中描述的约定。 同一架构中的序列、表、投影、视图和模型中也必须是唯一的。
- 列
[,...]
- 由最多 9800 个用作视图列名称的名称组成的列表。Vertica 按照各自列表的顺序将视图列名称映射到查询列。默认情况下,视图使用在查询中指定的列名称。
- query
- 临时视图执行的
SELECT
语句。SELECT
语句可以引用表、临时表以及其他视图。
{INCLUDE|EXCLUDE}[SCHEMA] PRIVILEGES
- 指定此视图是否继承架构权限:
有关详细信息,请参阅继承的权限。
特权
请参阅创建视图。
示例
以下示例显示了如何创建包含来自多个表的数据的视图。
=> CREATE VIEW temp_t0 AS SELECT * from t0_p1 UNION ALL
SELECT * from t0_p2 UNION ALL
SELECT * from t0_p3 UNION ALL
SELECT * from t0_p4 UNION ALL
SELECT * from t0_p5;
另请参阅
12 - DEACTIVATE DIRECTED QUERY
停用一个或多个先前由 ACTIVATE DIRECTED QUERY 激活的定向查询。
语法
DEACTIVATE DIRECTED QUERY { query-name | input-query }
参数
-
query‑name
- 识别要停用的定向查询。若要获取定向查询的标识符,请使用 GET DIRECTED QUERY 或查询系统表 DIRECTED_QUERIES。
-
input‑query
- 要停用的定向查询的输入查询。使用此实参可停用映射到同一输入查询的多个定向查询。
特权
超级用户
13 - DELETE
从表中移除指定的行并返回已删除的行的计数。0 的计数并非错误,而是表示没有任何一行符合条件。未限定的 DELETE 语句(省略 WHERE 子句的语句)会移除所有行但留下完整的表列、投影和约束。
DELETE 支持子查询和联接,这样您可以基于其他表中的值删除某个表中的值。
重要
Vertica 的 DELETE 实现不同于传统数据库:它不会从磁盘存储中删除数据,而是将行标记为已删除,以便它们可用于历史查询。删除的数据仍保留在磁盘上,并计入磁盘配额,直到其被清除。
语法
DELETE [ /*+LABEL (label‑string)*/ ] FROM [[database.]schema.]table [ where-clause ]
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 包括临时表格在内的任何表格。
- where‑clause
- 要标记删除的行。如果省略此子句,DELETE 操作将根据永久和临时表而有所差异。有关详细信息,请参阅下文。
特权
表所有者或用户 WITH GRANT OPTION 是授予者。
限制
无法对不可变表执行 DELETE 操作。
Vertica 采用 SQL-92 事务模型,因此连续的 INSERT、UPDATE 和 DELETE 语句包含在同一个事务中。您无需显式启动此事务,但必须使用 COMMIT 显式结束它,或者使用 COPY 隐式结束它。否则,Vertica 将放弃在该事务中所做的所有更改。
持久表和临时表
从持久表中删除数据时,DELETE 会直接从 ROS 中移除数据。
对临时表执行的 DELETE 操作会有所不同,具体取决于表是通过 ON COMMIT DELETE ROWS(默认)还是 ON COMMIT PRESERVE ROWS 创建的:
-
如果 DELETE 包含用于指定待移除行的 WHERE 子句,则操作是相同的:DELETE 标记待删除的行。在这两种情况下,您都无法回退到更早的保存点。
-
如果 DELETE 省略 WHERE 子句,且该表通过 ON COMMIT PRESERVE ROWS 创建,Vertica 会标记所有待删除的表行。如果表是通过 ON COMMIT DELETE ROWS 创建的,DELETE 操作和 TRUNCATE TABLE 一样,会从存储空间中移除所有行。
注意
如果您对通过 ON COMMIT DELETE ROWS 创建的临时表发出未限定的 DELETE 语句,Vertica 将从存储空间中移除所有行但不会结束事务。
示例
以下语句将从临时表中移除所有行:
=> DELETE FROM temp1;
以下语句将从满足条件的架构限定表中删除所有记录:
=> DELETE FROM retail.customer WHERE state IN ('MA', 'NH');
有关显示如何在 DELETE 语句中嵌套子查询的示例,请参阅 UPDATE 和 DELETE 中的子查询。
另请参阅
14 - DISCONNECT
关闭与在同一会话中使用
CONNECT TO VERTICA
打开的另一个 Vertica 数据库的连接。
注意
关闭会话时,数据库连接也会关闭。但是,比较好的做法是显式关闭与其他数据库的连接,从而释放资源并防止可能在会话中运行的其他 SQL 脚本出现问题。如果您在同一个会话中运行脚本并且该会话尝试打开与同一个数据库的连接,请始终关闭连接以防止出现潜在错误,因为每个会话一次只能拥有一个与给定数据库之间的连接。
语法
DISCONNECT db‑spec
参数
-
db‑spec
- 指定目标数据库,数据库名称或
DEFAULT
。
特权
无
示例
=> DISCONNECT DEFAULT;
DISCONNECT
15 - DO
执行匿名(未命名)存储过程,但不保存。
语法
DO [ LANGUAGE 'language-name' ] $$
source
$$;
参数
- language-name
- 指定过程 source 的语言,为以下之一(两个选项均涉及 PLvSQL;PLpgSQL 包括在内以保持与现有脚本的兼容性):
默认值: PLvSQL
- 源
- 过程的源代码。
特权
无
示例
有关更复杂的示例,请参阅 存储过程:用例和示例
此过程将打印 DECLARE 块中的变量:
DO LANGUAGE PLvSQL $$
DECLARE
x int := 3;
y varchar := 'some string';
BEGIN
RAISE NOTICE 'x = %', x;
RAISE NOTICE 'y = %', y;
END;
$$;
NOTICE 2005: x = 3
NOTICE 2005: y = some string
有关 RAISE NOTICE 的详细信息,请参阅错误和诊断。
另请参阅
16 - DROP 语句
DROP 语句可用于删除数据库对象,例如架构、表和用户。
16.1 - DROP ACCESS POLICY
从列或行中删除访问策略。
语法
DROP ACCESS POLICY ON table FOR { COLUMN column | ROWS}
参数
- 表
- 包含要移除的列访问策略的表的名称
- 列
- 包含要移除的访问策略的列的名称
特权
非超级用户:表的所有权
示例
以下这些示例展示了能够删除访问策略的各种情况。
删除列访问策略:
=> DROP ACCESS POLICY ON customer FOR COLUMN Customer_Number;
删除表的行访问策略:
=> DROP ACCESS POLICY ON customer_info FOR ROWS;
16.2 - DROP AGGREGATE FUNCTION
从 Vertica 编录中删除用户定义的聚合函数 (UDAnF)。
语法
DROP AGGREGATE FUNCTION [ IF EXISTS ] [[database.]schema.]function( [ arglist ] )
参数
IF EXISTS
- 指定当要删除的函数不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function
- 指定要删除的 SQL 函数的名称。如果函数名称是架构限定的名称,会将函数从指定的架构中删除(如上所述)。
- arglist
- 传递给函数的实参名称和数据类型的逗号分隔列表,格式如下:
{ [argname] argtype }[,...]
特权
非超级用户:所有者
要求
示例
以下命令将删除 ag_avg
函数:
=> DROP AGGREGATE FUNCTION ag_avg(numeric);
DROP AGGREGATE FUNCTION
另请参阅
聚合函数 (UDAF)
16.3 - DROP ANALYTIC FUNCTION
从 Vertica 编录中删除用户定义的分析函数。
语法
DROP ANALYTIC FUNCTION [ IF EXISTS ] [[database.]schema.]function( [ arglist ] )
参数
IF EXISTS
- 指定当要删除的函数不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function
- 指定要删除的 SQL 函数的名称。如果函数名称是架构限定的名称,会将函数从指定的架构中删除(如上所述)。
- arglist
- 传递给函数的实参名称和数据类型的逗号分隔列表,格式如下:
{ [argname] argtype }[,...]
特权
非超级用户:所有者
要求
示例
以下命令将删除 analytic_avg
函数:
=> DROP ANALYTIC FUNCTION analytic_avg(numeric);
DROP ANALYTIC FUNCTION
另请参阅
分析函数 (UDAnF)
16.4 - DROP AUTHENTICATION
删除身份验证方法。
语法
DROP AUTHENTICATION [ IF EXISTS ] auth‑method‑name [ CASCADE ]
参数
IF EXISTS
- 指定当要删除的身份验证方法不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- auth‑method‑name
- 要删除的身份验证方法的名称。
CASCADE
- 如果要删除的身份验证方法已授予用户,则此项为必填。在这种情况下,忽略此选项会导致删除操作失败。
特权
超级用户
示例
删除身份验证方法 md5_auth
:
=> DROP AUTHENTICATION md5_auth;
使用 CASCADE
删除已授予用户的身份验证方法:
=> CREATE AUTHENTICATION localpwd METHOD 'password' LOCAL;
=> GRANT AUTHENTICATION localpwd TO jsmith;
=> DROP AUTHENTICATION localpwd CASCADE;
另请参阅
16.5 - DROP CA BUNDLE
删除证书颁发机构 (CA) 捆绑包。
语法
DROP CA BUNDLE [ IF EXISTS ] name [,...] [ CASCADE ]
参数
IF EXISTS
- 当要删除的 CA 捆绑包不存在时,Vertica 不会报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
name
- CA 捆绑包的名称。
CASCADE
- 在删除 CA 捆绑包之前删除依赖对象。
特权
CA 捆绑包的所有权
示例
请参阅管理 CA 捆绑包。
另请参阅
16.6 - DROP CERTIFICATE
从数据库中删除 TLS 证书。
要查看现有证书,请查询 CERTIFICATES。
语法
DROP CERTIFICATE [ IF EXISTS ] certificate-name [,...] [ CASCADE ]
参数
IF EXISTS
- 当要删除的证书不存在时,Vertica 不会报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- certificate-name
- 要删除的证书的名称。
CASCADE
- 在删除证书之前删除依赖对象(例如,TLS 配置)。
特权
非超级用户,为以下之一:
示例
删除 server_cert
,如果存在:
=> DROP CERTIFICATE server_cert;
DROP CERTIFICATE;
删除 CA 证书及其依赖项(通常是它已签名的证书):
=> DROP CERTIFICATE ca_cert CASCADE;
DROP CERTIFICATE;
另请参阅
16.7 - DROP DIRECTED QUERY
从数据库中删除定向查询。如果定向查询处于活动状态,Vertica 会在移除前将其停用。
语法
DROP DIRECTED QUERY directed-query-id
参数
-
directed‑query‑id
- 标识将从数据库中删除的定向查询。若要获取定向查询的标识符,请使用 GET DIRECTED QUERY 或查询系统表 DIRECTED_QUERIES。
特权
超级用户
16.8 - DROP FAULT GROUP
移除指定容错组及其子容错组,并会将所有节点放置在已删除容错组的父组下。
要删除所有容错组,请使用 ALTER DATABASE..DROP ALL FAULT GROUP。
要将孤立的节点添加回容错组,必须使用 CREATE FAULT GROUP 和 ALTER FAULT GROUP...ADD NODE 手动将其重新分配给新的或现有容错组。
语法
DROP FAULT GROUP [ IF EXISTS ] fault‑group
参数
IF EXISTS
- 指定当 fault-group 不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- fault‑group
- 指定要删除的容错组的名称。
特权
超级用户
示例
=> DROP FAULT GROUP group2;
DROP FAULT GROUP
另请参阅
16.9 - DROP FILTER
从 Vertica 编录中删除用户定义的加载筛选器函数。
语法
DROP FILTER [[database.]schema.]filter()
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
filter()
- 指定要删除的筛选器函数。必须在函数名称上附加空的圆括号。
特权
非超级用户:
示例
以下命令将删除 Iconverter
筛选器函数:
=> drop filter Iconverter();
DROP FILTER
另请参阅
16.10 - DROP FUNCTION
从 Vertica 编录中删除 SQL 函数或用户定义的函数 (UDF)。
语法
DROP FUNCTION [ IF EXISTS ] [[database.]schema.]function[,...] ( [ arg‑list ] )
参数
IF EXISTS
- 指定当要删除的函数不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function
- 要删除的 SQL 或用户定义函数 (UDF),其中 UDF 可以是以下类型之一:
-
arg‑list
创建此函数时为其定义的以逗号分隔的实参列表,按如下方式指定:
[arg‑name] arg‑type[,...]
其中 arg-name(可选)限定 arg-type:
特权
非超级用户,为以下之一:
要求
示例
以下命令将删除 zerowhennull
函数,该函数在 macros
架构中:
=> DROP FUNCTION macros.zerowhennull(x INT);
DROP FUNCTION
另请参阅
16.11 - DROP KEY
从数据库中删除加密密钥及其证书(如果有)。
要查看现有的加密密钥,请查询 CRYPTOGRAPHIC_KEYS。
语法
DROP KEY [ IF EXISTS ] key-name [,...] [ CASCADE ]
参数
IF EXISTS
- 当要删除的密钥不存在时,Vertica 不会报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- key-name
- 要删除的加密密钥的名称。
CASCADE
- 在删除密钥之前删除依赖对象。
特权
非超级用户,为以下之一:
示例
删除 k_ca
,如果存在:
=> DROP KEY k_ca IF EXISTS;
DROP KEY;
删除 k_client
及其依赖项(与之关联的证书):
=> DROP KEY k_client CASCADE;
DROP KEY;
另请参阅
16.12 - DROP LIBRARY
从数据库中移除 UDx 库。从 Vertica 节点上的托管目录中删除库文件。库中用户定义的函数 (UDF) 不再可用。有关详细信息,请参阅开发用户定义的扩展 (UDx)。
语法
DROP LIBRARY [ IF EXISTS ] [[database.]schema.]library [ CASCADE]
参数
IF EXISTS
- 仅当库存在时才执行此命令。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
库
- 要删除的库名称,与在 CREATE LIBRARY 中用于加载库的名称相同。
CASCADE
- 同时删除使用该库定义的所有函数。DROP LIBRARY 在以下情况下会失败:CASCADE 被省略,且有一个或多个 UDx 在使用目标库。
特权
可为以下之一:
示例
超级用户可以删除任何库:
=> DROP LIBRARY ml.MyLib CASCADE;
具有 UDXDEVELOPER 角色的用户可以删除其创建的库:
=> GRANT UDXDEVELOPER TO alice, bob;
GRANT ROLE
=> \c - alice;
You are now connected as user "alice".
-- Must enable the role before using:
=> SET ROLE UDXDEVELOPER;
SET
-- Create and use ml.mylib...
-- Drop library and dependencies:
DROP LIBRARY ml.mylib CASCADE;
DROP LIBRARY
可以向用户授予删除库的显式权限:
=> \c - alice
You are now connected as user "alice".
=> GRANT DROP ON LIBRARY ml.mylib to bob;
GRANT PRIVILEGE
=> \c - bob
You are now connected as user "bob".
=> SET ROLE UDXDEVELOPER;
SET
=> DROP LIBRARY ml.mylib cascade;
DROP LIBRARY
16.13 - DROP LOAD BALANCE GROUP
删除负载均衡组。
语法
DROP LOAD BALANCE GROUP [ IF EXISTS ] group_name [ CASCADE ]
参数
-
IF EXISTS
- 指定当要删除的负载均衡组不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
group_name
- 要删除的组的名称。
[CASCADE]
- 同时还会删除针对该组的所有负载均衡路由规则。如果未提供此关键字和一个或多个路由规则目标 group_name,此语句将失败并显示错误消息。
特权
超级用户
示例
以下语句演示了当负载均衡组具有依赖路由规则以及使用 CASCADE 关键字时会出现的错误:
=> DROP LOAD BALANCE GROUP group_all;
NOTICE 4927: The RoutingRule catch_all depends on LoadBalanceGroup group_all
ROLLBACK 3128: DROP failed due to dependencies
DETAIL: Cannot drop LoadBalanceGroup group_all because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too
=> DROP LOAD BALANCE GROUP group_all CASCADE;
DROP LOAD BALANCE GROUP
另请参阅
16.14 - DROP MODEL
从 Vertica 数据库中移除一个或多个模型。
语法
DROP MODEL [ IF EXISTS ] [[database.]schema.]model[,...]
参数
IF EXISTS
- 指定当要删除的模型不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- [database.]架构
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 模型
- 要删除的模型。
特权
以下几项之一:
示例
请参阅删除模型。
16.15 - DROP NETWORK ADDRESS
从编录中删除网络地址。网络地址是节点上用于连接负载均衡策略的 IP 地址和端口的名称。
语法
DROP NETWORK ADDRESS [ IF EXISTS ] address‑name [ CASCADE ]
参数
-
IF EXISTS
- 指定当要删除的网络地址不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
address‑name
- 要删除的网络地址的名称。
CASCADE
- 从指向该网络地址的任何负载均衡组中移除该网络地址。如果未提供此关键字,且一个或多个负载均衡组包含此地址,则此语句将失败并显示错误消息。
特权
超级用户
示例
以下语句演示了当网络地址具有依赖的负载均衡组以及使用 CASCADE 关键字时会出现的错误:
=> DROP NETWORK ADDRESS node01;
NOTICE 4927: The LoadBalanceGroup group_1 depends on NetworkInterface node01
NOTICE 4927: The LoadBalanceGroup group_random depends on NetworkInterface node01
ROLLBACK 3128: DROP failed due to dependencies
DETAIL: Cannot drop NetworkInterface node01 because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too
=> DROP NETWORK ADDRESS node01 CASCADE;
DROP NETWORK ADDRESS
16.16 - DROP NETWORK INTERFACE
从 Vertica 中移除网络接口。使用 CASCADE 选项还可以从节点定义中移除网络接口。(有关详细信息,请参阅识别用于导入/导出的数据库或节点。)
语法
DROP NETWORK INTERFACE [ IF EXISTS ] network‑interface‑name [ CASCADE ]
参数
参数定义如下:
IF EXISTS
- 指定当要删除的网络接口不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- network‑interface‑name
- 要移除的网络接口。
CASCADE
- 从所有节点定义中移除网络接口。
特权
超级用户
示例
=> DROP NETWORK INTERFACE myNetwork;
16.17 - DROP NOTIFIER
删除通过
CREATE NOTIFIER
创建的基于推送的通知程序。
语法
DROP NOTIFIER [ IF EXISTS ] notifier‑name
参数
IF EXISTS
- 指定当要删除的通知程序不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- notifier‑name
- 通知程序的唯一标识符。
16.18 - DROP PARSER
从 Vertica 编录中删除用户定义的加载解析器函数。
语法
DROP PARSER[[database.]schema.]parser()
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
parser()
- 要删除的解析器函数的名称。必须在函数名称上附加空的圆括号。
特权
非超级用户:
示例
=> DROP PARSER BasicIntegerParser();
DROP PARSER
另请参阅
16.19 - DROP PROCEDURE(外部)
仅限企业模式
从 Vertica 中移除外部过程。只会移除对 Vertica 内部过程的引用。外部文件仍保留在每个数据库节点的
database/procedures
目录中。
语法
DROP PROCEDURE [ IF EXISTS ] [[database.]schema.]procedure( [ parameter‑list ] )
参数
IF EXISTS
- 指定当要删除的过程不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 过程
- 指定要删除的过程。
- parameter‑list
- 为此过程定义的形式参数的逗号分隔列表,指定如下:
[parameter‑name] parameter‑type[,...]
其中 parameter-name 选择性地限定 parameter-type。
特权
非超级用户:
示例
=> DROP PROCEDURE helloplanet(arg1 varchar);
另请参阅
CREATE PROCEDURE(外部)
16.20 - DROP PROCEDURE(存储)
删除存储过程。
语法
DROP PROCEDURE [ IF EXISTS ] [[database.]schema.]procedure( [ parameter-type-list] );
参数
IF EXISTS
- 指定当要删除的过程不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
过程
- 存储过程的名称,其中 procedure 符合标识符中描述的约定。
- parameter-type-list
- IN 参数类型的逗号分隔列表。
特权
非超级用户:
-
所有者或 DROP 权限
-
对架构的 USAGE 权限
示例
对于下列过程:
=> CREATE PROCEDURE raiseXY(IN x INT, y VARCHAR) LANGUAGE PLvSQL AS $$
BEGIN
RAISE NOTICE 'x = %', x;
RAISE NOTICE 'y = %', y;
-- some processing statements
END;
$$;
CALL raiseXY(3, 'some string');
NOTICE 2005: x = 3
NOTICE 2005: y = some string
您可以使用以下命令进行删除:
=> DROP PROCEDURE raiseXY(INT, VARCHAR);
DROP PROCEDURE
有关 RAISE NOTICE 的详细信息,请参阅错误和诊断。
另请参阅
16.21 - DROP PROFILE
从数据库中移除用户定义的配置文件(通过
CREATE PROFILE
创建)。不能删除 DEFAULT
配置文件。
语法
DROP PROFILE [ IF EXISTS ] profile‑name[,...] [ CASCADE ]
参数
IF EXISTS
- 指定当要删除的配置文件不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- profile‑name
- 要删除的配置文件。
CASCADE
- 将分配给已删除的配置文件的所有用户转移给 DEFAULT 配置文件。如果忽略此选项,且目标配置文件分配有用户,Vertica 将返回错误。
特权
超级用户
示例
=> DROP PROFILE sample_profile;
16.22 - DROP PROJECTION
屏蔽要从编录中删除的
投影,以便该投影不可供用户查询。
语法
DROP PROJECTION [ IF EXISTS ] { [[database.]schema.]projection[,...] } [ RESTRICT | CASCADE ]
参数
IF EXISTS
- 指定当要删除的投影不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
projection
- 指定要删除的投影:
有关投影名称约定,请参阅投影命名。
RESTRICT | CASCADE
- 指定在投影包含对象的情况下是否将其删除:
特权
非超级用户:锚表的所有者
限制
投影删除操作有以下限制:
另请参阅
16.23 - DROP RESOURCE POOL
删除用户创建的资源池。分配给此池的所有内存都将返回到 GENERAL 池。
语法
DROP RESOURCE POOL pool-name [ FOR subcluster-spec ]
参数
- pool-name
- 指定要删除的资源池。
-
FOR subcluster‑spec
- 仅适用于 Eon 模式,从指定的子群集中删除此资源池,其中 subcluster-spec 为以下几项之一:
-
SUBCLUSTER subcluster-name
:从已命名子群集中删除 pool‑name。您不能连接到此子群集,否则 Vertica 会返回错误。
CURRENT SUBCLUSTER
:从连接到的子群集中删除 pool‑name。
如果省略此参数,将从所有子群集中删除资源池。如果为单个子群集创建了资源池,则必须指定此参数以将资源池从该子群集中显式删除;否则,Vertica 将返回错误。
特权
超级用户
如果您尝试删除的资源池是另一个资源池的辅助池,则 Vertica 会返回一个错误。该错误会列出与您尝试删除的辅助池有关的资源池。要删除辅助资源池,首先在主要资源池上将 CASCADE TO 参数设置为 DEFAULT
,然后再删除辅助池。
例如,可以删除资源池 rp2
,它是 rp1
的辅助池,如下:
=> ALTER RESOURCE POOL rp1 CASCADE TO DEFAULT;
=> DROP RESOURCE POOL rp2;
传输资源请求
按照该池对比于 GENERAL 池的优先级,队列中对该池的请求将全部传输给 GENERAL 池。如果该池的优先级高于 GENERAL 池,则这些请求将放置在队列列首;否则,这些请求将放置在队列列尾。
正在使用该池的用户将收到通知,通知其改为使用 GENERAL 池:
NOTICE: Switched the following users to the General pool: username
如果用户不具备使用 GENERAL 池的权限,DROP RESOURCE POOL 会返回错误。现有会话将传输给 GENERAL 池,而无论会话的用户是否具备使用 GENERAL 池的权限。如果正在删除的池的限制级别较 GENERAL 池高,这一会话传输过程会导致需要更多用户权限。为避免赋予用户更多特权,请按照以下步骤删除受限池:
-
针对所有用户调用池权限。
-
关闭对池有权限的所有会话。
-
删除资源池。
示例
此示例将删除用户定义的资源池:
=> DROP RESOURCE POOL ceo_pool;
此 Eon 模式示例返回了当前子群集,然后删除了当前子群集的用户定义资源池:
=> SELECT CURRENT_SUBCLUSTER_NAME();
CURRENT_SUBCLUSTER_NAME
-------------------------
analytics_1
(1 row)
=> DROP RESOURCE POOL dashboard FOR CURRENT SUBCLUSTER;
DROP RESOURCE POOL
另请参阅
16.24 - DROP ROLE
从数据库中删除角色。
注意
不能对已添加到具有 LDAPLink 服务的 Vertica 数据库的角色使用 DROP ROLE。
语法
DROP ROLE [ IF EXISTS ] role‑name[,...] [ CASCADE ]
参数
IF EXISTS
- 指定当要删除的角色不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- role‑name
- 要删除的角色名称
CASCADE
- 删除角色前先自用户或其他角色调用该角色
特权
超级用户
示例
=> DROP ROLE appadmin;
NOTICE: User bob depends on Role appadmin
ROLLBACK: DROP ROLE failed due to dependencies
DETAIL: Cannot drop Role appadmin because other objects depend on it
HINT: Use DROP ROLE ... CASCADE to remove granted roles from the dependent users/roles
=> DROP ROLE appadmin CASCADE;
DROP ROLE
另请参阅
16.25 - DROP ROUTING RULE
从编录中删除路由规则。
语法
DROP ROUTING RULE [ IF EXISTS ] rule‑name
参数
-
IF EXISTS
- 指定当要删除的路由规则不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
rule‑name
- 要删除的规则的名称。
特权
超级用户
示例
=> DROP ROUTING RULE internal_clients;
DROP ROUTING RULE
16.26 - DROP SCHEMA
从数据库中永久删除架构。由于 DROP SCHEMA 是一个不可逆的过程,因此在删除架构前,请务必先确认您确实想要删除该架构。使用 CASCADE 参数可删除包含一个或多个对象的架构。
语法
DROP SCHEMA [ IF EXISTS ] [database.]schema[,...] [ CASCADE | RESTRICT ]
参数
IF EXISTS
- 指定当要删除的架构不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- [database.]架构
- 要删除的数据库的名称。如果指定一个数据库,它必须是当前数据库。
CASCADE
- 指定删除架构及其中的所有对象,而不考虑这些对象的所有者。
当心
依赖于已删除架构中对象的其他架构中的对象——例如,用户定义的函数——也将以静默形式删除。
RESTRICT
- 仅当架构为空时将其删除(默认)。
特权
非超级用户:架构所有者
限制
示例
以下示例将删除架构 S1,但前提是该架构不包含任何对象:
=> DROP SCHEMA S1;
以下示例将删除架构 S1,而无论其包含架构与否:
=> DROP SCHEMA S1 CASCADE;
16.27 - DROP SEQUENCE
移除指定的命名序列号生成器。
语法
DROP SEQUENCE [ IF EXISTS ] [[database.]schema.]sequence[,...]
参数
IF EXISTS
- 指定当要删除的序列不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 序列
- 要删除的序列的名称。
特权
非超级用户:序列或架构所有者
限制
示例
以下命令将删除名为 sequential
的序列。
=> DROP SEQUENCE sequential;
另请参阅
16.28 - DROP SOURCE
从 Vertica 编录中删除用户定义的加载源函数。
语法
DROP SOURCE [[database.]schema.]source()
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
source()
- 指定要删除的源函数。必须在函数名称上附加空的圆括号。
特权
非超级用户:
示例
以下命令将删除 curl
源函数:
=> DROP SOURCE curl();
DROP SOURCE
另请参阅
16.29 - DROP SUBNET
从 Vertica 中移除子网。
语法
DROP SUBNET [ IF EXISTS ] subnet‑name[,...] [ CASCADE ]
参数
参数定义如下:
IF EXISTS
- 指定当要删除的子网不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- subnet‑name
- 要移除的子网。
CASCADE
- 从所有数据库定义中移除指定的子网。
特权
超级用户
示例
=> DROP SUBNET mySubnet;
另请参阅
识别用于导入/导出的数据库或节点
16.30 - DROP TABLE
移除一个或多个表及其
投影。当您运行 DROP TABLE
时,更改会自动提交。
语法
DROP TABLE [ IF EXISTS ] [ [database.]schema.]table[,...] [ CASCADE ]
参数
IF EXISTS
- 指定当要删除的一个或多个表不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
表
- 要删除的表。
CASCADE
- 指定删除目标表的所有投影。
CASCADE
可选,如果目标表只有自动投影。如果忽略此选项且任何表具有非超投影集,Vertica 将返回错误并回退整个删除操作。
此选项对外部表无效。
特权
非超级用户:
要求
-
请勿取消正在执行的 DROP TABLE
。这样会导致数据库不一致。
-
请检查确定目标表不在使用中,无论是直接使用还是间接使用——例如,在视图中。
-
如果删除然后恢复被某视图引用的表,新表必须具有相同的名称和列定义。
示例
请参阅 删除表
另请参阅
16.31 - DROP TEXT INDEX
删除用于执行文本搜索的文本索引。
注意
当删除具有与其关联的文本索引的源表时,文本索引也会被删除。
语法
DROP TEXT INDEX [ IF EXISTS ] [[database.]schema.]idx‑table
参数
IF EXISTS
- 指定当要删除的文本索引不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
idx‑table
- 指定文本索引名称。当使用多个架构时,指定在
DROP TEXT INDEX
语句中包含该索引的架构。
特权
-
dbadmin
-
表所有者
-
对于源表的 DROP 权限
示例
=> DROP TEXT INDEX t_text_index;
DROP INDEX
另请参阅
16.32 - DROP TLS CONFIGURATION
删除现有的 TLS CONFIGURATION。
如果将 TLS 配置设置为配置参数,则无法删除。有关详细信息,请参阅TLS 配置。
语法
DROP TLS CONFIGURATION tls_config_name
参数
-
tls_config_name
- 要删除的 TLS CONFIGURATION 对象的名称。
特权
非超级用户,为以下之一:
16.33 - DROP TRANSFORM FUNCTION
从 Vertica 编录中删除用户定义的转换函数 (UDTF)。
语法
DROP TRANSFORM FUNCTION [ IF EXISTS ] [[database.]schema.]function( [ arg‑list ] )
参数
IF EXISTS
- 指定当要删除的函数不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function
- 指定要删除的转换函数。
-
arg‑list
创建此函数时为其定义的以逗号分隔的实参列表,按如下方式指定:
[arg‑name] arg‑type[,...]
其中 arg-name(可选)限定 arg-type:
注意
删除多态函数时可以省略 arg‑list。
特权
以下几项之一:
示例
以下命令将删除 tokenize
UDTF,该 UDTF 在 macros
架构中:
=> DROP TRANSFORM FUNCTION macros.tokenize(varchar);
DROP TRANSFORM FUNCTION
以下命令将删除 Pagerank
多态函数,该函数在 online
架构中:
=> DROP TRANSFORM FUNCTION online.Pagerank();
DROP TRANSFORM FUNCTION
另请参阅
CREATE TRANSFORM FUNCTION
16.34 - DROP USER
从授权数据库用户列表中删除一个名称。
注意
DROP USER 无法移除使用 LDAPLink 服务添加到 Vertica 数据库的用户。
语法
DROP USER [ IF EXISTS ] user‑name[,...] [ CASCADE ]
参数
IF EXISTS
- 当要删除的用户不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
- user‑name
- 要删除的用户的名称。
CASCADE
- 删除通过 user‑name 创建的所有用户定义的对象,包括架构、表和引用该表的所有视图,以及该表的投影。
当心
发出 DROP USER CASCADE 命令后,已删除用户所拥有的表将无法恢复。
特权
超级用户
示例
当用户定义的对象不存在时,DROP USER 将成功:
=> CREATE USER user2;
CREATE USER
=> DROP USER IF EXISTS user2;
DROP USER
当用户创建的对象仍然存在时,DROP USER 将失败:
=> DROP USER IF EXISTS user1;
NOTICE: Table T_tbd1 depends on User user1
ROLLBACK: DROP failed due to dependencies
DETAIL: Cannot drop User user1 because other objects depend on it
HINT: Use DROP ... CASCADE to drop the dependent objects too
无论用户定义的对象是否存在,DROP USER CASCADE 均可成功。该语句会强制删除所有用户定义的对象,如架构、表及其关联投影:
=> DROP USER IF EXISTS user1 CASCADE;
DROP USER
另请参阅
16.35 - DROP VIEW
删除指定视图。Vertica 不会检查删除的视图的依赖项。删除视图后,引用该视图的其他视图将出现故障。
如果删除视图,并将其替换为具有相同名称和列名称的其他视图或表,则引用该名称的其他视图将使用新视图。如果更改新视图中的列数据类型,则服务器会将旧数据类型强制转换为新类型(如果可行);否则将返回错误。
语法
DROP VIEW [ IF EXISTS ] [[database.]schema.]view[,...]
参数
IF EXISTS
- 指定当要删除的视图不存在时不报告错误。 在 SQL 脚本中使用此子句,可避免在尝试创建不存在的对象之前删除它们时出错。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 视图
- 要删除的视图的名称。
特权
为以下几项之一
示例
=> DROP VIEW myview;
17 - END
结束当前事务,使事务期间发生的所有变更永久化且对其他用户可见。
语法
END [ WORK | TRANSACTION ]
参数
WORK | TRANSACTION
- 不起任何作用的可选关键字,仅为了可读性。
特权
无
示例
=> BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
BEGIN
=> CREATE TABLE sample_table (a INT);
CREATE TABLE
=> INSERT INTO sample_table (a) VALUES (1);
OUTPUT
--------
1
(1 row)
=> END;
COMMIT
另请参阅
18 - EXPLAIN
返回 Vertica 用于执行特定语句的优化器计划的格式化描述。
语法
EXPLAIN [/*+ ALLNODES */] [explain-options] sql-statement
参数
-
/*+ALLNODES*/
- 指定创建一个查询计划,该计划假设所有节点均为激活状态,对
LOCAL
选项无效。
- explain‑options
- 一个或多个
EXPLAIN
选项,按所示顺序指定:
[ LOCAL ] [ VERBOSE ] [ JSON ] [ ANNOTATED ]
-
LOCAL
:在多节点数据库中,显示分配给每一节点的本地查询计划,它们共同组成整个(全球)查询计划。如果您忽略此选项,Vertica 将仅显示全局查询计划。本地查询计划仅以 DOT 语源显示,在 Graphviz 中呈现。
此选项与提示 /*+ALL NODES*/
不兼容。如果您同时指定两者,EXPLAIN
将返回错误。
-
VERBOSE
:增加呈现的查询计划的详细程度。
-
JSON
:以 JSON 格式呈现查询计划。此选项仅与 VERBOSE
兼容。
-
ANNOTATED
:嵌入用于封装此查询的查询计划的优化器提示。Vertica 使用这些提示来创建定向查询。有关详细信息,请参阅定向查询。此选项与 LOCAL
和 VERBOSE
兼容。
- sql‑statement
- 查询或 DML 语句—例如,
SELECT
、
INSERT
、
UPDATE
、
COPY
和
MERGE
。
特权
指定语句要求的同一特权。
要求
以下要求适用于 EXPLAIN
的作用,用于产生有用信息:
-
必须提供您数据中的具有合理代表性的统计信息。有关详细信息,请参阅收集统计信息。
-
EXPLAIN
仅在可以为被查询的表提供投影时产生有用输出。
-
必须按之前显示的顺序指定限定符选项,否则 EXPLAIN
将返回错误。如果某个选项与前面的任何选项均不兼容,EXPLAIN
将忽略这些选项。
示例
请参阅查看查询计划。
19 - EXPORT TO DELIMITED
将表、表中的列或查询结果导出到分隔文件。可以使用 DELIMITED 读回文件。某些导出器参数具有相应的解析器参数,可用于更改分隔符、空指示符和其他格式。
您可以在导出语句中使用的查询有一些限制。请参阅查询限制。
您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。
此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出。
在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储。
语法
EXPORT [ /*+LABEL (label-string)*/ ] TO DELIMITED ( directory=path[, param=value [,...] ]
[ OVER (over-clause ) ] AS SELECT query-expression
参数
-
LABEL
- 将标签分配到语句,以便您可以在分析和调试时识别它。
- over-clause
- 指定如何使用 PARTITION BY 对表数据进行分区。在分区内,您可以使用 ORDER BY 进行排序。请参阅SQL 分析。该子句可能包含列引用,但不包含表达式。
如果您对数据进行分区,Vertica 会创建一个分区目录结构,将列名称转换为小写。有关目录结构的描述,请参阅分区文件路径。如果您使用 fileName
参数,则无法使用分区。
如果省略此子句,Vertica 会优化最大并行度。
- query-expression
- 指定要导出的数据。有关重要限制,请参阅查询限制。
参数
directory
输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:
filename
如果已指定,则所有输出都将写入由 directory
指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB
参数被忽略,查询无法在 OVER() 子句中使用分区。
addHeader
- 布尔值,指定是否在每个文件的开头添加标题行。
默认值:false
delimiter
- 列分隔符。要根据 RFC 4180 生成 CSV,请将分隔符设置为
,
(逗号)。
默认值: |
(垂直条)
recordTerminator
- 用于标记记录结尾的字符。
默认值: \n
enclosedBy
- 用于将字符串和日期/时间数据括起来的字符。如果省略此参数,将不会使用字符将这些数据类型括起来。
默认值: ''
(空字符串)
escapeAs
- 用于转义导出数据中必须转义的值的字符,包括
enclosedBy
值。
默认值: \\
(反斜杠)
nullAs
- 用于表示数据中的 null 值的字符串。如果包含此参数,导出器会将所有 null 值导出为此值。否则,导出器会将 null 值导出为长度为零的字符串。
binaryTypesFormat
- 导出的二进制数据类型(BINARY、VARBINARY 和 LONG VARBINARY)值的格式,为以下几项之一:
例如,可以将值 a\000b\001c
导出为如下格式:
compression
- 压缩类型,为以下几项之一:
默认值: 未压缩
fileExtension
- 输出文件扩展名。如果使用压缩,则会附加一个特定于压缩的扩展,例如
.bz2
。
默认值: csv
fileSizeMB
单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了 filename
,则忽略 fileSizeMB
。
此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。
默认值: 10GB
fileMode
仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如 665
)或
user-group-other
格式 — 例如,rwxr-xr-x
。即使采用八进制格式,也必须将该值的格式设置为字符串。
有效的八进制值范围介于 0
和 1777
(包含)之间。请参阅 Apache Hadoop 文档中的 HDFS 权限。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 660
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值为何值。
dirMode
仅对 HDFS 的写入,适用于所有导出目录的权限。这些值遵循与 fileMode 相同的规则。此外,您必须授予 Vertica HDFS 用户完全权限,至少为 rwx------
或 700
。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 755
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值如何。
特权
非超级用户:
-
源表:SELECT
-
源表架构:USAGE
-
目标目录:写入
查询限制
必须为作为表达式的选定列目标提供别名列标签。
如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。
查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:
=> EXPORT TO DELIMITED(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975: Only a single outer SELECT statement is supported
HINT: Please use a subquery for multiple outer SELECT statements
而需要重写查询以使用子查询:
=> EXPORT TO DELIMITED(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT
account_id,
json
FROM
(
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash
) a;
Rows Exported
---------------
2
(1 row)
要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。
数据类型
此操作将原始 Flex 列导出为二进制数据。
输出
导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。
输出文件名遵循以下模式:
[8-character-hash]-[nodename]-[thread-id].fileExtension
.
分区目录中的列名采用小写。
由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。
具有以下要求和限制:
-
避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。
-
使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。
-
要输出到本地文件系统,您必须有一个 USER 存储位置。
-
导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。
有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储。
示例
以下示例导出未压缩的逗号分隔值 (CSV),每个文件中都有一个标题行:
=> EXPORT TO DELIMITED(directory='webhdfs:///user1/data', delimiter=',', addHeader='true')
AS SELECT * FROM public.sales;
20 - EXPORT TO JSON
将表、表中的列或查询结果导出到 JSON 文件。可以使用 FJSONPARSER 将文件读回 Vertica。
您可以在导出语句中使用的查询有一些限制。请参阅查询限制。
您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。
此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出。
在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储。
语法
EXPORT [ /*+LABEL (label)*/ ] TO JSON ( directory=path[, param=value [,...] ]
[ OVER (over-clause ) ] AS SELECT query-expression
参数
-
LABEL
- 将标签分配到语句,以便您可以在分析和调试时识别它。
- over-clause
- 指定如何使用 PARTITION BY 对表数据进行分区。在分区内,您可以使用 ORDER BY 进行排序。请参阅SQL 分析。该子句可能包含列引用,但不包含表达式。
如果您对数据进行分区,Vertica 会创建一个分区目录结构,将列名称转换为小写。有关目录结构的描述,请参阅分区文件路径。如果您使用 fileName
参数,则无法使用分区。
如果省略此子句,Vertica 会优化最大并行度。
- query-expression
- 指定要导出的数据。有关重要限制,请参阅查询限制。
参数
directory
输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:
filename
如果已指定,则所有输出都将写入由 directory
指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB
参数被忽略,查询无法在 OVER() 子句中使用分区。
omitNullFields
- 布尔值,是否忽略值为 null 的 ROW 字段。
默认值:false
compression
- 压缩类型,为以下几项之一:
默认值: 未压缩
fileSizeMB
单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了 filename
,则忽略 fileSizeMB
。
此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。
默认值: 10GB
fileMode
仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如 665
)或
user-group-other
格式 — 例如,rwxr-xr-x
。即使采用八进制格式,也必须将该值的格式设置为字符串。
有效的八进制值范围介于 0
和 1777
(包含)之间。请参阅 Apache Hadoop 文档中的 HDFS 权限。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 660
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值为何值。
dirMode
仅对 HDFS 的写入,适用于所有导出目录的权限。这些值遵循与 fileMode 相同的规则。此外,您必须授予 Vertica HDFS 用户完全权限,至少为 rwx------
或 700
。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 755
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值如何。
特权
非超级用户:
-
源表:SELECT
-
源表架构:USAGE
-
目标目录:写入
查询限制
必须为作为表达式的选定列目标提供别名列标签。
如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。
查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:
=> EXPORT TO JSON(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975: Only a single outer SELECT statement is supported
HINT: Please use a subquery for multiple outer SELECT statements
而需要重写查询以使用子查询:
=> EXPORT TO JSON(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT
account_id,
json
FROM
(
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash
) a;
Rows Exported
---------------
2
(1 row)
要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。
数据类型
EXPORT TO JSON 可以以任意组合导出 ARRAY 和 ROW 类型。
EXPORT TO JSON 不支持二进制输出 (VARBINARY)。
输出
导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。
输出文件名遵循以下模式:
[8-character-hash]-[nodename]-[thread-id].json
.
分区目录中的列名采用小写。
由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。
具有以下要求和限制:
-
避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。
-
使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。
-
要输出到本地文件系统,您必须有一个 USER 存储位置。
-
导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。
有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储。
示例
在以下示例中,ROW 元素之一包含 null 值,该值将在输出中被忽略。EXPORT TO JSON 将每条 JSON 记录写入一行;为了便于阅读,已在以下输出中插入了换行符:
=> SELECT name, menu FROM restaurants;
name | menu
-------------------+------------------------------------------------------------
------------------
Bob's pizzeria | [{"item":"cheese pizza","price":null},{"item":"spinach pizza","price":10.5}]
Bakersfield Tacos | [{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]
(2 rows)
=> EXPORT TO JSON (directory='/output/json', omitNullFields=true)
AS SELECT * FROM restaurants;
Rows Exported
---------------
2
(1 row)
=> \! cat /output/json/*.json
{"name":"Bob's pizzeria","cuisine":"Italian","location_city":["Cambridge","Pittsburgh"],
"menu":[{"item":"cheese pizza"},{"item":"spinach pizza","price":10.5}]}
{"name":"Bakersfield Tacos","cuisine":"Mexican","location_city":["Pittsburgh"],
"menu":[{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]}
21 - EXPORT TO ORC
将表、表中的列或查询结果以 ORC 格式导出到文件。
可以在导出前使用 OVER() 子句对数据进行分区。除了导出列数据之外,还可以对数据进行分区。对数据进行分区可启用分区修剪,从而提高查询性能。请参阅分区文件路径。
您可以在导出语句中使用的查询有一些限制。请参阅查询限制。
您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。
此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出。
在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储。
语法
EXPORT [ /*+LABEL (label-string)*/ ] TO ORC ( directory=path[, param=value [,...] ] )
[ OVER (over-clause ) ] AS SELECT query-expression
参数
-
LABEL
- 将标签分配到语句,以便您可以在分析和调试时识别它。
- over-clause
- 指定如何使用 PARTITION BY 对表数据进行分区。在分区内,您可以使用 ORDER BY 进行排序。请参阅SQL 分析。该子句可能包含列引用,但不包含表达式。
如果您对数据进行分区,Vertica 会创建一个分区目录结构,将列名称转换为小写。有关目录结构的描述,请参阅分区文件路径。如果您使用 fileName
参数,则无法使用分区。
如果省略此子句,Vertica 会优化最大并行度。
- query-expression
- 指定要导出的数据。有关重要限制,请参阅查询限制。
参数
directory
输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:
filename
如果已指定,则所有输出都将写入由 directory
指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB
参数被忽略,查询无法在 OVER() 子句中使用分区。
compression
- 列压缩类型,为以下几项之一:
默认值: Zlib
stripeSizeMB
- 导出的带区的未压缩大小 (MB),为 1 至 1024 (包含)之间的整数值。
默认值: 250
rowIndexStride
- 用于指定导出器在输出中构建索引统计信息的频率,为 1 至 1000000(100 万)(包含)之间的整数。值为 0 表示禁用索引。导出器在每个带区中的每个
rowIndexStride
行之后构建统计信息,或者为带区 < rowIndexStride
构建一次统计信息。
默认值: 1000
fileSizeMB
单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了 filename
,则忽略 fileSizeMB
。
此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。
默认值: 10GB
fileMode
仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如 665
)或
user-group-other
格式 — 例如,rwxr-xr-x
。即使采用八进制格式,也必须将该值的格式设置为字符串。
有效的八进制值范围介于 0
和 1777
(包含)之间。请参阅 Apache Hadoop 文档中的 HDFS 权限。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 660
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值为何值。
dirMode
仅对 HDFS 的写入,适用于所有导出目录的权限。这些值遵循与 fileMode 相同的规则。此外,您必须授予 Vertica HDFS 用户完全权限,至少为 rwx------
或 700
。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 755
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值如何。
特权
非超级用户:
-
源表:SELECT
-
源表架构:USAGE
-
目标目录:写入
查询限制
必须为作为表达式的选定列目标提供别名列标签。
如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。
查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:
=> EXPORT TO ORC(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975: Only a single outer SELECT statement is supported
HINT: Please use a subquery for multiple outer SELECT statements
而需要重写查询以使用子查询:
=> EXPORT TO ORC(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT
account_id,
json
FROM
(
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash
) a;
Rows Exported
---------------
2
(1 row)
要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。
数据类型
EXPORT TO ORC 将 Vertica 数据类型转换为 Hive 数据类型,如下表所示。
小数精度必须为 <= 38。
导出的 Hive 类型可能与 Vertica 类型不同。例如,Vertica INT 导出为 Hive BIGINT。在定义 Hive 外部表以读取导出的数据时,可能必须要调整列定义。
此操作将原始 Flex 列导出为二进制数据。
输出
导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。
输出文件名遵循以下模式:
[8-character-hash]-[nodename]-[thread-id].orc
.
分区目录中的列名采用小写。
由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。
具有以下要求和限制:
-
避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。
-
使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。
-
要输出到本地文件系统,您必须有一个 USER 存储位置。
-
导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。
有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储。
示例
以下示例演示了数据的分区和导出操作。EXPORT TO ORC 首先对区域上的数据进行分区,然后在每个分区内按存储进行排序。
=> EXPORT TO ORC(directory='gs://DataLake/user2/data')
OVER(PARTITION BY store.region ORDER BY store.ID)
AS SELECT sale.price, sale.date, store.ID
FROM public.sales sale
JOIN public.vendor store ON sale.distribID = store.ID;
有关更多示例,请参阅 EXPORT TO PARQUET,该语句(某些参数除外)操作与 EXPORT TO ORC 相同。
22 - EXPORT TO PARQUET
将表、表中的列或查询结果以 Parquet 格式导出到文件。
可以在导出前使用 OVER() 子句对数据进行分区。除了导出列数据之外,还可以对数据进行分区。对数据进行分区可启用分区修剪,从而提高查询性能。请参阅分区文件路径。
您可以在导出语句中使用的查询有一些限制。请参阅查询限制。
您可以以 ROS 格式导出存储在 Vertica 中的数据,也可以导出来自外部表的数据。
此语句返回写入的行数并在系统表中记录有关导出文件的信息。请参阅监控导出。
在导出到 HDFS 或 NFS 挂载点期间,Vertica 会将文件写入与目标位置相同的临时目录,并在导出完成后对该目录进行重命名。不要尝试使用临时目录中的文件。在导出到 S3、GCS 或 Azure 期间,Vertica 将文件直接写入目标路径,因此您必须等待导出完成才能读取文件。有关详细信息,请参阅导出到对象存储。
导出数据后,您可以使用 GET_METADATA 函数检查结果。
语法
EXPORT [ /*+LABEL (label-string)*/ ] TO PARQUET ( directory=path[, param=value [,...] ] )
[ OVER (over-clause ) ] AS SELECT query-expression
参数
-
LABEL
- 将标签分配到语句,以便您可以在分析和调试时识别它。
- over-clause
- 指定如何使用 PARTITION BY 对表数据进行分区。在分区内,您可以使用 ORDER BY 进行排序。请参阅SQL 分析。该子句可能包含列引用,但不包含表达式。
如果您对数据进行分区,Vertica 会创建一个分区目录结构,将列名称转换为小写。有关目录结构的描述,请参阅分区文件路径。如果您使用 fileName
参数,则无法使用分区。
如果省略此子句,Vertica 会优化最大并行度。
- query-expression
- 指定要导出的数据。有关重要限制,请参阅查询限制。
参数
directory
输出文件的目标目录。目录不能存在,当前用户必须有写入权限。目标可以位于以下任何文件系统上:
filename
如果已指定,则所有输出都将写入由 directory
指定的位置中同名的单个文件。虽然查询可以由多个节点处理,但仅有一个节点生成输出数据。fileSizeMB
参数被忽略,查询无法在 OVER() 子句中使用分区。
compression
- 列压缩类型,为以下几项之一:
-
Snappy
-
GZIP
-
Brotli
-
ZSTD
-
Uncompressed
默认值: Snappy
rowGroupSizeMB
- 导出的行组的未压缩大小 (MB),为 1 至
fileSizeMB
(包含)之间的整数值,如果 fileSizeMB
为 0,则为无限制。
导出文件中的行组小于此值,因为 Parquet 文件在写入时被压缩。为了在导出到 HDFS 时获得最佳性能,请将 size 设置为小于 HDFS 块大小。
行组大小会影响导出时的内存消耗。导出线程至少使用两倍的行组大小。默认值 512MB 是在写入更大行组和允许其他 Vertica 操作有足够可用内存之间进行折衷。如果您在数据库负载不重时执行导出,则可以通过增加导出的行组大小来提高导出数据的读取性能。但是,跨 HDFS 上的多个块的行组会因需要更多 I/O 而降低读取性能,因此请不要将行组大小设置为大于 HDFS 块大小。
默认值: 512
fileSizeMB
单个输出文件的最大文件大小。此值是一个提示,而不是硬限制。值为 0 表示没有任何限制。如果还指定了 filename
,则忽略 fileSizeMB
。
此值影响单个输出文件的大小,而不是总输出大小。对于较小的值,Vertica 将输出分成更多的文件;仍会导出所有数据。
默认值: 10GB
fileMode
仅对 HDFS 的写入,适用于所有导出文件的权限。您可以以 Unix 八进制格式指定值(例如 665
)或
user-group-other
格式 — 例如,rwxr-xr-x
。即使采用八进制格式,也必须将该值的格式设置为字符串。
有效的八进制值范围介于 0
和 1777
(包含)之间。请参阅 Apache Hadoop 文档中的 HDFS 权限。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 660
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值为何值。
dirMode
仅对 HDFS 的写入,适用于所有导出目录的权限。这些值遵循与 fileMode 相同的规则。此外,您必须授予 Vertica HDFS 用户完全权限,至少为 rwx------
或 700
。
将文件写入 HDFS 以外的任何目标位置时,此参数无效。
默认值: 755
,无论 hdfs-site.xml
中的 fs.permissions.umask-mode
的值如何。
int96AsTimestamp
- 布尔值,指定将时间戳导出为 int96 物理类型 (true) 还是 int64 物理类型 (false)。
默认值:true
特权
非超级用户:
-
源表:SELECT
-
源表架构:USAGE
-
目标目录:写入
查询限制
必须为作为表达式的选定列目标提供别名列标签。
如果对输出进行分区,则不能在 SELECT 语句中指定架构和表名。只能指定列名称。
查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:
=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975: Only a single outer SELECT statement is supported
HINT: Please use a subquery for multiple outer SELECT statements
而需要重写查询以使用子查询:
=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
OVER(PARTITION BY hash)
AS
SELECT
account_id,
json
FROM
(
SELECT 1 as account_id, '{}' as json, 0 hash
UNION ALL
SELECT 2 as account_id, '{}' as json, 1 hash
) a;
Rows Exported
---------------
2
(1 row)
要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。
数据类型
EXPORT TO PARQUET 将 Vertica 数据类型转换为 Hive 数据类型,如下表所示。
小数精度必须为 <= 38。
导出的 Hive 类型可能与 Vertica 类型不同。例如,Vertica INT 导出为 Hive BIGINT。在定义 Hive 外部表以读取导出的数据时,可能必须要调整列定义。
此操作将原始 Flex 列导出为二进制数据。
输出
导出操作始终会创建一个输出目录,即使所有输出都写入单个文件或查询返回零行。
输出文件名遵循以下模式:
[8-character-hash]-[nodename]-[thread-id].parquet
.
分区目录中的列名采用小写。
由任何 Vertica 用户导出到本地文件系统的文件归 Vertica 超级用户所有。导出到 HDFS 或对象存储的文件归导出数据的 Vertica 用户所有。
具有以下要求和限制:
-
避免同时导出到相同的输出目标位置。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。
-
使用共享文件位置进行输出。如果您使用本地文件系统中的目录,它必须是 NFS 挂载的目录。
-
要输出到本地文件系统,您必须有一个 USER 存储位置。
-
导出到本地文件系统时,目录权限模式为 700,文件权限模式为 600。您无法覆盖这些值。
有关特定于对象存储(S3、GCS 或 Azure)的限制,请参阅导出到对象存储。
示例
以下示例演示了如何使用 GZIP 压缩从公共架构的 T1 表中导出所有列。
=> EXPORT TO PARQUET(directory='webhdfs:///user1/data', compression='gzip')
AS SELECT * FROM public.T1;
以下示例演示了如何使用多个表导出查询结果。
=> EXPORT TO PARQUET(directory='s3://DataLake/sales_by_region')
AS SELECT sale.price, sale.date, store.region
FROM public.sales sale
JOIN public.vendor store ON sale.distribID = store.ID;
以下示例演示了数据的分区和导出操作。EXPORT TO PARQUET 首先对区域上的数据进行分区,然后在每个分区内按存储进行排序。
=> EXPORT TO PARQUET(directory='gs://DataLake/user2/data')
OVER(PARTITION BY store.region ORDER BY store.ID)
AS SELECT sale.price, sale.date, store.ID
FROM public.sales sale
JOIN public.vendor store ON sale.distribID = store.ID;
以下示例对作为表达式的选定列目标使用了别名列标签。
=> EXPORT TO PARQUET(directory='webhdfs:///user3/data')
OVER(ORDER BY col1) AS SELECT col1 + col1 AS A, col2
FROM public.T3;
以下示例为输出设置了权限。
=> EXPORT TO PARQUET(directory='webhdfs:///user1/data',
fileMode='432', dirMode='rwxrw-r-x')
AS SELECT * FROM public.T1;
23 - 导出到 VERTICA
将表数据从一个 Vertica 数据库导出到另一个数据库。
重要
源数据库的版本不得比目标数据库版本大一个主要版本 在目标数据库后面。
语法
EXPORT [ /*+LABEL (label‑string)*/ ] TO VERTICA
database.[schema.]target‑table [ ( target‑columns ) ]
{ AS SELECT query‑expression | FROM [schema.]source‑table[ ( source‑columns ) ] }
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
数据库
- 要导出的数据的目标数据库。在启动复制操作之前,当前会话中必须已经存在与该数据库的连接;否则 Vertica 将返回错误。有关详细信息,请参阅 CONNECT TO VERTICA。
-
[schema.]target‑table
- database 中的表用于存储导出的数据。此表不可以包含除原生数组之外的复杂数据类型列。
-
target‑columns
- target‑table 中列的逗号分隔列表,用于存储导出的数据。请参阅源列和目标列之间的映射,如下所示。
-
query‑expression
- 要导出的数据。
-
[schema.]source‑table
- 包含要导出的数据的表。
-
source‑columns
- 源表中要导出的列的逗号分隔列表。此表不可以包含复杂数据类型的列。请参阅下面的源列和目标列之间的映射。
特权
非超级用户:
-
源表:选择
-
源表架构: USAGE
-
目标表: INSERT
-
目标表架构: USAGE
源列和目标列之间的映射
将一个数据库中的所有表数据导出到另一个数据库时,如果两个表中的列定义都符合以下条件,EXPORT TO VERTICA 可以不用指定列列表:
如果其中任何一个条件不成立,则 EXPORT TO VERTICA 语句必须包含将源列和目标列显式映射到彼此的列列表,如下所示:
-
包含相同数量的列。
-
按相同顺序列出源列和目标列。
-
将具有相同(或兼容)数据类型的列配对。
示例
请参阅将数据导出到另一个数据库。
另请参阅
24 - GET DIRECTED QUERY
在指定的输入查询上查询系统表 DIRECTED_QUERIES,并返回映射到输入查询的所有定向查询的详细信息。有关输出的详细信息,请参阅获取定向查询。
语法
GET DIRECTED QUERY input-query
参数
-
input-query
- 与一个或多个定向查询关联的一个输入查询。
特权
无
示例
请参阅获取定向查询。
25 - GRANT 语句
GRANT 语句将数据库对象的权限授予用户和角色。
重要
在采用信任身份验证的数据库中,GRANT 语句似乎按预期工作,但是对数据库的安全性不起任何实际作用。
25.1 - GRANT(身份验证)
将身份验证记录与一个或多个用户和角色相关联。
语法
GRANT AUTHENTICATION auth‑method‑name TO grantee[,...]
参数
- auth‑method‑name
- 与一个或多个用户或角色关联的身份验证方法的名称。
- grantee
- 指定与身份验证方法关联的人员,为以下几项之一:
特权
超级用户
示例
-
将 v_ldap
身份验证与用户 jsmith
关联:
=> GRANT AUTHENTICATION v_ldap TO jsmith;
-
将 v_gss
身份验证与角色 DBprogrammer
关联:
=> CREATE ROLE DBprogrammer;
=> GRANT AUTHENTICATION v_gss TO DBprogrammer;
-
将客户端身份验证方法 v_localpwd
与角色 PUBLIC
关联,默认情况下会被分配给所有用户:
=> GRANT AUTHENTICATION v_localpwd TO PUBLIC;
另请参阅
25.2 - GRANT(数据库)
将数据库权限授予用户和角色。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] }
ON DATABASE db‑spec
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对数据库有效:
ALL [PRIVILEGES]
- 授予同时属于授予者的所有数据库权限。授予者不能授予其自身缺少的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
db‑spec
指定当前数据库,设置为数据库名称或DEFAULT
。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户:权限被授予者可以选择 (WITH GRANT OPTION
) 将权限授予其他用户或角色。
示例
以下示例授予用户 Fred 在当前数据库中创建架构的权利。
=> GRANT CREATE ON DATABASE DEFAULT TO Fred;
另请参阅
25.3 - GRANT(密钥)
将加密密钥权限授予用户或角色。
要撤销授予的权限,请参阅 REVOKE(密钥)。
对于自己未拥有的加密对象,超级用户的访问权限有限。有关详细信息,请参阅数据库对象权限。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] } ON KEY
key_name[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
权限,可为以下之一:
- key_name
- 目标密钥。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户:
示例
以下示例将私钥的 USAGE 权限授予用户,该权限允许用户将自签名 CA 证书添加到 server
TLS 配置:
=> CREATE KEY new_ca_key TYPE 'RSA' LENGTH 2048;
=> CREATE CA CERTIFICATE new_ca_cert
SUBJECT '/C=US/ST=Massachusetts/L=Cambridge/O=Micro Focus/OU=Vertica/CN=Vertica example CA'
VALID FOR 3650
EXTENSIONS 'authorityKeyIdentifier' = 'keyid:always,issuer', 'nsComment' = 'new CA'
KEY new_ca_key;
=> CREATE USER u1;
=> GRANT USAGE ON KEY new_ca_key TO u1;
=> GRANT ALTER ON TLS CONFIGURATION data_channel TO u1;
=> \c - u1
=> ALTER TLS CONFIGURATION data_channel ADD CA CERTIFICATES new_ca_cert;
-- clean up:
=> \c
=> ALTER TLS CONFIGURATION data_channel REMOVE CA CERTIFICATES new_ca_cert;
=> DROP KEY new_ca_key CASCADE;
=> DROP USER u1;
25.4 - GRANT(库)
将一个或多个库的权限授予用户和角色。
例如,当您使用连接器框架服务时,您可能需要授予一个用户库的使用权限,才可以设置 UD 会话参数。有关详细信息,请参阅实施 CFS。
语法
GRANT privilege
ON LIBRARY [[database.]schema.]library[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 要授予的权限,为以下几项之一:
您可以使用两个可选关键字限定 ALL
:
重要
要执行库中的函数,用户还必须对它们具有单独的 EXECUTE
权限,并对其各自的架构具有 USAGE
权限。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 库
- 目标库。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
示例
将 MyFunctions
库的 USAGE 权限授予 Fred
:
=> GRANT USAGE ON LIBRARY MyFunctions TO Fred;
另请参阅
25.5 - GRANT(模型)
将模型的使用权限授予用户和角色。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON MODEL [[database.]schema.]model‑name[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对模型有效:
ALL [PRIVILEGES][EXTEND]
- 授予同时属于授予者的所有模型权限。授予者不能授予其自身缺少的权限。
您可以使用两个可选关键字限定 ALL
:
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- model‑name
- 授予其权限的模型。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
示例
此示例将 mySvmClassModel 模型的 USAGE 权限授予 user1:
=> GRANT USAGE ON MODEL mySvmClassModel TO user1;
另请参阅
25.6 - GRANT(过程)
将存储过程或外部过程的权限授予用户或角色。
重要
您使用
CREATE PROCEDURE(外部) 创建的外部过程始终以 Linux dbadmin 权限运行。如果 dbadmin 或伪超级用户授予非 dbadmin 权限以使用
GRANT(过程) 运行过程,请注意非 dbadmin 用户以完全 Linux dbadmin 权限运行该过程。
语法
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON PROCEDURE [[database.]schema.]procedure( [arg-list] )[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
EXECUTE
- 使被授予者能够运行指定的过程。
ALL [PRIVILEGES]
- 授予同时属于授予者的所有过程权限。授予者不能授予其自身缺少的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 过程
- 目标过程。
- arg-list
- 过程实参的逗号分隔列表,其中每个实参指定如下:
[ argname ] argtype
如果过程未定义实参,请提供一个空的实参列表。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户,为以下之一:
示例
将 tokenize
过程的 EXECUTE 权限授予用户 Bob
和 Jules
,以及授予角色 Operator
:
=> GRANT EXECUTE ON PROCEDURE tokenize(varchar) TO Bob, Jules, Operator;
另请参阅
25.7 - GRANT(资源池)
将资源池的 USAGE 权限授予用户和角色。用户可以通过 ALTER USER 或 SET SESSION RESOURCE POOL 访问其资源池。
语法
GRANT USAGE
ON RESOURCE POOL resource-pool[,...]
[FOR SUBCLUSTER subcluster | FOR CURRENT SUBCLUSTER]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
USAGE
- 使被授予者能够访问指定的资源池。
ALL [PRIVILEGES]
- 授予同时属于授予者的所有资源池权限。授予者不能授予其自身缺少的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
resource-pool
- 授予其指定权限的资源池。
-
subcluster
- 资源池的子群集。
-
grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户,为以下之一:
示例
授予用户 Joe
对资源池 Joe_pool
的 USAGE 权限。
=> CREATE USER Joe;
CREATE USER
=> CREATE RESOURCE POOL Joe_pool;
CREATE RESOURCE POOL
=> GRANT USAGE ON RESOURCE POOL Joe_pool TO Joe;
GRANT PRIVILEGE
授予用户 Joe
对子群集 sub1
的资源池 Joe_pool
的 USAGE 权限。
=> GRANT USAGE on RESOURCE POOL Joe_pool FOR SUBCLUSTER sub1 TO Joe;
GRANT PRIVILEGE
另请参阅
25.8 - 授权(角色)
将角色分配给用户或其他角色。
语法
GRANT role[,...] TO grantee[,...] [ WITH ADMIN OPTION ]
参数
- 角色
- 要授予的角色
- grantee
- 被授予指定角色的用户或角色,为以下几项之一:
WITH ADMIN OPTION
- 授予被授予者将指定角色授予其他用户或角色的权限。有关详细信息,请参阅授予权限。
特权
非超级用户:如果使用 WITH GRANT OPTION,则可以将相同的角色授予其他用户或角色。
示例
请参阅授予数据库角色。
另请参阅
REVOKE(角色)
25.9 - GRANT(架构)
将架构权限授予用户和角色。默认情况下,只有超级用户和架构所有者才拥有以下架构权限:
注意
默认情况下,新用户无法访问架构 PUBLIC。您必须显式授予所有新用户对 PUBLIC 架构的 USAGE 权限。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON SCHEMA [database.]schema[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
-
privilege
- 以下权限之一:
您还可以授予以下架构权限,以供表及其投影以及该架构的视图继承。如果数据库和架构启用了继承,这些权限会在创建时自动授予这些对象:
-
SELECT:查询表和视图。默认情况下,会将 SELECT 权限授予 PUBLIC 角色。
-
INSERT:插入行,或者使用
COPY
将数据加载到表中。
注意
COPY FROM STDIN
允许具有 INSERT 权限的用户使用,而
COPY FROM 文件
需要管理员特权。
-
UPDATE:更新表行。
-
DELETE:删除表行。
-
REFERENCES:在此表上创建外键约束。必须对引用的和被引用的表上都设置此权限。
-
TRUNCATE:截断表内容。表的非所有者也可以对表执行以下分区操作:
-
ALTER:使用
ALTER TABLE
和
ALTER VIEW
分别修改表和视图的 DDL。
-
DROP:删除表和视图。
ALL [PRIVILEGES][EXTEND]
- 授予 USAGE AND CREATE 权限。必须显式授予继承的权限。
您可以使用两个可选关键字限定 ALL
:
-
[database.]schema
- 指定目标架构。如果指定一个数据库,它必须是当前数据库。
-
grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户,为以下几项之一:
示例
授予用户 Joe 对架构 online_sales
的 USAGE 权限。
=> CREATE USER Joe;
CREATE USER
=> GRANT USAGE ON SCHEMA online_sales TO Joe;
GRANT PRIVILEGE
另请参阅
25.10 - GRANT(序列)
将序列权限授予用户和角色。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON {
SEQUENCE [[database.]schema.]sequence[,...]
| ALL SEQUENCES IN SCHEMA [database.]schema[,...] }
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对序列有效:
ALL [PRIVILEGES][EXTEND]
- 授予同时属于授予者的所有序列权限。授予者不能授予其自身缺少的权限
您可以使用两个可选关键字限定 ALL
:
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
SEQUENCE sequence
- 指定授予其权限的序列。
-
ALL SEQUENCES IN SCHEMA schema
- 授予对架构 schema 中所有序列的指定权限。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
示例
此示例说明如何授予用户 Joe
对序列 my_seq
的所有权限。
=> CREATE SEQUENCE my_seq START 100;
CREATE SEQUENCE
=> GRANT ALL PRIVILEGES ON SEQUENCE my_seq TO Joe;
GRANT PRIVILEGE
另请参阅
25.11 - GRANT(存储位置)
将用户定义的存储位置的权限授予用户和角色。有关详细信息,请参阅创建存储位置。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] }
ON LOCATION 'path' [ ON node ]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对存储位置有效:
ALL [PRIVILEGES]
- 授予同时属于授予者的所有存储位置权限。授予者不能授予其自身缺少的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
ON LOCATION 'path' [ ON node]
- 指定存储位置的路径名称挂载点。如果通过
ON NODE
进行限定,Vertica 将授予对位于节点上的存储位置的访问权限。
如果未指定节点,则授予操作适用于指定路径上的所有节点。所有节点必须在指定路径上;否则,整个授权操作将回退。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
特权
非超级用户,为以下之一:
注意
只有超级用户可以添加、更改、停用、删除和恢复位置。
示例
创建存储位置:
=> CREATE LOCATION '/home/dbadmin/UserStorage/BobStore' NODE 'v_mcdb_node0007' USAGE 'USER';
CREATE LOCATION
授予用户 Bob
对 /BobStore
位置的所有可用权限:
=> GRANT ALL ON LOCATION '/home/dbadmin/UserStorage/BobStore' TO Bob;
GRANT PRIVILEGE
取消授予 Bob 的全部存储位置特权:
=> REVOKE ALL ON LOCATION '/home/dbadmin/UserStorage/BobStore' FROM Bob;
REVOKE PRIVILEGE
再次授予 Bob
在 BobStore
位置的特权,指定节点:
=> GRANT ALL ON LOCATION '/home/dbadmin/UserStorage/BobStore' ON v_mcdb_node0007 TO Bob;
GRANT PRIVILEGE
取消授予 Bob
的全部存储位置特权:
=> REVOKE ALL ON LOCATION '/home/dbadmin/UserStorage/BobStore' ON v_mcdb_node0007 FROM Bob;
REVOKE PRIVILEGE
另请参阅
25.12 - GRANT(表)
将表权限授予用户和角色。同时必须将表架构的 USAGE 权限授予用户。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON {
[ TABLE ] [[database.]schema.]table[,...]
| ALL TABLES IN SCHEMA [database.]schema[,...] }
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对表有效:
重要
只有 SELECT 权限对系统表有效。
-
SELECT:查询表。默认情况下,会将 SELECT 权限授予 PUBLIC 角色。
-
INSERT:使用 INSERT 插入表格行,使用
COPY
加载数据。
注意
COPY FROM STDIN
允许具有 INSERT 权限的用户使用,而
COPY FROM 文件
需要管理员特权。
-
UPDATE:更新表行。
-
DELETE:删除表行。
-
REFERENCES:在此表上创建外键约束。必须对引用的和被引用的表上都设置此权限。
-
TRUNCATE:截断表内容。表的非所有者也可以对表执行以下分区操作:
-
ALTER:使用
ALTER TABLE
修改表的 DDL。
-
DROP:删除表。
ALL [PRIVILEGES][EXTEND]
- 对系统表无效,授予同时属于授予者的所有表权限。授予者不能授予其自身缺少的权限。
您可以使用两个可选关键字限定 ALL
:
-
[database.]schema
- 指定架构,默认为
public
。如果 schema 是除 public
以外的任何其他架构,则必须提供架构名称。例如:
myschema.thisDbObject
这里有一个例外:您可以指定系统表但不指定其架构名称。
如果指定一个数据库,它必须是当前数据库。
-
TABLE table
- 指定授权的表。
注意
该表可以是全局临时表,但不可以是本地临时表。请参阅
创建临时表。
-
ON ALL TABLES IN SCHEMA schema
- 授予对架构 schema 中所有表和视图的指定权限。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
示例
授予用户 Joe
对表 customer_dimension
的所有权限:
=> CREATE USER Joe;
CREATE USER
=> GRANT ALL PRIVILEGES ON TABLE customer_dimension TO Joe;
GRANT PRIVILEGE
授予用户 Joe
对所有系统表的 SELECT 权限:
=> GRANT SELECT on all tables in schema V_MONITOR, V_CATALOG TO Joe;
GRANT PRIVILEGE
另请参阅
25.13 - GRANT(用户定义的扩展)
将用户定义的扩展 (UDx) 的权限授予用户和角色。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON {
UDx‑type [[database.]schema.]function( [arg‑list] )[,...]
| ALL FUNCTIONS IN SCHEMA schema[,...] }
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
- privilege
- 以下权限对用户定义的扩展有效:
注意
用户只能调用他们对其具有 EXECUTE 权限和对其架构具有 USAGE 权限的 UDx 函数。
ALL [PRIVILEGES] [EXTEND]
- 授予同时属于授予者的所有函数权限。授予者不能授予其自身缺少的权限
您可以使用两个可选关键字限定 ALL
:
-
ON UDx‑type
- 用户定义的扩展 (UDx) 的类型,为以下几项之一:
-
FUNCTION
(标量函数)
-
AGGREGATE FUNCTION
-
ANALYTIC FUNCTION
-
TRANSFORM FUNCTION
-
FILTER
-
PARSER
-
SOURCE
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function
- 要授予其权限的用户定义函数的名称。
-
ON ALL FUNCTIONS IN SCHEMAschema
- 授予对指定架构中所有函数的权限。
- arg-list
- 对所有多态函数都是必需的,是一个逗号分隔的函数实参列表,其中每个实参指定如下:
[ argname ] argtype
如果过程未定义实参,请提供一个空的实参列表。
- grantee
指定向谁授予权限,可以为以下值之一:
注意
被授予者必须对架构具有 USAGE
权限。
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
示例
将 myzeroifnull
SQL 函数的 EXECUTE
权限授予用户 Bob
和 Jules
以及角色 Operator
。该函数需要一个整数参数:
=> GRANT EXECUTE ON FUNCTION myzeroifnull (x INT) TO Bob, Jules, Operator;
将 zero-schema
架构中所有函数的 EXECUTE
权限授予用户 Bob
:
=> GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA zero-schema TO Bob;
将tokenize
转换函数的 EXECUTE
权限授予用户 Bob
和角色 Operator
:
=> GRANT EXECUTE ON TRANSFORM FUNCTION tokenize(VARCHAR) TO Bob, Operator;
将 ExampleSource()
源的 EXECUTE
权限授予用户 Alice
:
=> CREATE USER Alice;
=> GRANT USAGE ON SCHEMA hdfs TO Alice;
=> GRANT EXECUTE ON SOURCE ExampleSource() TO Alice;
将 ExampleSource()
源的所有权限授予用户 Alice
:
=> GRANT ALL ON SOURCE ExampleSource() TO Alice;
将多态函数 Pagerank
的所有权限授予 dbadmin 角色:
=> GRANT ALL ON TRANSFORM FUNCTION Pagerank(z varchar) to dbadmin;
另请参阅
25.14 - GRANT(视图)
将视图权限授予用户和角色。
语法
GRANT { privilege[,...] | ALL [ PRIVILEGES ] [ EXTEND ] }
ON [[database.]schema.]view[,...]
TO grantee[,...]
[ WITH GRANT OPTION ]
参数
-
privilege
- 视图具有以下有效权限:
ALL [PRIVILEGES][EXTEND]
- 授予同时属于授予者的所有视图权限。授予者不能授予其自身缺少的权限。
您可以使用两个可选关键字限定 ALL
:
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 视图
- 目标视图。
- grantee
指定向谁授予权限,可以为以下值之一:
WITH GRANT OPTION
授予被授予者权限,以便将相同权限授予其他用户或角色的,也可以撤销它们。有关详细信息,请参阅授予权限。
非超级用户需要对架构的 USAGE 权限和以下权限之一:
注意
作为视图所有者,只有在以下情况之一为真时,您才能授予其他用户对视图的 SELECT 权限:
示例
授予用户 Joe
对视图 ship
的所有权限。
=> CREATE VIEW ship AS SELECT * FROM public.shipping_dimension;
CREATE VIEW
=> GRANT ALL PRIVILEGES ON ship TO Joe;
GRANT PRIVILEGE
另请参阅
REVOKE(视图)
26 - INSERT
将值插入指定表的所有投影。每次只能插入一个完整的元组。如果没有与目标表关联的投影,Vertica 会创建一个超投影以存储插入值。
INSERT 适用于 flex 表以及常规原生表。如果表包含实际列,则会将标量类型的插入数据和标量类型的原生数组添加到实际列和 __raw__
列。对于复杂类型的数据,不会将值添加到 __raw__
列。
语法
INSERT [ /*+LABEL (label‑string)*/ ] INTO [[database.]schema.]table-name
[ ( column-list ) ]
{ DEFAULT VALUES | VALUES ( values-list )[,...] | SELECT {{< codevar >}}query-expression{{< /codevar >}} }
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
table‑name
- 目标表。不能在投影中调用 INSERT。
-
column‑list
- 此表中一个或多个目标列的逗号分隔列表,按任意顺序列出。VALUES 子句值将以相同的顺序映射到列。如果忽略此列表,Vertica 将根据表定义中的列顺序将 VALUES 子句值映射到列。
DEFAULT VALUES 对目标列列表无效。
DEFAULT VALUES
- 使用表定义中指定的默认值填充所有列。如果没有为列指定默认值,Vertica 将插入 NULL 值。
不能使用此选项指定目标列的列表。
-
VALUES (values‑list)
- 要在目标列中插入的一个或多个值的逗号分隔列表,其中每个值是以下值之一:
如果没有为列提供值,Vertica 会隐式添加 DEFAULT 值(如果已定义)。否则,Vertica 将插入 NULL 值。如果将列定义为 NOT NULL,则 INSERT 将返回错误。
您可以使用 INSERT 在目标表中插入多行,方法是指定多个以逗号分隔的 VALUES 列表:
INSERT INTO table-name
VALUES ( values-list ), ( values-list )[,...]
有关详细信息,请参阅下面的多行 INSERT。
-
SELECT query‑expression
- 返回要插入的行的查询。隔离级别仅适用于 SELECT 子句并且按照任意查询的方式工作。对使用复杂类型的限制同样适用于其他查询。
特权
Vertica 采用 SQL-92 事务模型,因此连续的 INSERT、UPDATE 和 DELETE 语句包含在同一个事务中。您无需显式启动此事务,但必须使用 COMMIT 显式结束它,或者使用 COPY 隐式结束它。否则,Vertica 将放弃在该事务中所做的所有更改。
多行 INSERT
通过指定多个以逗号分隔的 VALUES 列表,您可以使用 INSERT 在目标表中插入多行。例如:
=> CREATE TABLE public.t1(a int, b int, c varchar(16));
CREATE TABLE
=> INSERT INTO t1 VALUES (1,2, 'un, deux'), (3,4, 'trois, quatre');
OUTPUT
--------
2
(1 row)
=> COMMIT;
COMMIT
=> SELECT * FROM t1;
a | b | c
---+---+---------------
1 | 2 | un, deux
3 | 4 | trois, quatre
(4 rows)
限制
-
Vertica 不支持将子查询作为 INSERT 语句的目标。
-
对在 SELECT 语句中使用 复杂类型的限制同样适用于 INSERT。使用无法强制转换为列类型的复杂值会导致错误。
-
如果在目标表中启用了主键、唯一键或检查约束以自动强制实施,Vertica 会在您加载新数据时强制实施这些约束。如果发生违规,Vertica 会回滚操作并返回错误。
-
如果插入会违反表或架构磁盘配额,则操作将失败。有关详细信息,请参阅磁盘配额。
示例
=> INSERT INTO t1 VALUES (101, 102, 103, 104);
=> INSERT INTO customer VALUES (10, 'male', 'DPR', 'MA', 35);
=> INSERT INTO start_time VALUES (12, 'film','05:10:00:01');
=> INSERT INTO retail.t1 (C0, C1) VALUES (1, 1001);
=> INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';
Vertica 不支持将子查询或嵌套的表达式作为 INSERT 语句的目标。例如,以下查询会返回一条错误消息:
=> INSERT INTO t1 (col1, col2) VALUES ('abc', (SELECT mycolumn FROM mytable));
ERROR 4821: Subqueries not allowed in target of insert
您可以重新编写以上查询,如下所示:
=> INSERT INTO t1 (col1, col2) (SELECT 'abc', mycolumn FROM mytable);
OUTPUT
--------
0
(1 row)
以下示例显示了如何将 INSERT...VALUES 与 flex 表一起使用:
=> CREATE FLEX TABLE flex1();
CREATE TABLE
=> INSERT INTO flex1(a,b) VALUES (1, 'x');
OUTPUT
--------
1
(1 row)
=> SELECT MapToString(__raw__) FROM flex1;
MapToString
---------------------------------
{
"a" : "1",
"b" : "x"
}
(1 row)
以下示例显示了如何将 INSERT...SELECT 与 flex 表一起使用:
=> CREATE FLEX TABLE flex2();
CREATE TABLE
=> INSERT INTO flex2(a, b) SELECT a, b, '2016-08-10 11:10' c, 'Hello' d, 3.1415 e, f from flex1;
OUTPUT
--------
1
(1 row)
=> SELECT MapToString(__raw__) FROM flex2;
MapToString
---------------------------------
{
"a" : "1",
"b" : "x",
"c" : "2016-08-10",
"d" : "Hello",
"e" : 3.1415,
"f" : null
}
(1 row)
以下示例使用复杂类型:
=> CREATE TABLE inventory(storeID INT, product ROW(name VARCHAR, code VARCHAR));
CREATE TABLE
--- LookUpProducts() returns a row(varchar, int), which is cast to row(varchar, varchar):
=> INSERT INTO inventory(product) SELECT LookUpProducts();
OUTPUT
--------
5
(1 row)
--- Cannot use with select...values:
=> INSERT INTO inventory(product) VALUES(LookUpProducts());
ERROR 2631: Column "product" is of type "row(varchar,varchar)" but expression is of type "row(varchar,int)"
--- Literal values are supported:
=> INSERT INTO inventory(product) VALUES(ROW('xbox',165));
OUTPUT
--------
1
(1 row)
=> SELECT product FROM inventory;
product
------------------------------
{"name":"xbox","code":"125"}
(1 row)
27 - MERGE
根据目标表与另一个数据集(例如表或视图)的联接结果,对其执行更新和插入操作。联接只能将一个源行与一个目标行匹配;否则,Vertica 将返回错误。
如果合并会违反表或架构磁盘配额,操作将失败。有关详细信息,请参阅磁盘配额。
目标表不能包含复杂数据类型列。但源表可以,只要合并操作中不包含这些列。
语法
MERGE [ /*+LABEL (label‑string)*/ ]
INTO [[database.]schema.]target‑table [ [AS] alias ]
USING source‑dataset
ON join-condition matching‑clause[ matching‑clause ]
返回
更新或插入的目标表行数
参数
-
LABEL
将标签分配到语句,以便您可以在分析和调试时识别它。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
目标表
- 对其执行更新和插入操作的表。MERGE 在操作中对目标表进行 X(互斥)锁。表不得包含复杂类型列。
重要
目标表列总数不得超过 831。
- source‑dataset
- 要联接到 target-table 的数据,为以下几项之一:
-
[[database.]schema.]table [ [AS] alias ]
-
[[database.]schema.]view [ [AS] alias ]
-
(subquery) sq-alias
指定的数据集通常提供用于更新目标表和填充新行的数据。可以指定一个外部表。
-
ON join‑condition
- 联接目标表和源数据集的条件。
提示
仅当目标表联接列具有唯一键或主键约束时,Vertica 查询优化器才能为
MERGE 语句创建优化的查询计划。有关详细信息,请参阅
MERGE 优化。
- matching‑clause
- 以下子句之一:
MERGE 支持每个子句的一个实例,且必须至少包含一个实例。
-
WHEN MATCHED THEN UPDATE
- 对于联接(匹配)到 source‑dataset 的每个target‑table 行,指定更新一列或多列:
WHEN MATCHED [ AND update-filter ] THEN UPDATE
SET { column = expression }[,...]
update-filter 选择性地筛选匹配行的集合。更新筛选器可以指定任意数量的条件。Vertica 会根据此筛选器评估每个匹配行,并仅更新评估为 true 的行。有关详细信息,请参阅更新和插入筛选器。
注意
Vertica 还支持用于指定更新筛选器的 Oracle 语法:
WHEN MATCHED THEN UPDATE
SET { <span class="code-variable">column</span> = <span class="code-variable">expression</span> }[,...]
[ WHERE <span class="code-variable">update‑filter </span>]
需要满足以下要求:
有关详细信息,请参阅合并表数据。
-
WHEN NOT MATCHED THEN INSERT
- 对于每个未联接到(未匹配)到 target‑table 的 source‑dataset 行,指定:
WHEN NOT MATCHED [ AND insert-filter ] THEN INSERT
[ ( column‑list ) ] VALUES ( values‑list )
column‑list 是目标表中一个或多个目标列的逗号分隔列表,按任意顺序列出。MERGE 以相同的顺序将 column‑list 列映射到 values‑list 值,且每个列值对必须兼容。如果您忽略 column‑list,Vertica 将根据表定义中的列顺序将 values‑list 值映射到列。
insert-filter 选择性地筛选不匹配的行集。插入筛选器可以指定任意数量的条件。Vertica 根据此筛选器评估每个不匹配的源行。对于计算结果为 true 的每一行,Vertica 都会在目标表中插入一个新行。有关详细信息,请参阅更新和插入筛选器。
注意
Vertica 还支持用于指定插入筛选器的 Oracle 语法:
WHEN NOT MATCHED THEN INSERT
[ ( <span class="code-variable">column‑list</span> ) ] VALUES ( <span class="code-variable">values‑list</span>
[ WHERE <span class="code-variable">insert‑filter </span>]
需要满足以下要求:
-
MERGE 语句只能包含一个 WHEN NOT MATCHED 子句。
-
column‑list 只能指定目标表中的列名称。不能用表名称来限定。
-
插入筛选条件只能引用源数据。如果任何条件引用目标表,Vertica 将返回错误。
有关详细信息,请参阅合并表数据。
特权
MERGE 需要以下权限:
-
对源数据的 SELECT 权限以及对目标表的 INSERT、UPDATE 和 DELETE 权限。
-
自动约束强制执行要求具有对限制的表的 SELECT 权限。
-
如果语法中的条件从目标表中读取数据,则需要具有对目标表的 SELECT 权限。
例如,以下 GRANT 语句授予 user1
对 t2
表的访问权限。这将允许 user1
运行以下 MERGE 语句:
=> GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE t2 to user1;
GRANT PRIVILEGE
=>\c - user1
You are now connected as user "user1".
=> MERGE INTO t2 USING t1 ON t1.a = t2.a
WHEN MATCHED THEN UPDATE SET b = t1.b
WHEN NOT MATCHED THEN INSERT (a, b) VALUES (t1.a, t1.b);
改善 MERGE 性能
您可以通过多种方式改善 MERGE 性能:
有关详细信息,请参阅MERGE 优化。
如果在目标表中启用了主键、唯一键或检查约束以自动强制实施,Vertica 会在您加载新数据时强制实施这些约束。如果发生违规,Vertica 会回滚操作并返回错误。
当心
如果使用相同的目标和源表多次运行 MERGE,则每次迭代都有可能将重复值引入目标列并返回错误。
禁止合并的列
合并操作中不能指定以下列,否则将返回错误:
示例
请参阅:
另请参阅
28 - PROFILE
分析单个 SQL 语句。
语法
PROFILE { sql-statement }
参数
- sql‑statement
- 查询 (
SELECT
) 语句或 DML 语句,例如,您可以分析
INSERT
、
UPDATE
、
COPY
和
MERGE
。
输出
将分析摘要写入 stderr,将详细信息保存至系统编录
V_MONITOR.EXECUTION_ENGINE_PROFILES
。
特权
需要相同的权限运行已分析的语句
描述
PROFILE
生成关于目标语句执行的详细信息,并将其保存在系统编录
V_MONITOR.EXECUTION_ENGINE_PROFILES
中。查询输出通过分析总结执行:分析标识符 transaction_id
和 statement_id
、启动程序的查询内存以及需要的总内存。例如:
=> PROFILE SELECT customer_name, annual_income FROM public.customer_dimension WHERE (customer_gender, annual_income) IN (SELECT customer_gender, MAX(annual_income) FROM public.customer_dimension GROUP BY customer_gender);
NOTICE 4788: Statement is being profiled
HINT: Select * from v_monitor.execution_engine_profiles where transaction_id=45035996274683334 and statement_id=7;
NOTICE 3557: Initiator memory for query: [on pool general: 708421 KB, minimum: 554324 KB]
NOTICE 5077: Total memory required by query: [708421 KB]
customer_name | annual_income
------------------+---------------
Emily G. Vogel | 999998
James M. McNulty | 999979
(2 rows)
使用分析标识符在给定的查询中查询分析信息的表。
另请参阅
分析单个语句
29 - RELEASE SAVEPOINT
销毁保存点,而不撤销在建立保存点后所执行的命令的影响。
语法
RELEASE [ SAVEPOINT ] savepoint_name
参数
savepoint_name
- 指定要销毁的保存点名称。
特权
无
注意
保存点一经销毁便不可用作回退点。
示例
以下示例首先建立名为 my_savepoint 的保存点,然后将其销毁。值 101 和 102 均在提交时插入。
=> INSERT INTO product_key VALUES (101);
=> SAVEPOINT my_savepoint;
=> INSERT INTO product_key VALUES (102);
=> RELEASE SAVEPOINT my_savepoint;
=> COMMIT;
另请参阅
30 - REVOKE 语句
REVOKE 语句用于撤销用户和角色对数据库对象的权限。
重要
在采用信任身份验证的数据库中,REVOKE 语句似乎按预期工作,但是对数据库的安全性不起任何实际作用。
30.1 - REVOKE(身份验证)
撤销用户和角色对身份验证方法的权限。
语法
REVOKE AUTHENTICATION auth‑method‑name FROM grantee[,...]
参数
- auth‑method‑name
- 目标身份验证方法的名称。
- grantee
指定其权限被撤销的用户,可以为以下用户之一:
特权
超级用户
示例
-
从用户 jsmith
撤销 v_ldap
身份验证:
=> REVOKE AUTHENTICATION v_ldap FROM jsmith;
-
从角色 DBprogrammer
撤销 v_gss
身份验证:
=> REVOKE AUTHENTICATION v_gss FROM DBprogrammer;
-
撤销 localpwd
作为默认客户端身份验证方法:
=> REVOKE AUTHENTICATION localpwd FROM PUBLIC;
另请参阅
30.2 - REVOKE(数据库)
撤销用户和角色的数据库权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON DATABASE db‑spec
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
- privilege
- 要撤销的数据库权限,为以下几项之一:
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有数据库权限。用户无法撤销其自身没有的权限。
支持使用可选关键字 PRIVILEGES
以符合 SQL 标准。
-
ON DATABASE db‑spec
指定当前数据库,设置为数据库名称或DEFAULT
。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Fred
在当前数据库中创建架构的权限:
=> REVOKE CREATE ON DATABASE DEFAULT FROM Fred;
撤销用户 Fred
在当前数据库中创建临时表的权限:
=> REVOKE TEMP ON DATABASE DEFAULT FROM Fred;
另请参阅
30.3 - REVOKE(密钥)
撤销用户或角色对加密密钥的权限。
要授予密钥权限,请参阅 GRANT(密钥)。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] } ON KEY
key_name[,...]
FROM user[,...]
参数
-
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
- privilege
权限,可为以下之一:
- key_name
- 目标密钥。
- 用户
指定向谁授予权限,可以为以下值之一:
特权
非超级用户:
示例
以下示例撤销用户对密钥(以及扩展的相关证书)的 DROP 权限:
=> REVOKE USAGE ON KEY new_key FROM u1;
REVOKE PRIVILEGE
30.4 - REVOKE(库)
撤销用户和角色的库权限。
语法
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] }
ON LIBRARY [[database.]schema.]library[,...]
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
USAGE
- 撤销对指定库的访问权限。
重要
必须单独撤销对这些库中函数的权限。
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有库权限。用户无法撤销其自身没有的权限。可选关键字
PRIVILEGES
符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
库
- 目标库。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
示例
这些命令将展示如何新建一个库,然后如何授予和撤销用户 Fred
对该库的 USAGE 权限。
=> CREATE LIBRARY MyFunctions AS 'home/dbadmin/my_functions.so';
=> GRANT USAGE ON LIBRARY MyFunctions TO Fred;
=> REVOKE USAGE ON LIBRARY MyFunctions FROM Fred;
另请参阅
30.5 - REVOKE(模型)
撤销用户和角色的模型权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON MODEL [[database.]schema.]model‑name [,...]
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
USAGE
- 以下权限之一:
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有模型权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
model‑name
- 目标模型的名称。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Fred
对模型 mySvmClassModel
的 USAGE 权限:
=> REVOKE USAGE ON mySvmClassModel FROM Fred;
另请参阅
30.6 - REVOKE(过程)
撤销用户和角色的过程权限。
语法
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL PRIVILEGES }
ON PROCEDURE [[database.]schema.]procedure( [argument-list] )[,...]
FROM grantee[,...]
[ CASCADE ]
参数
-
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
EXECUTE
- 撤销被授予者运行指定过程的能力。
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有过程权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
过程
- 目标过程。
-
argument-list
- 过程实参的逗号分隔列表,其中每个实参指定如下:
[argname] argtype
如果过程未定义实参,请提供一个空的实参列表。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
此示例将撤销用户 Bob
对 tokenize
过程的执行权限。
=> REVOKE EXECUTE ON PROCEDURE tokenize(varchar) FROM Bob;
另请参阅
30.7 - REVOKE(资源池)
撤销用户和角色的资源池访问权限。
Vertica 在运行时检查资源池权限。撤销用户对资源池的权限可立即对用户的当前会话产生影响。例如,用户查询可能需要使用资源池的 USAGE 权限。如果您撤销该用户的这些权限,则该用户随后执行该查询的尝试将失败并返回错误消息。
语法
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL PRIVILEGES }
ON RESOURCE POOL resource-pool[,...]
[FOR SUBCLUSTER subcluster | FOR CURRENT SUBCLUSTER]
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
USAGE
- 撤销被授予者对指定资源池的访问权限。
ALL PRIVILEGES
- 撤销同时属于调用者的所有资源池权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
resource-pool
- 目标资源池。
-
subcluster
- 资源池的子群集。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Joe
对资源池 Joe_pool
的 USAGE 权限。
=> REVOKE USAGE ON RESOURCE POOL Joe_pool FROM Joe;
REVOKE PRIVILEGE
撤销用户 Joe
对子群集 sub1
的资源池 Joe_pool
的 USAGE 权限。
=> REVOKE USAGE ON RESOURCE POOL Joe_pool FOR SUBCLUSTER sub1 FROM Joe;
REVOKE PRIVILEGE
另请参阅
30.8 - REVOKE(角色)
撤销用户和角色的角色权限。
语法
REVOKE [ ADMIN OPTION FOR ] role[,...]
FROM grantee[,...]
[ CASCADE ]
参数
ADMIN OPTION FOR
- 撤销被授予者将指定角色分配给其他用户或角色的权限。被授予者的当前角色不受影响。如果忽略此子句,Vertica 将撤销角色分配权限和当前角色。
- 角色
- 要撤销的角色。
- grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
特权
以下几项之一:
示例
此示例显示了如何撤销 dbadmin 用户的 pseudosuperuser 角色:
=> REVOKE pseudosuperuser from dbadmin;
此示例显示了如何撤销 dbadmin 用户对 pseudosuperuser 角色的管理访问权限。ADMIN OPTION 命令不会移除 pseudosuperuser 角色。
=> REVOKE ADMIN OPTION FOR pseudosuperuser FROM dbadmin;
注意
如果尚未将尝试撤销的角色授予用户,Vertica 将返回一则通知:
=> REVOKE commentor FROM Sue;
NOTICE 2022: Role "commentor" was not already granted to user "Sue"
REVOKE ROLE
另请参阅
30.9 - REVOKE(架构)
撤销用户和角色的架构权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON SCHEMA [database.]schema[,...]
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
- privilege
- 要撤销的架构权限,为以下几项之一:
-
USAGE:访问指定架构中的对象。
-
CREATE:在指定的架构中创建对象。
您还可以撤销表和视图在创建时从该架构继承的权限。当您撤销在架构级别继承的权限时,Vertica 会自动将撤销应用于继承这些权限的所有表和视图。
-
SELECT:查询表和视图。默认情况下,会将 SELECT 权限授予 PUBLIC 角色。
-
INSERT:插入行,或者使用
COPY
将数据加载到表中。
注意
COPY FROM STDIN
允许具有 INSERT 权限的用户使用,而
COPY FROM 文件
需要管理员特权。
-
UPDATE:更新表行。
-
DELETE:删除表行。
-
REFERENCES:在此表上创建外键约束。必须对引用的和被引用的表上都设置此权限。
-
TRUNCATE:截断表内容。表的非所有者也可以对表执行以下分区操作:
-
ALTER:使用
ALTER TABLE
和
ALTER VIEW
分别修改表和视图的 DDL。
-
DROP:删除表和视图。
ALL [PRIVILEGES]
- 撤销 USAGE AND CREATE 权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
重要
必须显式撤销继承的权限。
-
[database.]schema
- 要撤销其权限的架构。如果指定一个数据库,它必须是当前数据库。
- grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Joe
对架构 online_sales
的 USAGE 权限。
=> REVOKE USAGE ON SCHEMA online_sales FROM Joe;
REVOKE PRIVILEGE
另请参阅
30.10 - REVOKE(序列)
撤销用户和角色的序列权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON {
SEQUENCE [[database.]schema.]sequence[,...]
| ALL SEQUENCES IN SCHEMA [database.]schema[,...] }
FROM grantee[,...]
[ CASCADE ]
参数
-
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
-
privilege
- 以下权限之一:
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有序列权限。用户无法撤销其自身没有的权限。
支持使用可选关键字 PRIVILEGES
以符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
SEQUENCE sequence
- 指定要撤销权限的序列。
-
ALL SEQUENCES IN SCHEMA schema
- 撤销对架构 schema 中所有序列的指定权限。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
-
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Joe
对序列 my_seq
的权限。
=> REVOKE ALL PRIVILEGES ON SEQUENCE my_seq FROM Joe;
REVOKE PRIVILEGE
另请参阅
30.11 - REVOKE(存储位置)
撤销用户和角色对用户定义的存储位置的权限。有关详细信息,请参阅创建存储位置。
注意
如果存储位置
已删除,Vertica 会自动撤销其所有权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON LOCATION 'path' [ ON node ]
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
- privilege
- 以下权限之一:
ALL [PRIVILEGES]
- 撤销同时属于调用者的所有存储位置权限。用户无法撤销其自身没有的权限。
支持使用可选关键字 PRIVILEGES
以符合 SQL 标准。
-
ON LOCATION 'path' [ ON node ]
- 指定存储位置的路径名称挂载点。如果通过
ON NODE
进行限定,Vertica 将撤销对节点上的存储位置的访问权限。
如果未指定节点,撤销操作将适用于指定路径上的所有节点。所有节点必须位于指定路径上;否则,整个撤销操作将回退。
- grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
请参阅GRANT(存储位置)。
另请参阅
授予和撤销权限
30.12 - REVOKE(表)
撤销用户和角色的表权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON {
[ TABLE ] [[database.]schema.]table[,...]
| ALL TABLES IN SCHEMA [database.]schema[,...] }
FROM grantee[,...]
[ CASCADE ]
参数
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
-
privilege
- 以下权限之一:
-
SELECT:查询表。默认情况下,会将 SELECT 权限授予 PUBLIC 角色。
-
INSERT:使用 INSERT 插入表格行,使用
COPY
加载数据。
注意
COPY FROM STDIN
允许具有 INSERT 权限的用户使用,而
COPY FROM 文件
需要管理员特权。
-
UPDATE:更新表行。
-
DELETE:删除表行。
-
REFERENCES:在此表上创建外键约束。必须对引用的和被引用的表上都设置此权限。
-
TRUNCATE:截断表内容。表的非所有者也可以对表执行以下分区操作:
-
ALTER:使用
ALTER TABLE
修改表的 DDL。
-
DROP:删除表。
ALL [PRIVILEGES]
- 撤销同时属于撤销者的所有表权限。用户无法撤销其自身没有的权限。
支持使用可选关键字 PRIVILEGES
以符合 SQL 标准。
-
[database.]schema
- 指定架构,默认为
public
。如果 schema 是除 public
以外的任何其他架构,则必须提供架构名称。例如:
myschema.thisDbObject
这里有一个例外:您可以指定系统表但不指定其架构名称。
如果指定一个数据库,它必须是当前数据库。
-
TABLE table
- 指定要撤销其权限的表。
-
ON ALL TABLES IN SCHEMA schema
- 撤销对架构 schema 中所有表和视图的指定权限。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
非超级用户,为以下之一:
示例
撤销用户 Joe
对表 customer_dimension
的权限。
=> REVOKE ALL PRIVILEGES ON TABLE customer_dimension FROM Joe;
REVOKE PRIVILEGE
另请参阅
30.13 - REVOKE(用户定义的扩展)
撤销用户和角色对一个或多个用户定义的扩展的权限。
语法
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL PRIVILEGES }
ON {
UDx‑type [[database.]schema.]function‑name( [argument‑list] )[,...]
| ALL FUNCTIONS IN SCHEMA schema[,...] }
FROM grantee[,...]
参数
-
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
EXECUTE
- 撤销被授予者运行指定函数的能力。
ALL [PRIVILEGES]
- 撤销同时属于调用者的所有函数权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
ON UDx‑type
- 指定函数的用户定义的扩展 (UDx) 类型,其中 UDx‑type 为以下几项之一:
-
FUNCTION
-
AGGREGATE FUNCTION
-
ANALYTIC FUNCTION
-
TRANSFORM FUNCTION
-
FILTER
-
PARSER
-
SOURCE
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- function‑name
- 要撤销其权限的用户定义函数的名称。
-
ON ALL FUNCTIONS IN SCHEMA schema
- 撤销对指定架构中所有函数的权限。
- argument-list
- 对所有多态函数都是必需的,是一个逗号分隔的函数实参列表,其中每个实参指定如下:
[argname] argtype
如果过程未定义实参,请提供一个空的实参列表。
- grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
特权
非超级用户,为以下之一:
示例
撤销用户 Bob
对函数 myzeroifnull
的 EXECUTE
权限:
=> REVOKE EXECUTE ON FUNCTION myzeroifnull (x INT) FROM Bob;
撤销用户 Doug
对函数 Pagerank
的所有权限:
=> REVOKE ALL ON TRANSFORM FUNCTION Pagerank (t float) FROM Doug;
撤销用户 Bob 对 zero-schema
架构中所有函数的 EXECUTE
权限:
=> REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA zero-schema FROM Bob;
撤销用户 Bob 对 tokenize
函数的 EXECUTE
权限:
=> REVOKE EXECUTE ON TRANSFORM FUNCTION tokenize(VARCHAR) FROM Bob;
撤销用户 Alice 对 ExampleSource()
源的所有权限:
=> REVOKE ALL ON SOURCE ExampleSource() FROM Alice;
另请参阅
30.14 - REVOKE(视图)
撤销用户和角色的视图权限。
语法
REVOKE [ GRANT OPTION FOR ] { privilege[,...] | ALL [ PRIVILEGES ] }
ON [[database.]schema.]view[,...]
FROM grantee[,...]
[ CASCADE ]
参数
-
GRANT OPTION FOR
撤销指定权限的授予选项。被授予者的当前权限不受影响。如果省略此子句,Vertica 将同时撤销授予选项和当前权限。
-
privilege
- 以下几项之一:
ALL PRIVILEGES
- 撤销与同时属于撤销者的视图相关的所有权限。用户无法撤销其自身没有的权限。
可选关键字 PRIVILEGES
符合 SQL 标准。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
视图
- 要撤销其权限的视图。
-
grantee
指定其权限被撤销的用户,可以为以下用户之一:
CASCADE
I
如果目标被授予者具有将指定权限扩展到其他用户的授予选项,则 CASCADE
会指定搜索这些用户并同时撤销他们的权限。
示例
撤销用户 Joe
对视图 test_view
的 SELECT 权限。
=> REVOKE SELECT ON test_view FROM Joe;
REVOKE PRIVILEGE
另请参阅
31 - ROLLBACK
结束当前事务,并丢弃在事务期间发生的所有更改。
语法
ROLLBACK [ WORK | TRANSACTION ]
参数
WORK | TRANSACTION
- 不起任何作用;它们是可选的关键字,目的是提高可读性。
特权
无
注意
回退某项操作时,也会回退该操作获取的任何锁。
ABORT 是 ROLLBACK 的同义词。
示例
此示例显示了如何从某项 DELETE 事务执行回退。
=> SELECT * FROM sample_table;
a
---
1
(1 row)
=> DELETE FROM sample_table WHERE a = 1;
=> SELECT * FROM sample_table;
a
---
(0 rows)
=> ROLLBACK;
=> SELECT * FROM sample_table;
a
---
1
(1 row)
此示例显示了如何回退自 BEGIN 语句以来所做的更改。
=> BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;
BEGIN
=> ROLLBACK TRANSACTION;
ROLLBACK
另请参阅
32 - ROLLBACK TO SAVEPOINT
回退自建立给定的保存点以来已在事务中输入的所有命令。
语法
ROLLBACK TO [SAVEPOINT] savepoint_name
参数
savepoint_name
- 指定要回退到的保存点名称。
特权
无
注意
示例
以下示例回退了在建立保存点 my_savepoint
之后输入的值 102 和 103。在提交时仅插入了值 101 和 104。
=> INSERT INTO product_key VALUES (101);
=> SAVEPOINT my_savepoint;
=> INSERT INTO product_key VALUES (102);
=> INSERT INTO product_key VALUES (103);
=> ROLLBACK TO SAVEPOINT my_savepoint;
=> INSERT INTO product_key VALUES (104);
=> COMMIT;
另请参阅
33 - SAVE QUERY
保存输入查询以便与自定义定向查询相关联。
语法
SAVE QUERY input-query
参数
- input‑query
- 要与自定义定向查询相关联的输入查询。输入查询仅支持一个优化器提示
:v
。
特权
超级用户
描述
SAVE QUERY 保存指定输入查询以供 CREATE DIRECTED QUERY CUSTOM 的下一个调用使用。CREATE DIRECTED QUERY CUSTOM 将已保存的查询与其带注释的查询实参匹配,以创建定向查询。两种语句必须在同一用户会话中发起。
已保存的查询保持可用,直至发生以下事件之一:
当心
Vertica 将保存的查询与定向查询相关联,而不检查输入查询和带注释的查询是否兼容。请小心安排 SAVE QUERY 和 CREATE DIRECTED QUERY CUSTOM 的顺序,以使保存的查询和定向查询正确匹配。
示例
请参阅自定义定向查询。
34 - SAVEPOINT
在事务内创建称之为保存点的特殊标记。创建保存点后,它允许回退所有已执行的命令,将事务还原到创建保存点时其所在的状态。
提示
保存点在创建嵌套事务时非常有用。例如,子例程开始时可能会创建保存点。这样,可在必要时回退子例程的结果。
语法
SAVEPOINT savepoint_name
参数
savepoint_name
- 指定要创建的保存点的名称。
特权
无
注意
示例
以下示例显示了保存点如何确定事务内可回退的值。创建保存点“my_savepoint”后输入的值 102 和 103 已回退。在提交时仅插入了值 101 和 104。
=> INSERT INTO T1 (product_key) VALUES (101);
=> SAVEPOINT my_savepoint;
=> INSERT INTO T1 (product_key) VALUES (102);
=> INSERT INTO T1 (product_key) VALUES (103);
=> ROLLBACK TO SAVEPOINT my_savepoint;
=> INSERT INTO T1 (product_key) VALUES (104);
=> COMMIT;
=> SELECT product_key FROM T1;
.
.
.
101
104
(2 rows)
另请参阅
35 - SELECT
从一个或多个数据源返回结果集:表、视图、联接表和已命名查询。
语法
[ AT epoch ] [ WITH-clause ] SELECT [ ALL | DISTINCT ]
{ * | { MATCH_COLUMNS('pattern') | expression [ [AS] alias ] }[,...] }
[ into-table-clause ]
[ from-clause ]
[ where-clause ]
[ time-series-clause ]
[ group-by-clause[,...] ]
[ having-clause[,...] ]
[ match-clause ]
[ union-clause ]
[ intersect-clause ]
[ except-clause ]
[ order-by-clause [ offset-clause ]]
[ limit-clause ]
[ FOR UPDATE [ OF table-name[,...] ] ]
注意
SELECT 语句还可以嵌入各种指令或*提示*,可用于控制给定查询的处理方式,例如,联接提示(如强制执行联接类型(合并或哈希联接)的 JTYPE)。
有关使用 Vertica 提示的详细信息,请参阅提示。
参数
-
AT epoch
- 返回指定时期的数据,其中 epoch 为以下几项之一:
-
EPOCH LATEST:返回数据直到当前时期(但不包括当前时期)。结果集包括来自最新提交的 DML 事务的数据。
-
EPOCH integer:返回数据直到 integer 指定的时期(包括该指定时期)。
-
TIME 'timestamp':从 timestamp 指定的时期返回数据。
注意
这些选项用于查询临时表或外部表。
有关 Vertica 如何使用时期的详细信息,请参阅时期。
有关详细信息,请参阅历史查询。
ALL | DISTINCT
-
ALL
(默认值):保留结果集或组中的重复行。
-
DISTINCT
:移除结果集或组中的重复行。
ALL
或 DISTINCT
限定符必须紧跟在 SELECT
关键字后。只能有一个关键字实例出现在选择列表中。
*
- 列出查询的表中的所有列。
当心
选择查询的表中的所有列会产生一个极大和极宽的结果集,这会对性能产生不利影响。
-
MATCH_COLUMNS('pattern')
- 返回查询的表中与模式匹配的所有列。
-
expression [[AS] alias]
- 一个表达式,通常解析为查询的表中的列数据,例如,在 FROM 子句中指定的 列的名称;此外:
您可以选择性地为每个列表达式分配一个临时别名,并在 SELECT 语句的其他位置(例如,在查询谓词或 ORDER BY 子句中)引用该别名。Vertica 使用别名作为查询输出中的列标题。
FOR UPDATE
- 指定对查询中指定的所有表获取 X 锁定,最常在
READ COMMITTED
隔离中使用。
FOR UPDATE
需要对查询的表具有更新/删除权限,且无法从只读事务中发出。
特权
非超级用户:
-
对架构的 USAGE 权限
-
对表或视图的 SELECT 权限
注意
作为视图所有者,只有在以下情况之一为真时,您才能授予其他用户对视图的 SELECT 权限:
示例
当多个客户端在以下示例查询中运行事务时,如果未使用 FOR UPDATE
,则将发生死锁。两个事务获取 S 锁,当两者尝试升级到 X 锁时,将遇到死锁:
=> SELECT balance FROM accounts WHERE account_id=3476 FOR UPDATE;
...
=> UPDATE accounts SET balance = balance+10 WHERE account_id=3476;
=> COMMIT;
另请参阅
35.1 - EXCEPT 子句
合并两个或多个 SELECT 查询。EXCEPT 返回在右侧查询中未查找到的左侧查询特定结果。
注意
MINUS 是 EXCEPT 的别名。
语法
SELECT
EXCEPT except‑query[...]
[ ORDER BY { column-name | ordinal-number } [ ASC | DESC ] [,...] ]
[ LIMIT { integer | ALL } ]
[ OFFSET integer ]
注意
-
使用 EXCEPT 子句可从 SELECT 语句中筛选出特定结果。EXCEPT 查询对两个或更多 SELECT 查询的结果执行操作。它只返回不同时存在于右侧查询中的左侧查询中的行。
-
除非用括号另作指示,否则 Vertica 会从左向右评估同一 SELECT 查询中的多个 EXCEPT 子句。
-
不能将 ALL 关键字与 EXCEPT 查询一起使用。
-
各 SELECT 语句的结果必须是可合并的。各语句必须返回相同数量的列,且对应列的数据类型必须兼容。例如,不能对 INTEGER 类型的列和 VARCHAR 类型的列使用 EXCEPT 子句。如果语句不满足这些条件,Vertica 将返回错误。
注意
数据类型强制转换表列出了哪些数据类型可以转换为其他数据类型。如果一种数据类型可转换为其他数据类型,则这两种数据类型兼容。
-
您可以在 FROM、WHERE 和 HAVING 子句中使用 EXCEPT。
-
您可以通过在语句中加入 ORDER BY 操作的方式对 EXCEPT 操作的结果进行排序。编写 ORDER BY 列表时,请指定最左侧 SELECT 语句中的列名称,或者指定指示排序依据列的位置的整数。
-
由于最右侧的查询指定 Vertica 对 EXCEPT 操作的结果执行操作,因此 EXCEPT 查询中最右侧的 ORDER BY、LIMIT 或 OFFSET 子句不需要加括号。包含在 SELECT 查询中且之前出现在 EXCEPT 查询中的任何 ORDER BY、LIMIT 或 OFFSET 子句都必须括在圆括号中。
-
Vertica 支持 EXCEPT 非相关子查询谓词。例如:
=> SELECT * FROM T1
WHERE T1.x IN
(SELECT MAX(c1) FROM T2
EXCEPT
SELECT MAX(cc1) FROM T3
EXCEPT
SELECT MAX(d1) FROM T4);
示例
假设有下面三个表:
Company_A
Id | emp_lname | dept | sales
------+-----------+----------------+-------
1234 | Stephen | auto parts | 1000
5678 | Alice | auto parts | 2500
9012 | Katherine | floral | 500
3214 | Smithson | sporting goods | 1500
(4 rows)
Company_B
Id | emp_lname | dept | sales
------+-----------+-------------+-------
4321 | Marvin | home goods | 250
8765 | Bob | electronics | 20000
9012 | Katherine | home goods | 500
3214 | Smithson | home goods | 1500
(4 rows)
Company_C
Id | emp_lname | dept | sales
------+-----------+----------------+-------
3214 | Smithson | sporting goods | 1500
5432 | Madison | sporting goods | 400
7865 | Cleveland | outdoor | 1500
1234 | Stephen | floral | 1000
(4 rows)
以下查询将返回存在于 Company_A 内但不存在于 Company_B 内的员工的 ID 和姓氏:
=> SELECT id, emp_lname FROM Company_A
EXCEPT
SELECT id, emp_lname FROM Company_B;
id | emp_lname
------+-----------
1234 | Stephen
5678 | Alice
(2 rows)
以下查询将按照员工的姓氏对上一查询的结果进行排序:
=> SELECT id, emp_lname FROM Company_A
EXCEPT
SELECT id, emp_lname FROM Company_B
ORDER BY emp_lname ASC;
id | emp_lname
------+-----------
5678 | Alice
1234 | Stephen
(2 rows)
如果按列位置排序,查询将返回相同结果:
=> SELECT id, emp_lname FROM Company_A
EXCEPT
SELECT id, emp_lname FROM Company_B
ORDER BY 2 ASC;
id | emp_lname
------+-----------
5678 | Alice
1234 | Stephen
(2 rows)
以下查询将返回存在于 Company_A 内但不存在于 Company_B 或 Company_C 内的员工的 ID 和姓氏:
=> SELECT id, emp_lname FROM Company_A
EXCEPT
SELECT id, emp_lname FROM Company_B
EXCEPT
SELECT id, emp_lname FROM Company_C;
id | emp_lname
------+-----------
5678 | Alice
(1 row)
以下查询将显示不匹配数据类型的结果:
=> SELECT id, emp_lname FROM Company_A
EXCEPT
SELECT emp_lname, id FROM Company_B;
ERROR 3429: For 'EXCEPT', types int and varchar are inconsistent
DETAIL: Columns: id and emp_lname
以下示例使用 VMart 示例数据库,将返回通过商店购买商品且购买金额已超过 500 美元的康涅狄格州客户,但不包括现金支付的客户:
=> SELECT customer_key, customer_name FROM public.customer_dimension
WHERE customer_key IN (SELECT customer_key FROM store.store_sales_fact
WHERE sales_dollar_amount > 500
EXCEPT
SELECT customer_key FROM store.store_sales_fact
WHERE tender_type = 'Cash')
AND customer_state = 'CT';
customer_key | customer_name
--------------+----------------------
15084 | Doug V. Lampert
21730 | Juanita F. Peterson
24412 | Mary U. Garnett
25840 | Ben Z. Taylor
29940 | Brian B. Dobisz
32225 | Ruth T. McNulty
33127 | Darlene Y. Rodriguez
40000 | Steve L. Lewis
44383 | Amy G. Jones
46495 | Kevin H. Taylor
(10 rows)
另请参阅
35.2 - FROM 子句
要查询的数据源的逗号分隔列表。
语法
FROM dataset[,...] [ TABLESAMPLE(percent) ]
参数
-
dataset
- 要查询的一组数据,为以下几项之一:
-
TABLESAMPLE(percent)
- 指定返回记录的随机采样,其中 percent 指定近似采样大小。percent 值必须介于 0 和 100 之间(不含这两个值),且可以包含十进制值。无法保证返回的记录数是指定的确切百分比。
数据的所有行被选中的机会均等。Vertica 在应用其他查询筛选器之前执行采样。
示例
统计 customer_dimension
表中的所有记录:
=> SELECT COUNT(*) FROM customer_dimension;
COUNT
-------
50000
(1 row)
返回表 customer_dimension
中一小部分行的采样:
=> SELECT customer_name, customer_state FROM customer_dimension TABLESAMPLE(0.5) WHERE customer_state='IL';
customer_name | customer_state
---------------------+----------------
Amy Y. McNulty | IL
Daniel C. Nguyen | IL
Midori O. Greenwood | IL
Meghan U. Lampert | IL
Tiffany Y. Lang | IL
Laura S. King | IL
Steve T. Nguyen | IL
Craig S. Webber | IL
Luigi A. Lewis | IL
Mark W. Williams | IL
(10 rows)
35.2.1 - Table-reference
语法
[[database.]schema.]table[ [AS] alias]
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 逻辑架构中的表。
-
[AS] alias
- 用于引用 table 的临时名称。
35.2.2 - Joined-table
指定如何联接表。
语法
table‑reference [join-type] JOIN table-reference[ TABLESAMPLE(sampling‑pct) ] [ ON join‑predicate ]
参数
- table‑reference
- 表或其他的 joined-table。
- join-type
- 有效值:
TABLESAMPLE
- 指定采用简单的随机采样返回近似的记录百分比。总潜在返回集中的所有行包含在采样中的机会均等。Vertica 在应用查询中的其他筛选器之前执行此采样操作。无法保证返回的记录数是 sampling‑pct 定义的确切的记录百分比。
TABLESAMPLE
选项仅可用于用户定义的表和数据收集器 (DC) 表。不支持视图和系统表。
- sampling‑pct
- 指定作为采样的一部分返回的记录百分比。该值必须大于 0 且小于 100。
-
开启 join‑predicate
- 等值联接基于联接表中的一个或多个列。其对于
NATURAL
和 CROSS
联接无效,对于所有其他联接类型都是必需的。
备选联接语法选项
Vertica 支持两种较旧的联接语法约定:
-
WHERE
子句中的联接谓词指定的表联接
-
USING
子句指定的表联接
有关详细信息,请参阅联接语法。
示例
下列 SELECT
语句使用 TABLESAMPLE
选项限定其 JOIN
子句:
=> SELECT user_id.id, user_name.name FROM user_name TABLESAMPLE(50)
JOIN user_id TABLESAMPLE(50) ON user_name.id = user_id.id;
id | name
------+--------
489 | Markus
2234 | Cato
763 | Pompey
(3 rows)
35.3 - GROUP BY 子句
在 GROUP BY
中将 SELECT
子句与聚合函数一起使用可以收集多个记录中的数据。Vertica 将结果分组成为一个或多个与表达式匹配的行集。
不包含聚合的 GROUP BY
子句的使用方式类似于 SELECT DISTINCT
。
ROLLUP
是对 GROUP BY
子句的扩展。 ROLLUP
执行小计聚合。
语法
GROUP BY [/*+GBYTYPE(algorithm)*/] { expression | aggregate‑expression }[,...]
参数
-
/*+GBYTYPE(algorithm)*/
- 指定实现
GROUP BY
子句时优先级高于 Vertica 查询优化器可能选择的算法的算法。可以将 algorithm 设置为以下值之一:
有关两种算法的详细信息,请参阅 GROUP BY 实施选项。
- 表达式
- 任何表达式,包括 FROM 子句中指定的表中的常数和列引用。例如:
column,... column, (expression)
- aggregate‑expression
- 列、表达式、
CUBE, GROUPING SETS
或 ROLLUP
聚合按顺序排列的列表。
可以将 CUBE
和 ROLLUP
聚合包括在一个 GROUPING SETS
聚合内。 CUBE
和 ROLLUP
聚合可产生大量输出。在这种情况下,使用 GROUPING SETS
仅返回某些结果。
不能将任何聚合包含在 CUBE
或 ROLLUP
表达式中。
可以将多个 GROUPING SETS
、CUBE
或 ROLLUP
聚合附加到同一个查询中。例如:
GROUP BY a,b,c,d, ROLLUP(a,b)
GROUP BY a,b,c,d, CUBE((a,b),c,d)
GROUP BY a,b,c,d, CUBE(a,b), ROLLUP (c,d)
GROUP BY ROLLUP(a), CUBE(b), GROUPING SETS(c)
GROUP BY a,b,c,d, GROUPING SETS ((a,d),(b,c),CUBE(a,b))
GROUP BY a,b,c,d, GROUPING SETS ((a,d),(b,c),(a,b),(a),(b),())
用法注意事项
-
表达式不能包括聚合函数。但是,可以将 GROUP BY 子句与 CUBE、GROUPING SETS 和 ROLLUP
一起使用,以返回每个组的汇总值。
-
创建 GROUP BY 子句时,必须包括 SELECT
列表中显示的所有非聚合列。
-
如果 GROUP BY
子句包括 WHERE
子句,Vertica 会忽略所有不满足 WHERE
子句的行。
示例
此示例显示了如何将 WHERE
子句与 GROUP BY
一起使用。在这种情况下,示例检索姓氏以 S 开头的所有员工,忽略所有不符合此条件的行。GROUP BY
子句使用 ILIKE
函数仅检索以 S 开头的姓氏。聚合函数 SUM
计算每个组的总休假天数。
=> SELECT employee_last_name, SUM(vacation_days)
FROM employee_dimension
WHERE employee_last_name ILIKE 'S%'
GROUP BY employee_last_name;
employee_last_name | SUM
--------------------+------
Sanchez | 2892
Smith | 2672
Stein | 2660
(3 rows)
以下示例中的 GROUP BY
子句按供应商地区和供应商地区的最大交易对结果分组:
=> SELECT vendor_region, MAX(deal_size) AS "Biggest Deal"
FROM vendor_dimension
GROUP BY vendor_region;
vendor_region | Biggest Deal
---------------+--------------
East | 990889
MidWest | 699163
NorthWest | 76101
South | 854136
SouthWest | 609807
West | 964005
(6 rows)
以下查询使用 HAVING
子句修改上一个查询,该子句指定仅返回最大交易规模超过 $900,000 的组:
=> SELECT vendor_region, MAX(deal_size) as "Biggest Deal"
FROM vendor_dimension
GROUP BY vendor_region
HAVING MAX(deal_size) > 900000;
vendor_region | Biggest Deal
---------------+--------------
East | 990889
West | 964005
(2 rows)
可以将 GROUP BY
子句与标量类型的一维数组一起使用。在以下示例中,grants 为 ARRAY[VARCHAR],grant_values 为 ARRAY[INT]。
=> CREATE TABLE employees (id INT, department VARCHAR(50), grants ARRAY[VARCHAR], grant_values ARRAY[INT]);
=> COPY employees FROM STDIN;
42|Physics|[US-7376,DARPA-1567]|[65000,135000]
36|Physics|[US-7376,DARPA-1567]|[10000,25000]
33|Physics|[US-7376]|[30000]
36|Astronomy|[US-7376,DARPA-1567]|[5000,4000]
\.
=> SELECT department, grants, SUM(apply_sum(grant_values)) FROM employees GROUP BY grants, department;
department | grants | SUM
------------+--------------------------+--------
Physics | ["US-7376","DARPA-1567"] | 235000
Astronomy | ["US-7376","DARPA-1567"] | 9000
Physics | ["US-7376"] | 30000
(3 rows)
不包含聚合的 GROUP BY
子句的使用方式类似于 SELECT DISTINCT
。例如,以下两个查询返回相同的结果:
=> SELECT DISTINCT household_id FROM customer_dimension;
=> SELECT household_id FROM customer_dimension GROUP BY household_id;
另请参阅
35.3.1 - ROLLUP 聚合
作为 GROUP BY 子句的扩展来自动执行小计聚合。 ROLLUP
在单个 SQL 查询内的不同级别跨多个维度执行聚合。
您可以将 ROLLUP
子句与三个分组函数一起使用:
语法
ROLLUP grouping-expression[,...]
参数
- group‑expression
- 以下两项中的一个或两个:
-
一个包含常数和 FROM
指定的表中的列引用且不是聚合或分组函数的表达式。例如:
column1, (column2+1), column3+column4
-
一个多级表达式,是以下几项之一:
-
ROLLUP
-
CUBE
-
GROUPING SETS
限制
GROUP BY ROLLUP
不会对结果排序。要对数据进行排序,ORDER BY
子句必须跟在 GROUP BY
子句之后。
聚合级别
如果 n 为分组列的数量,则 ROLLUP
将生成 n+1 个小计和总计级别。由于 ROLLUP
将删除每一步中最右侧的列,所以请仔细指定列顺序。
假设 ROLLUP(A, B, C)
创建 4 个组:
由于 ROLLUP
将删除每一步中最右侧的列,所以没有 (A, C)
和 (B, C)
组。
如果将 2 个或更多的列括在圆括号内,GROUP BY
会将其视为单一实体。例如:
-
ROLLUP(A, B, C)
将创建 4 个组:
(A, B, C)
(A, B)
(A)
()
-
ROLLUP((A, B), C)
会将 (A, B)
视为单一实体并创建 3 个组:
(A, B, C)
(A, B)
()
示例:聚合完整数据集
以下示例显示了如何使用 GROUP BY
子句确定几年内家庭用电和书籍的开支。SUM
聚合函数计算每年在各类别上的总开销。
假设您有一个表,其中包含关于家庭书籍和用电开支的信息:
=> SELECT * FROM expenses ORDER BY Category, Year;
Year | Category | Amount
------+-------------+--------
2005 | Books | 39.98
2007 | Books | 29.99
2008 | Books | 29.99
2005 | Electricity | 109.99
2006 | Electricity | 109.99
2007 | Electricity | 229.98
对于 expenses
表,ROLLUP
计算 2005–2007 年之间各类别的小计:
-
书籍:$99.96
-
用电:$449.96
-
总计:$549.92。
使用 ORDER BY
子句对结果排序:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY ROLLUP(Category, Year) ORDER BY 1,2, GROUPING_ID();
Category | Year | SUM
-------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Books | | 99.96
Electricity | 2005 | 109.99
Electricity | 2006 | 109.99
Electricity | 2007 | 229.98
Electricity | | 449.96
| | 549.92
示例:将 ROLLUP 与 HAVING 子句一起使用
此示例说明如何将 ROLLUP
与 HAVING 子句一起使用,以限制 GROUP BY
结果。以下查询只生成 ROLLUP
类别,其中 year
根据 GROUPING
函数中的表达式得出小计:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY ROLLUP(Category,Year) HAVING GROUPING(Year)=1
ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
-------------+------+--------
Books | | 99.96
Electricity | | 449.96
| | 549.92
下一个示例对 (Category
, Year
) 而非完整结果进行汇总。GROUPING_ID
函数指定聚合 3 个以下的级别:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY ROLLUP(Category,Year) HAVING GROUPING_ID(Category,Year)<3
ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
-------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Books | | 99.96
Electricity | 2005 | 109.99
Electricity | 2006 | 109.99
Electricity | 2007 | 229.98
Electricity | | 449.96
另请参阅
35.3.2 - CUBE 聚合
作为 GROUP BY 子句的扩展,自动对指定列执行所有可能的聚合。
您可以将 ROLLUP 子句与三个分组函数一起使用:
语法
GROUP BY group-expression[,...]
参数
-
group-expression
- 以下两项中的一个或两个:
-
一个包含常数和 FROM
指定的表中的列引用且不是聚合或分组函数的表达式。例如:
column1, (column2+1), column3+column4
-
一个多级表达式,是以下几项之一:
-
ROLLUP
-
CUBE
-
GROUPING SETS
限制
- GROUP BY CUBE 不对数据排序。如果要对数据排序,请使用 ORDER BY 子句。ORDER BY 子句必须跟在 GROUP BY 子句的后面。
- CUBE 可以用在 GROUPING SETS 表达式中,但不可以用在 ROLLUP 表达式或另一个 CUBE 表达式中。
CUBE 聚合级别
如果 n 是指分组列的数量,则 CUBE 将生成 2n 个聚合级别。例如:
CUBE (A, B, C) 将生成所有可能的分组,即产生以下八个组:
- (A, B, C)
- (A, B)
- (A, C)
- (B, C)
- (A)
- (B)
- (C)
- ()
如果增加 CUBE 列数,则 CUBE 分组数会呈指数增加。CUBE 查询可能会占用大量资源,并产生不感兴趣的组合。在这种情况下,请考虑使用 GROUPING SETS 聚合,因为通过它可以选择特定的分组。
示例
使用 CUBE 返回所有分组
假设您有一个表,其中包含关于家庭书籍和用电开支的信息:
=> SELECT * FROM expenses ORDER BY Category, Year;
Year | Category | Amount
------+-------------+--------
2005 | Books | 39.98
2007 | Books | 29.99
2008 | Books | 29.99
2005 | Electricity | 109.99
2006 | Electricity | 109.99
2007 | Electricity | 229.98
使用 CUBE 聚合按类别和年份聚合数据:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY CUBE(Category, Year) ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
-------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Books | | 99.96
Electricity | 2005 | 109.99
Electricity | 2006 | 109.99
Electricity | 2007 | 229.98
Electricity | | 449.96
| 2005 | 149.97
| 2006 | 109.99
| 2007 | 259.97
| 2008 | 29.99
| | 549.92
结果会包含每个类别和年份的小计以及总计 ($549.92)。
将 CUBE 与 HAVING 子句一起使用
此示例显示了如何限制 GROUP BY 结果以及如何将 CUBE 聚合与 HAVING 子句结合使用。此查询仅返回类别合计和总计:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY CUBE(Category,Year) HAVING GROUPING(Year)=1;
Category | Year | SUM
-------------+------+--------
Books | | 99.96
Electricity | | 449.96
| | 549.92
下一个查询仅返回每个年度两种类别的聚合。GROUPING ID 函数指定忽略总计 ($549.92):
=> SELECT Category, Year, SUM (Amount) FROM expenses
GROUP BY CUBE(Category,Year) HAVING GROUPING_ID(Category,Year)<2
ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Books | | 99.96
Electrical | 2005 | 109.99
Electrical | 2006 | 109.99
Electrical | 2007 | 229.98
Electrical | | 449.96
另请参阅
35.3.3 - GROUPING SETS 聚合
GROUPING SETS
聚合是对在您指定的分组上自动执行小计聚合的
GROUP BY
子句的扩展。
您可以将 GROUPING SETS
子句与三个分组函数一起使用:
若要对数据排序,请使用
ORDER BY
子句。ORDER BY
子句必须跟在 GROUP BY
子句之后。
语法
GROUP BY group-expression[,...]
参数
-
group-expression
- 以下两项中的一个或两个:
-
一个包含常数和 FROM
指定的表中的列引用且不是聚合或分组函数的表达式。例如:
column1, (column2+1), column3+column4
-
一个多级表达式,是以下几项之一:
-
ROLLUP
-
CUBE
-
GROUPING SETS
定义分组
GROUPING SETS 允许您准确指定结果中需要哪些组。您还可以按照以下方式联接分组:
以下示例子句的分组结果将会显示。
示例:选择分组
此示例显示了如何仅选择您需要的分组。假设您仅希望聚合列,并且您不需要总计。第一个查询会忽略合计。在第二个查询中,您将 () 添加到 GROUPING SETS 列表以获得合计。使用 ORDER BY 子句按分组对结果进行排序:
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY GROUPING SETS((Category, Year), (Year))
ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Electrical | 2005 | 109.99
Electrical | 2006 | 109.99
Electrical | 2007 | 229.98
| 2005 | 149.97
| 2006 | 109.99
| 2007 | 259.97
| 2008 | 29.99
=> SELECT Category, Year, SUM(Amount) FROM expenses
GROUP BY GROUPING SETS((Category, Year), (Year), ())
ORDER BY 1, 2, GROUPING_ID();
Category | Year | SUM
------------+------+--------
Books | 2005 | 39.98
Books | 2007 | 29.99
Books | 2008 | 29.99
Electrical | 2005 | 109.99
Electrical | 2006 | 109.99
Electrical | 2007 | 229.98
| 2005 | 149.97
| 2006 | 109.99
| 2007 | 259.97
| 2008 | 29.99
| | 549.92
另请参阅
35.4 - HAVING 子句
筛选 GROUP BY 子句的结果。根据语义,HAVING 子句必须发生在 GROUP BY 操作之后。该子句已添加到 SQL 标准,因为 WHERE 子句无法指定聚合函数。
语法
HAVING condition[,...]
参数
- condition
- 明确引用分组列,除非引用显示在聚合函数中。
示例
以下示例返回薪资大于 $800,000 的员工:
=> SELECT employee_last_name, MAX(annual_salary) as highest_salary FROM employee_dimension
GROUP BY employee_last_name HAVING MAX(annual_salary) > 800000 ORDER BY highest_salary DESC;
employee_last_name | highest_salary
--------------------+----------------
Sanchez | 992363
Vogel | 983634
Vu | 977716
Lewis | 957949
Taylor | 953373
King | 937765
Gauthier | 927335
Garnett | 903104
Bauer | 901181
Jones | 885395
Rodriguez | 861647
Young | 846657
Greenwood | 837543
Overstreet | 831317
Garcia | 811231
(15 rows)
35.5 - INTERSECT 子句
计算两个或更多 SELECT 查询结果的交集。INTERSECT 返回 INTERSECT 操作数左右两侧查询的唯一值。
语法
select‑stmt
INTERSECT query[...]
[ order-by-clause [ offset-clause ]]
[ limit-clause ]
注意
-
INTERSECT 子句返回 SELECT 查询结果的交集。INTERSECT 查询对两个或更多 SELECT 查询的结果执行操作。INTERSECT 仅返回所有指定查询所得到的行。
-
不能将 ALL 关键字与 INTERSECT 查询一起使用。
-
每个 SELECT 查询的结果必须是联集兼容的;必须返回相同数目的列,而且相应的列必须含有兼容的数据类型。例如,不能对 INTERSECT 类型的列和 VARCHAR 类型的列使用 EXCEPT 子句。如果 SELECT 查询不满足这些条件,Vertica 将返回错误。
注意
数据类型强制转换表列出了哪些数据类型可以转换为其他数据类型。如果一种数据类型可转换为其他数据类型,则这两种数据类型兼容。
-
使用 ORDER BY 子句为 INTERSECT 操作结果进行排序。在 ORDER BY 列表中,指定最左侧 SELECT 语句的列,或指定所按照排序列的所在位置。
-
您可以在 FROM、WHERE 和 HAVING 子句中使用 INTERSECT。
-
由于最右侧的查询指定 Vertica 对 INTERSECT 操作的结果执行操作,因此 INTERSECT 查询的 ORDER BY、LIMIT 或者 OFFSET 子句不需要加括号。包含在 SELECT 查询中且之前出现在 INTERSECT 查询中的任何 ORDER BY、LIMIT 或 OFFSET 子句都必须括在圆括号中。
-
排序列名称来自于第一个 select。
-
Vertica 支持 INTERSECT 非相关子查询谓词。例如:
=> SELECT * FROM T1
WHERE T1.x IN
(SELECT MAX(c1) FROM T2
INTERSECT
SELECT MAX(cc1) FROM T3
INTERSECT
SELECT MAX(d1) FROM T4);
示例
假设有下面三个表:
Company_A
id emp_lname dept sales
------+------------+----------------+-------
1234 | Stephen | auto parts | 1000
5678 | Alice | auto parts | 2500
9012 | Katherine | floral | 500
3214 | Smithson | sporting goods | 1500
Company_B
id emp_lname dept sales
------+------------+-------------+-------
4321 | Marvin | home goods | 250
9012 | Katherine | home goods | 500
8765 | Bob | electronics | 20000
3214 | Smithson | home goods | 1500
Company_C
id | emp_lname | dept | sales
------+-----------+----------------+-------
3214 | Smithson | sporting goods | 1500
5432 | Madison | sporting goods | 400
7865 | Cleveland | outdoor | 1500
1234 | Stephen | floral | 1000
以下查询返回 Company_A 和 Company_B 中都包含的 ID 号以及员工姓氏:
=> SELECT id, emp_lname FROM Company_A
INTERSECT
SELECT id, emp_lname FROM Company_B;
id | emp_lname
------+-----------
3214 | Smithson
9012 | Katherine
(2 rows)
接下来的查询返回相同的两个员工,销售额降序排列:
=> SELECT id, emp_lname, sales FROM Company_A
INTERSECT
SELECT id, emp_lname, sales FROM Company_B
ORDER BY sales DESC;
id | emp_lname | sales
------+-----------+-------
3214 | Smithson | 1500
9012 | Katherine | 500
(2 rows)
接下来的查询返回同时为两个公司工作而在 Company_B 公司中的销售额超过 1000 的员工姓名:
=> SELECT id, emp_lname, sales FROM Company_A
INTERSECT
(SELECT id, emp_lname, sales FROM company_B WHERE sales > 1000)
ORDER BY sales DESC;
id | emp_lname | sales
------+-----------+-------
3214 | Smithson | 1500
(1 row)
接下来的查询返回同时为三个公司工作的员工 ID 号以及员工姓氏。
=> SELECT id, emp_lname FROM Company_A
INTERSECT
SELECT id, emp_lname FROM Company_B
INTERSECT
SELECT id, emp_lname FROM Company_C;
id | emp_lname
------+-----------
3214 | Smithson
(1 row)
接下来的查询返回的是不匹配的数据类型结果;这两个查询不是联集兼容的:
=> SELECT id, emp_lname FROM Company_A
INTERSECT
SELECT emp_lname, id FROM Company_B;
ERROR 3429: For 'INTERSECT', types int and varchar are inconsistent
DETAIL: Columns: id and emp_lname
使用 VMart 示例数据库,接下来的查询返回有关通过在线销售渠道购买商品且购买金额超过 400 美元和 500 美金的所有康涅狄格州客户的信息:
=> SELECT customer_key, customer_name from public.customer_dimension
WHERE customer_key IN (SELECT customer_key
FROM online_sales.online_sales_fact
WHERE sales_dollar_amount > 400
INTERSECT
SELECT customer_key FROM online_sales.online_sales_fact
WHERE sales_dollar_amount > 500)
AND customer_state = 'CT' ORDER BY customer_key;
customer_key | customer_name
--------------+------------------------
39 | Sarah S. Winkler
44 | Meghan H. Overstreet
70 | Jack X. Cleveland
103 | Alexandra I. Vu
110 | Matt . Farmer
173 | Mary R. Reyes
188 | Steve G. Williams
233 | Theodore V. McNulty
250 | Marcus E. Williams
294 | Samantha V. Young
313 | Meghan P. Pavlov
375 | Sally N. Vu
384 | Emily R. Smith
387 | Emily L. Garcia
...
上一个查询和下一个查询是等效的,并且返回相同的结果:
=> SELECT customer_key,customer_name FROM public.customer_dimension
WHERE customer_key IN (SELECT customer_key
FROM online_sales.online_sales_fact
WHERE sales_dollar_amount > 400
AND sales_dollar_amount < 500)
AND customer_state = 'CT' ORDER BY customer_key;
另请参阅
35.6 - INTO TABLE 子句
从查询结果集中创建表。
语法
永久表:
INTO [TABLE] [[database.]schema.]table
临时表:
INTO [scope] TEMP[ORARY] [TABLE] [[database.]schema.]table
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
参数
- scope
- 指定临时表定义的可见性:
不论此设置如何,都可通过 ON COMMIT DELETE ROWS
和 ON COMMIT PRESERVE ROWS
关键字(见下文)设置临时表数据保留策略。
有关详细信息,请参阅创建临时表。
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
- 表
- 要创建的表的名称。
-
ON COMMIT { DELETE | PRESERVE } ROWS
- 指定数据为事务范围还是会话范围数据:
示例
以下 SELECT
语句包含一个 INTO TABLE
子句,该子句使用 customer_dimension
创建表 newTable
:
=> SELECT * INTO TABLE newTable FROM customer_dimension;
以下 SELECT
语句将创建临时表 newTempTable
。默认情况下,临时表是在全局范围创建的,因此该表定义对其他会话可见并一直存在,直到其被显式删除。不会将 customer_dimension
数据复制到新表中,且 Vertica 会发出相应的警告:
=> SELECT * INTO TEMP TABLE newTempTable FROM customer_dimension;
WARNING 4102: No rows are inserted into table "public"."newTempTable" because
ON COMMIT DELETE ROWS is the default for create temporary table
HINT: Use "ON COMMIT PRESERVE ROWS" to preserve the data in temporary table
CREATE TABLE
以下 SELECT
语句将创建本地临时表 newTempTableLocal
。表仅对在其中创建该表的会话可见,并在会话结束后自动删除。INTO TABLE
子句包括 ON COMMIT PRESERVE ROWS
,因此 Vertica 会将所有选择数据复制到新表中:
=> SELECT * INTO LOCAL TEMP TABLE newTempTableLocal ON COMMIT PRESERVE ROWS
FROM customer_dimension;
CREATE TABLE
35.7 - LIMIT 子句
指定要从整个结果集或从分区结果集的窗口返回的结果集行数最大值。
语法
应用于整个结果集:
LIMIT { num-rows | ALL }
应用于分区结果集的窗口:
LIMIT num‑rows OVER ( PARTITION BY {{< codevar >}}column‑expr‑x{{< /codevar >}}, ORDER BY {{< codevar >}}column‑expr‑y{{< /codevar >}} [ASC | DESC]
参数
- num‑rows
- 要返回的行的最大数量。
ALL
- 返回所有行,仅当 LIMIT 应用于整个结果集时才有效。
OVER()
- 指定如何就当前行而言对输入数据进行分区和排序。输入数据是查询在对 FROM、WHERE、GROUP BY 和 HAVING 子句求值之后返回的结果集。
有关详细信息,请参阅下面的将 LIMIT 与窗口分区结合使用。
限制返回的行
LIMIT 指定只返回已查询数据集中的前 k 行。行优先级通过查询的 ORDER BY 子句确定。
例如,以下查询将返回表 customer_dimension
中的前 10 行数据,按列 store_region
和 number_of_employees
的顺序排列:
=> SELECT store_region, store_city||', '||store_state location, store_name, number_of_employees
FROM store.store_dimension WHERE number_of_employees <= 12 ORDER BY store_region, number_of_employees LIMIT 10;
store_region | location | store_name | number_of_employees
--------------+----------------+------------+---------------------
East | Stamford, CT | Store219 | 12
East | New Haven, CT | Store66 | 12
East | New York, NY | Store122 | 12
MidWest | South Bend, IN | Store134 | 10
MidWest | Evansville, IN | Store30 | 11
MidWest | Green Bay, WI | Store27 | 12
South | Mesquite, TX | Store124 | 10
South | Cape Coral, FL | Store18 | 11
South | Beaumont, TX | Store226 | 11
South | Houston, TX | Store33 | 11
(10 rows)
将 LIMIT 与窗口分区结合使用
您可以使用 LIMIT 对查询结果应用窗口分区,并限制每个窗口中返回的行数:
SELECT ... FROM dataset LIMIT num‑rows OVER ( PARTITION BY column‑expr‑x, ORDER BY column‑expr‑y [ASC | DESC] )
其中查询 dataset 在每个 column‑expr‑x 分区中返回具有最高或最低 column‑expr‑y 值的 num‑rows 个行。
例如,以下语句对表 store.store_dimension
进行了查询并在结果集上指定了窗口分区。LIMIT 设置为 2,所以每个窗口分区最多只能显示两行。OVER
子句指定按 store_region
对结果集进行分区,其中每个分区窗口显示某个区域中员工人数最少的两个商店:
=> SELECT store_region, store_city||', '||store_state location, store_name, number_of_employees FROM store.store_dimension
LIMIT 2 OVER (PARTITION BY store_region ORDER BY number_of_employees ASC);
store_region | location | store_name | number_of_employees
--------------+---------------------+------------+---------------------
West | Norwalk, CA | Store43 | 10
West | Lancaster, CA | Store95 | 11
East | Stamford, CT | Store219 | 12
East | New York, NY | Store122 | 12
SouthWest | North Las Vegas, NV | Store170 | 10
SouthWest | Phoenix, AZ | Store228 | 11
NorthWest | Bellevue, WA | Store200 | 19
NorthWest | Portland, OR | Store39 | 22
MidWest | South Bend, IN | Store134 | 10
MidWest | Evansville, IN | Store30 | 11
South | Mesquite, TX | Store124 | 10
South | Beaumont, TX | Store226 | 11
(12 rows)
35.8 - MATCH 子句
允许您以搜索事件模式筛选大量历史数据的 SQL 扩展, MATCH 子句为解析分区、排序提供子类,并基于您定义的模式匹配结果表的行。
您指定一个由 DEFINE 子句中定义的事件类型组成的模式作为正则表达式,其中每个事件都与输入表中的一行对应。接下来,您可以在输入事件序列内搜索模式。模式匹配返回符合 PATTERN 子句的连续行序列。例如,模式 P
(A B* C
) 由三个事件类型组成:A、B 和 C,当 Vertica 在输入表中找到匹配时,相关模式实例必须是一个 A 类型事件,且后接零个或多个 B 类型事件和一个 C 类型事件。
如果您想在点击流分析中根据用户的 Web 浏览行为(页面点击)确定用户的操作,那么模式匹配就尤其有用。有关详细信息,请参阅事件系列模式匹配。
语法
MATCH ( [ PARTITION BY table‑column ] ORDER BY table‑column
DEFINE event‑name AS boolean‑expr [,...]
PATTERN pattern‑name AS ( regexp )
[ rows‑match‑clause ] )
参数
PARTITION BY
- 定义与 PATTERN 子句中定义的模式相匹配的窗口数据范围。分区子句通过 PATTERN 子句中定义的匹配模式将数据分区。使用 OEDER BY 子句对每个分区中的数据进行排序。如果忽略分区子句,则将整个数据集视为单个分区。
ORDER BY
- 定义与 PATTERN 子句中定义的模式相匹配的窗口数据范围。对于每个分区,顺序子句指定如何针对模式匹配对输入数据排序。
注意
ORDER BY 子句是强制性的。
DEFINE
- 定义在正则表达式中构成事件类型的 boolean 表达式。例如:
DEFINE
Entry AS RefURL NOT ILIKE '%website2.com%' AND PageURL ILIKE
'%website2.com%',
Onsite AS PageURL ILIKE '%website2.com%' AND Action='V',
Purchase AS PageURL ILIKE '%website2.com%' AND Action='P'
DEFINE 子句最多可接受 52 个事件。有关示例,请参阅 事件系列模式匹配。
- event‑name
- 每一行需要进行评估的事件名称,如前面示例中的
Entry, Onsite, Purchase
。
注意
事件名称不区分大小写,且与表和列具有相同的命名约定。
- boolean‑expr
- 返回 true 或 false 的表达式。boolean_expr 可包含 布尔运算符 和相关 (comparison) 运算符。例如:
Purchase AS PageURL ILIKE '%website2.com%' AND Action = 'P'
-
PATTERN pattern‑name
- 在 PATTERN 子句中定义的模式的名称,例如,P 是如下文定义的模式名称:
PATTERN P AS (...)
PATTERN 是由名称和正则表达式组成的搜索模式。
注意
Vertica 支持每次查询一个模式。
- regexp
- 一个正则表达式,由
DEFINE
子句中定义的事件类型和下面的一个或多个限定符组成。当 Vertica 评估 MATCH
子句时,正则表达式会识别满足表达式条件的行。
- rows‑match‑clause
- 指定如何解决单一行中评估为真的事件多于一个的问题,为以下几项之一:
-
ROWS MATCH ALL EVENTS
:如果单一行中的多个事件评估为真,Vertica 将返回以下错误:
ERROR: pattern events must be mutually exclusive
HINT: try using ROWS MATCH FIRST EVENT
-
ROWS MATCH FIRST EVENT
:如果给定行中的多个事件评估为真,Vertica 将使用该行的 SQL 语句中的第一个事件。
模式语意评估
-
SQL 子句的语意评估顺序是:FROM -> WHERE -> PATTERN MATCH -> SELECT。
-
数据根据 PARTITION BY 子句的规定分区。如果忽略分区子句,则将整个数据集视为单个分区。
-
对于每个分区,顺序子句指定如何针对模式匹配对输入数据排序。
-
对每一行的事件进行评估。一行可以具有 0、1 或 N 个事件评估为真。如果同一行中评估为真的事件超过一个,除非您指定 ROWS MATCH FIRST EVENT,否则 Vertica 将返回一个运行时错误。如果指定了 ROWS MATCH FIRST EVENT,且单一行中评估为真的事件多于一个,Vertica 将选择 SQL 语句中第一个定义的事件用于行。
-
Vertica 通过查找符合 PATTERN 子句中定义模式的连续行序列执行模式匹配。
对于每一个匹配,Vertica 将输出匹配行。并非匹配一部分的行(不满足一个或多个术语)不输出。
注释和限制
-
模式匹配查询中不允许使用 DISTINCT 和 GROUP BY/HAVING 子句。
-
下面的表达式不可用于 DEFINE 子句:
-
子查询,如 DEFINE X AS c IN ELECT c FROM table
-
分析函数,如 DEFINE X AS c <EA1) OVER (ORDER BY 1)
-
聚合函数,如 DEFINE X AS c <A1)
-
不可使用相同的模式名称定义不同的事件,例如,X 不允许执行下文:
DEFINE X AS c1 < 3
X AS c1 >= 3
-
与 MATCH 子句一起使用,Vertica MATCH 子句函数 提供关于模式的额外数据。例如,您可是使用函数返回表示与输入行相匹配的事件名称、匹配的序列号或匹配模式实例的分区范围内唯一标识符。
示例
例如,请参阅事件系列模式匹配。
另请参阅
35.8.1 - 事件系列模式匹配
搜索事件模式时,您可以使用 SQL MATCH 子句 语法来筛选大量历史数据。您可以将模式指定为正则表达式,然后可以在输入事件序列内搜索该模式。MATCH 提供了分析数据分区和排序的子句,以及对连续行集执行的模式匹配。
如果您想在点击流分析中根据用户的 Web 浏览行为(页面点击)确定用户的操作,那么模式匹配就尤其有用。典型的在线点击流漏斗是:
公司主页 -> 产品主页 -> 搜索 -> 结果 -> 在线购买
您可以使用此单击流漏斗,在用户的 Web 点击序列中搜索匹配并标识该用户:
-
登录公司主页
-
导航至产品页面
-
运行查询
-
单击搜索结果中的链接
-
购买
单击流漏斗架构
此主题中的示例使用了此点击流漏斗以及以下 clickstream_log
表架构:
=> CREATE TABLE clickstream_log (
uid INT, --user ID
sid INT, --browsing session ID, produced by previous sessionization computation
ts TIME, --timestamp that occurred during the user's page visit
refURL VARCHAR(20), --URL of the page referencing PageURL
pageURL VARCHAR(20), --URL of the page being visited
action CHAR(1) --action the user took after visiting the page ('P' = Purchase, 'V' = View)
);
INSERT INTO clickstream_log VALUES (1,100,'12:00','website1.com','website2.com/home', 'V');
INSERT INTO clickstream_log VALUES (1,100,'12:01','website2.com/home','website2.com/floby', 'V');
INSERT INTO clickstream_log VALUES (1,100,'12:02','website2.com/floby','website2.com/shamwow', 'V');
INSERT INTO clickstream_log values (1,100,'12:03','website2.com/shamwow','website2.com/buy', 'P');
INSERT INTO clickstream_log values (2,100,'12:10','website1.com','website2.com/home', 'V');
INSERT INTO clickstream_log values (2,100,'12:11','website2.com/home','website2.com/forks', 'V');
INSERT INTO clickstream_log values (2,100,'12:13','website2.com/forks','website2.com/buy', 'P');
COMMIT;
以下为 clickstream_log 表的输出:
=> SELECT * FROM clickstream_log;
uid | sid | ts | refURL | pageURL | action
-----+-----+----------+----------------------+----------------------+--------
1 | 100 | 12:00:00 | website1.com | website2.com/home | V
1 | 100 | 12:01:00 | website2.com/home | website2.com/floby | V
1 | 100 | 12:02:00 | website2.com/floby | website2.com/shamwow | V
1 | 100 | 12:03:00 | website2.com/shamwow | website2.com/buy | P
2 | 100 | 12:10:00 | website1.com | website2.com/home | V
2 | 100 | 12:11:00 | website2.com/home | website2.com/forks | V
2 | 100 | 12:13:00 | website2.com/forks | website2.com/buy | P
(7 rows)
示例
此示例包括 Vertica MATCH 子句函数,以便分析用户在 website2.com 上的浏览历史记录。它会确定用户执行以下任务的模式:
-
从其他网站登录 website2.com(进入)
-
浏览任意数量的其他页面(站内)
-
做出购买(购买)
在以下语句中,模式 P (Entry Onsite* Purchase
) 包括三种事件类型:进入、站内和购买。当 Vertica 在输入表中找到匹配时,相关模式实例必须是一个进入事件类型,且后跟零个或多个站内事件类型以及一个购买事件类型
=> SELECT uid,
sid,
ts,
refurl,
pageurl,
action,
event_name(),
pattern_id(),
match_id()
FROM clickstream_log
MATCH
(PARTITION BY uid, sid ORDER BY ts
DEFINE
Entry AS RefURL NOT ILIKE '%website2.com%' AND PageURL ILIKE '%website2.com%',
Onsite AS PageURL ILIKE '%website2.com%' AND Action='V',
Purchase AS PageURL ILIKE '%website2.com%' AND Action = 'P'
PATTERN
P AS (Entry Onsite* Purchase)
ROWS MATCH FIRST EVENT);
在以下输出中,前四行代表用户 1 的浏览活动的模式,而剩下三行显示了用户 2 的浏览习惯。
uid | sid | ts | refurl | pageurl | action | event_name | pattern_id | match_id
-----+-----+----------+----------------------+----------------------+--------+------------+------------+----------
1 | 100 | 12:00:00 | website1.com | website2.com/home | V | Entry | 1 | 1
1 | 100 | 12:01:00 | website2.com/home | website2.com/floby | V | Onsite | 1 | 2
1 | 100 | 12:02:00 | website2.com/floby | website2.com/shamwow | V | Onsite | 1 | 3
1 | 100 | 12:03:00 | website2.com/shamwow | website2.com/buy | P | Purchase | 1 | 4
2 | 100 | 12:10:00 | website1.com | website2.com/home | V | Entry | 1 | 1
2 | 100 | 12:11:00 | website2.com/home | website2.com/forks | V | Onsite | 1 | 2
2 | 100 | 12:13:00 | website2.com/forks | website2.com/buy | P | Purchase | 1 | 3
(7 rows)
另请参阅
35.9 - MINUS 子句
MINUS 是 EXCEPT 的别名。
35.10 - OFFSET 子句
从结果集的开头忽略指定的行数。
语法
OFFSET rows
参数
- start‑row
- 指定要包含在结果集中的第一行。前面的所有行都将被忽略。
依赖关系
-
将 ORDER BY 子句与 OFFSET 一起使用。否则,查询将返回结果集的一个不确定子集。
-
在 SELECT 语句或 UNION 子句中,OFFSET 必须跟在 ORDER BY 子句之后。
-
当 SELECT 语句或 UNION 子句同时指定 LIMIT 和 OFFSET 时,Vertica 首先处理 OFFSET 语句,然后将 LIMIT 语句应用于其余行。
示例
以下查询从 customer_dimension
表中返回 14 行:
=> SELECT customer_name, customer_gender FROM customer_dimension
WHERE occupation='Dancer' AND customer_city = 'San Francisco' ORDER BY customer_name;
customer_name | customer_gender
----------------------+-----------------
Amy X. Lang | Female
Anna H. Li | Female
Brian O. Weaver | Male
Craig O. Pavlov | Male
Doug Z. Goldberg | Male
Harold S. Jones | Male
Jack E. Perkins | Male
Joseph W. Overstreet | Male
Kevin . Campbell | Male
Raja Y. Wilson | Male
Samantha O. Brown | Female
Steve H. Gauthier | Male
William . Nielson | Male
William Z. Roy | Male
(14 rows)
如果修改上一个查询以指定偏移量 8 (OFFSET 8
),Vertica 将跳过上一个结果集的前八行。查询会返回以下结果:
=> SELECT customer_name, customer_gender FROM customer_dimension
WHERE occupation='Dancer' AND customer_city = 'San Francisco' ORDER BY customer_name OFFSET 8;
customer_name | customer_gender
-------------------+-----------------
Kevin . Campbell | Male
Raja Y. Wilson | Male
Samantha O. Brown | Female
Steve H. Gauthier | Male
William . Nielson | Male
William Z. Roy | Male
(6 rows)
35.11 - ORDER BY 子句
对一个或多个列或列表达式的查询结果集进行排序。Vertica 使用当前区域设置和排序规则来对字符串值进行比较和排序。
注意
Vertica 投影数据始终按 ASCII(二进制)排序顺序存储。
语法
ORDER BY expression [ ASC | DESC ] [,...]
参数
- 表达式
- 以下几项之一:
注意
如果集合列也包含在排序顺序中,则不能对集合列使用 DISTINCT。
- ASC | DESC
- 指定是按升序还是降序对值进行排序。NULL 值是排序顺序中的第一个或最后一个,具体取决于数据类型:
示例
下面的例子返回根据交易规模降序排列的客户媒体的全部城市和交易规模。
=> SELECT customer_city, deal_siz FROM customer_dimension WHERE customer_name = 'Metamedia'
ORDER BY deal_size DESC;
customer_city | deal_size
------------------+-----------
El Monte | 4479561
Athens | 3815416
Ventura | 3792937
Peoria | 3227765
Arvada | 2671849
Coral Springs | 2643674
Fontana | 2374465
Rancho Cucamonga | 2214002
Wichita Falls | 2117962
Beaumont | 1898295
Arvada | 1321897
Waco | 1026854
Joliet | 945404
Hartford | 445795
(14 rows)
以下示例使用转换函数。该示例返回了错误,因为 ORDER BY 列不在窗口分区中。
=> CREATE TABLE t(geom geometry(200), geog geography(200));
=> SELECT PolygonPoint(geom) OVER(PARTITION BY geom)
AS SEL_0 FROM t ORDER BY geog;
ERROR 2521: Cannot specify anything other than user defined transforms and partitioning expressions in the ORDER BY list
以下示例使用同一个表更正了此错误。
=> SELECT PolygonPoint(geom) OVER(PARTITION BY geom)
AS SEL_0 FROM t ORDER BY geom;
以下示例使用 ORDER BY 子句中的一个数组。
=> CREATE TABLE employees (id INT, department VARCHAR(50), grants ARRAY[VARCHAR], grant_values ARRAY[INT]);
=> COPY employees FROM STDIN;
42|Physics|[US-7376,DARPA-1567]|[65000,135000]
36|Physics|[US-7376,DARPA-1567]|[10000,25000]
33|Physics|[US-7376]|[30000]
36|Astronomy|[US-7376,DARPA-1567]|[5000,4000]
\.
=> SELECT * FROM employees ORDER BY grant_values;
id | department | grants | grant_values
----+------------+--------------------------+----------------
36 | Astronomy | ["US-7376","DARPA-1567"] | [5000,4000]
36 | Physics | ["US-7376","DARPA-1567"] | [10000,25000]
33 | Physics | ["US-7376"] | [30000]
42 | Physics | ["US-7376","DARPA-1567"] | [65000,135000]
(4 rows)
35.12 - TIMESERIES 子句
空白填充和插值 (GFI) 计算,这是时序分析计算的一个重要组件。有关详细信息和示例,请参阅时序分析。
语法
TIMESERIES slice‑time AS 'length‑and‑time‑unit‑expr' OVER (
[ PARTITION BY (column‑expr[,...] ] ORDER BY time‑expr ) [ ORDER BY table‑column[,...] ]
参数
- slice‑time
TIMESERIES
子句产生的时间列,用于存储空白填充生成的时间片开始时间。
注意:此参数为别名,因此,您可以使用任何名称作为别名。
- length‑and‑time‑unit‑expr
INTERVAL DAY TO SECOND
字面量,用于指定时间片计算的时间单位长度。例如:
TIMESERIES slice_time AS '3 seconds' ...
OVER()
- 指定功能分区和排序。
OVER()
还指定时序函数在查询结果集上的操作—换而言之,评估 FROM
、WHERE
、GROUP BY
和 HAVING
子句之后返回的行。
-
PARTITION BY (column‑expr[,...] )
- 按指定的列表达式对数据进行分区。分别在每个分区上执行空白填充和插值。
-
ORDER BY time‑expr
- 按
TIMESTAMP
表达式 time-expr 对数据排序,以计算时序数据的时间信息。
注意
TIMESERIES
子句要求在时间戳列上进行 ORDER BY
操作。
注意
如果在 TIMESERIES OVER() 内没有为每个定义的时间片指定 window-partition-clause,则只产生一个输出记录;否则,则按每个时间片的每个分区产生一个输出记录。插值在该处计算。
如提供包含 TIMESERIES 子句的查询块,则以下是语义执行阶段(评估 FROM 和可选 WHERE 子句之后):
-
计算 time-expression。
-
根据 time‑exp 和 'length‑and‑time‑unit‑expr' 的结果在每个输入记录上执行与 TIME_SLICE() 函数一样的计算。
-
执行空白填充以生成输入记录中缺失的时间片。
-
将此计算结果命名为 slice_time,表示空白填充之后生成的“时序”列(别名)。
-
按 expression、slice‑time 对数据分区。针对每个分区执行步骤 4。
-
按 time‑expr 对数据排序。插值在此处计算。
TIMESERIES 子句和 TIME_SLICE 函数之间存在语义重叠,主要区别如下:
-
TIMESERIES
仅支持间隔限定符DAY TO SECOND
;不允许 YEAR TO MONTH
。
-
与 TIME_SLICE
不同,length‑and‑time‑unit‑expr 中表示的时间片长度和时间单位必须为常量,以便很好地界定时间片间隙。
-
TIMESERIES
执行空白填充,而 TIME_SLICE
函数则不执行。
-
TIME_SLICE
可以根据其第四个输入参数 (start‑or‑end) 的值来返回时间片的开始和结束时间。TIMESERIES
,另一方面,始终返回每个时间片的开始时间。要输出每个时间片的结束时间,请写入 SELECT
语句,如下所示:
=> SELECT slice_time + <slice_length>;
限制
-
在 SQL 查询块中发生 TIMESERIES
子句时,仅以下子句可用于相同查询块中:
-
SELECT
-
FROM
-
WHERE
-
ORDER BY
不允许使用“GROUP BY”和“HAVING”子句。如果在间隙填充和插值 (GFI) 之前或之后需要执行“GROUP BY”操作,请使用子查询,并且将“GROUP BY”放入外部查询。例如: => SELECT symbol, AVG(first_bid) as avg_bid FROM ( SELECT symbol, slice_time, TS_FIRST_VALUE(bid1) AS first_bid FROM Tickstore WHERE symbol IN ('MSFT', 'IBM') TIMESERIES slice_time AS '5 seconds' OVER (PARTITION BY symbol ORDER BY ts) ) AS resultOfGFI GROUP BY symbol;
-
TIMESERIES
子句出现在 SQL 查询块时,SELECT
列表仅可包含以下:
例如,以下两个查询返回语法错误,因为 bid1
不是 PARTITION BY
或 GROUP BY
列:
=> SELECT bid, symbol, TS_FIRST_VALUE(bid) FROM Tickstore
TIMESERIES slice_time AS '5 seconds' OVER (PARTITION BY symbol ORDER BY ts);
ERROR: column "Tickstore.bid" must appear in the PARTITION BY list of Timeseries clause or be used in a Timeseries Output function
=> SELECT bid, symbol, AVG(bid) FROM Tickstore
GROUP BY symbol;
ERROR: column "Tickstore.bid" must appear in the GROUP BY clause or be used in an aggregate function
示例
例如,请参阅空白填充和插值 (GFI)。
另请参阅
35.13 - UNION 子句
合并多个 SELECT 语句的结果。您也可以在 FROM、WHERE 和 HAVING 子句中包含 UNION。
语法
select‑stmt { UNION [ ALL | DISTINCT ] select-stmt }[...]
[ order-by-clause [ offset-clause ]]
[ limit-clause ]
参数
- select‑stmt
- 返回一行或多行的
SELECT
语句,具体取决于您指定的关键字是 DISTINCT 还是 ALL。
以下选项也适用:
DISTINCT | ALL
- 指定是否返回唯一行:
要求
UNION 中的 ORDER BY、LIMIT 和 OFFSET 子句
UNION 语句可以指定自己的 ORDER BY、LIMIT 和 OFFSET 子句。例如,对于以下示例中描述的表,以下查询将按 emp_name
对 UNION 结果集进行排序,并将输出限制为前两行:
=> SELECT id, emp_name FROM company_a UNION ALL SELECT id, emp_name FROM company_b ORDER BY emp_name LIMIT 2;
id | emp_name
------+----------
5678 | Alice
8765 | Bob
(2 rows)
UNION 子句中的每个 SELECT 语句都可以指定自己的 ORDER BY、LIMIT 和 OFFSET 子句。在这种情况下,SELECT 语句必须用括号括起来。Vertica 首先处理 SELECT 语句的 ORDER BY、LIMIT 和 OFFSET 子句,然后再处理 UNION 子句。
例如,以下 UNION 中的每个 SELECT 语句都指定了自己的 ORDER BY 和 LIMIT 子句。Vertica 处理单个查询,然后连接两个结果集:
=> (SELECT id, emp_name FROM company_a ORDER BY emp_name LIMIT 2)
UNION ALL
(SELECT id, emp_name FROM company_b ORDER BY emp_name LIMIT 2);
id | emp_name
------+-----------
5678 | Alice
9012 | Katherine
8765 | Bob
9012 | Katherine
(4 rows)
以下要求和限制用于确定 Vertica 处理包含 ORDER BY、LIMIT 和 OFFSET 子句的 UNION 子句的方式:
-
UNION 的 ORDER BY 子句必须使用第一个(最左侧的)SELECT 语句指定列。
-
始终将 ORDER BY 子句与 LIMIT 和 OFFSET 一起使用。否则,查询将返回结果集的一个不确定子集。
-
ORDER BY 必须位于 LIMIT 和 OFFSET 之前。
-
当 SELECT 或 UNION 语句同时指定 LIMIT 和 OFFSET 时,Vertica 首先处理 OFFSET 语句,然后将 LIMIT 语句应用于其余行。
非相关子查询中的 UNION
Vertica 支持非相关子查询谓词中的 UNION。例如:
=> SELECT DISTINCT customer_key, customer_name FROM public.customer_dimension WHERE customer_key IN
(SELECT customer_key FROM store.store_sales_fact WHERE sales_dollar_amount > 500
UNION ALL
SELECT customer_key FROM online_sales.online_sales_fact WHERE sales_dollar_amount > 500)
AND customer_state = 'CT';
customer_key | customer_name
--------------+------------------------
7021 | Luigi T. Dobisz
1971 | Betty V. Dobisz
46284 | Ben C. Gauthier
33885 | Tanya Y. Taylor
5449 | Sarah O. Robinson
29059 | Sally Z. Fortin
11200 | Foodhope
15582 | John J. McNulty
24638 | Alexandra F. Jones
...
示例
使用这两个表的示例:
company_a
ID emp_name dept sales
------+------------+-------------+-------
1234 | Stephen | auto parts | 1000
5678 | Alice | auto parts | 2500
9012 | Katherine | floral | 500
company_b
ID emp_name dept sales
------+------------+-------------+-------
4321 | Marvin | home goods | 250
9012 | Katherine | home goods | 500
8765 | Bob | electronics | 20000
从 company_a 和 company_b 中查找所有员工 ID 和姓名
UNION 语句指定选项 DISTINCT,将合并员工的唯一 ID 和姓氏;Katherine 同时为两个公司工作,所以她在结果集中只出现一次。DISTINCT 为默认值,可以忽略:
=> SELECT id, emp_name FROM company_a UNION DISTINCT SELECT id, emp_name FROM company_b ORDER BY id;
id | emp_name
------+-----------
1234 | Stephen
4321 | Marvin
5678 | Alice
8765 | Bob
9012 | Katherine
(5 rows)
下一个 UNION 语句指定选项 ALL。Katherine 同时为两个公司工作,因此查询返回两条与她相关的记录:
=> SELECT id, emp_name FROM company_a UNION ALL SELECT id, emp_name FROM company_b ORDER BY id;
id | emp_name
------+-----------
1234 | Stephen
5678 | Alice
9012 | Katherine
4321 | Marvin
9012 | Katherine
8765 | Bob
(6 rows)
查找每个公司里成绩最好的两名销售人员
每个 SELECT 语句都指定了自己的 ORDER BY 和 LIMIT 子句,因此 UNION 语句将连接每个查询返回的结果集:
=> (SELECT id, emp_name, sales FROM company_a ORDER BY sales DESC LIMIT 2)
UNION ALL
(SELECT id, emp_name, sales FROM company_b ORDER BY sales DESC LIMIT 2);
id | emp_name | sales
------+-----------+-------
8765 | Bob | 20000
5678 | Alice | 2500
1234 | Stephen | 1000
9012 | Katherine | 500
(4 rows)
查找所有员工的销售排序
UNION 语句指定其自己的 ORDER BY 子句,Vertica 将其应用于整个结果:
=> SELECT id, emp_name, sales FROM company_a
UNION
SELECT id, emp_name, sales FROM company_b
ORDER BY sales;
id | emp_name | sales
------+-----------+-------
4321 | Marvin | 250
9012 | Katherine | 500
1234 | Stephen | 1000
5678 | Alice | 2500
8765 | Bob | 20000
(5 rows)
计算各公司各部门的销售总量
每个 SELECT 语句都有自己的 GROUP BY 子句。UNION 将合并每个查询的聚合结果:
=> (SELECT 'Company A' as company, dept, SUM(sales) FROM company_a
GROUP BY dept)
UNION
(SELECT 'Company B' as company, dept, SUM(sales) FROM company_b
GROUP BY dept)
ORDER BY 1;
company | dept | sum
-----------+-------------+-------
Company A | auto parts | 3500
Company A | floral | 500
Company B | electronics | 20000
Company B | home goods | 750
(4 rows)
另请参阅
35.14 - WHERE 子句
指定要包含在查询结果集中的行。
语法
WHERE boolean-expression [ subquery ]...
参数
- boolean‑expression
- 返回 true 或 false 的表达式。结果集仅包括计算结果为 true 的行。该表达式可以包含布尔运算符和以下元素:
使用圆括号将表达式、谓词和布尔运算符进行分组。例如:
... WHERE NOT (A=1 AND B=2) OR C=3;
示例
以下示例返回所有名字以 Amer
字符串开头的东部地区顾客的名字:
=> SELECT DISTINCT customer_name
FROM customer_dimension
WHERE customer_region = 'East'
AND customer_name ILIKE 'Amer%';
customer_name
---------------
Americare
Americom
Americore
Americorp
Ameridata
Amerigen
Amerihope
Amerimedia
Amerishop
Ameristar
Ameritech
(11 rows)
35.15 - WITH 子句
WITH 子句定义了一个或多个已命名公用表表达式 (CTE),其中每个 CTE 均封装了一个结果集,该结果集可以被同一个 WITH 子句中的另一个 CTE 引用或被主要查询引用。Vertica 可以对每个引用执行 CTE(内联展开),或将结果集实体化作为临时表,以供其所有引用重复使用。在这两种情况下,WITH 子句都可以帮助简化复杂查询并避免语句重复。
语法
WITH [ /*+ENABLE_WITH_CLAUSE_MATERIALIZATION */ ] [ RECURSIVE ] {
cte‑identifier [ ( column-aliases ) ] AS (
[ subordinate-WITH-clause ]
query-expression )
} [,...]
参数
/*+ENABLE_WITH_CLAUSE_MATERIALIZATION*/
- 启用当前 WITH 子句中所有查询的实体化。否则,实体化由配置参数 WithClauseMaterialization 设置,默认设置为 0(禁用)。如果禁用 WithClauseMaterialization,则 WITH 子句的主查询返回时会自动清除实体化。有关详细信息,请参阅WITH 子句的实体化。
RECURSIVE
- 指定通过重复执行嵌入的 UNION 或 UNION ALL 语句来迭代 WITH 子句的结果集。请参阅下面的递归查询。
-
cte‑identifier
- 标识 WITH 子句中的公用表表达式 (CTE)。此标识符可用于同一 WITH 子句中的 CTE,也可用于父 WITH 子句和子 WITH 子句(如果有)中的 CTE。最外层(主)WITH 子句的 CTE 标识符也可用于主要查询。
同一 WITH 子句的所有 CTE 标识符必须是唯一的。例如,以下 WITH 子句定义了两个 CTE,因此它们需要唯一的标识符: regional_sales
和 top_regions
:
WITH
-- query sale amounts for each region
regional_sales AS (SELECT ... ),
top_regions AS ( SELECT ... )
)
-
column-aliases
- 结果集列别名的逗号分隔列表。别名列表必须映射到 CTE 查询中的所有列表达式。如果忽略,则只有查询中使用的名称才能引用结果集列。
在以下示例中,revenue
CTE 指定了两个列别名: vkey
和 total_revenue
。这两个别名分别映射到列 vendor_key
和聚合表达式 SUM(total_order_cost)
。主要查询将引用这些别名:
WITH revenue ( vkey, total_revenue ) AS (
SELECT vendor_key, SUM(total_order_cost)
FROM store.store_orders_fact
GROUP BY vendor_key ORDER BY vendor_key)
SELECT v.vendor_name, v.vendor_address, v.vendor_city, r.total_revenue
FROM vendor_dimension v JOIN revenue r ON v.vendor_key = r.vkey
WHERE r.total_revenue = (SELECT MAX(total_revenue) FROM revenue )
ORDER BY vendor_name;
-
subordinate‑WITH‑clause
- 嵌套在当前 WITH 子句中的 WITH 子句。此 WITH 子句中的 CTE 只能引用同一子句中的 CTE,或者父 WITH 子句和子 WITH 子句中的 CTE。
重要
主要查询只能引用最外层 WITH 子句中的 CTE。它不能引用任何嵌套的 WITH 子句中的 CTE。
-
query-expression
- 给定 CTE 的查询。
限制
WITH 子句仅支持 SELECT 和 INSERT 语句。它们不支持 UPDATE 或 DELETE 语句。
递归查询
包含 RECURSIVE 选项的 WITH 子句可以重复执行 UNION 或 UNION ALL 查询,从而迭代其自身的输出。递归查询在处理分层结构(例如,经理下属关系)或树状结构数据(如分类法)等自引用数据时十分有用。
配置参数 WithClauseRecursionLimit(默认设置为 8)将设置递归的最大深度。您可以分别使用 ALTER DATABASE 和 ALTER SESSION 在数据库和会话范围内设置此参数。递归将会继续,直到达到配置的最大深度为止,或者直到最后一次迭代返回没有数据为止。
可以按如下方式指定递归 WITH 子句:
WITH [ /*+ENABLE_WITH_CLAUSE_MATERIALIZATION*/ ] RECURSIVE
cte‑identifier [ ( column-aliases ) ] AS (
non-recursive-term
UNION [ ALL ]
recursive-term
)
非递归项和递归项由 UNION 或 UNION ALL 分隔:
限制
存在以下限制:
示例
包含一个 CTE 的单个 WITH 子句
下面的 SQL 定义了一个包含单个 CTE 的 WITH 子句 revenue
,该子句将聚合表 store.store_orders_fact
中的数据。主要查询将引用两次 WITH 子句结果集:在其 JOIN
子句和谓词中:
-- define WITH clause
WITH revenue ( vkey, total_revenue ) AS (
SELECT vendor_key, SUM(total_order_cost)
FROM store.store_orders_fact
GROUP BY vendor_key ORDER BY 1)
-- End WITH clause
-- primary query
SELECT v.vendor_name, v.vendor_address, v.vendor_city, r.total_revenue
FROM vendor_dimension v JOIN revenue r ON v.vendor_key = r.vkey
WHERE r.total_revenue = (SELECT MAX(total_revenue) FROM revenue )
ORDER BY vendor_name;
vendor_name | vendor_address | vendor_city | total_revenue
------------------+----------------+-------------+---------------
Frozen Suppliers | 471 Mission St | Peoria | 49877044
(1 row)
包含多个 CTE 的单个 WITH 子句
在以下示例中,WITH 子句包含两个 CTE:
主要查询在 top_regions
结果集中按地区和部门聚合销量:
WITH
-- query sale amounts for each region
regional_sales (region, total_sales) AS (
SELECT sd.store_region, SUM(of.total_order_cost) AS total_sales
FROM store.store_dimension sd JOIN store.store_orders_fact of ON sd.store_key = of.store_key
GROUP BY store_region ),
-- query previous result set
top_regions AS (
SELECT region, total_sales
FROM regional_sales ORDER BY total_sales DESC LIMIT 3
)
-- primary query
-- aggregate sales in top_regions result set
SELECT sd.store_region AS region, pd.department_description AS department, SUM(of.total_order_cost) AS product_sales
FROM store.store_orders_fact of
JOIN store.store_dimension sd ON sd.store_key = of.store_key
JOIN public.product_dimension pd ON of.product_key = pd.product_key
WHERE sd.store_region IN (SELECT region FROM top_regions)
GROUP BY ROLLUP (region, department) ORDER BY region, product_sales DESC, GROUPING_ID();
region | department | product_sales
---------+----------------------------------+---------------
East | | 1716917786
East | Meat | 189837962
East | Produce | 170607880
East | Photography | 162271618
East | Frozen Goods | 141077867
East | Gifts | 137604397
East | Bakery | 136497842
East | Liquor | 130410463
East | Canned Goods | 128683257
East | Cleaning supplies | 118996326
East | Dairy | 118866901
East | Seafood | 109986665
East | Medical | 100404891
East | Pharmacy | 71671717
MidWest | | 1287550770
MidWest | Meat | 141446607
MidWest | Produce | 125156100
MidWest | Photography | 122666753
MidWest | Frozen Goods | 105893534
MidWest | Gifts | 103088595
MidWest | Bakery | 102844467
MidWest | Canned Goods | 97647270
MidWest | Liquor | 97306898
MidWest | Cleaning supplies | 90775242
MidWest | Dairy | 89065443
MidWest | Seafood | 82541528
MidWest | Medical | 76674814
MidWest | Pharmacy | 52443519
West | | 2159765937
West | Meat | 235841506
West | Produce | 215277204
West | Photography | 205949467
West | Frozen Goods | 178311593
West | Bakery | 172824555
West | Gifts | 172134780
West | Liquor | 164798022
West | Canned Goods | 163330813
West | Cleaning supplies | 148776443
West | Dairy | 145244575
West | Seafood | 139464407
West | Medical | 126184049
West | Pharmacy | 91628523
| | 5164234493
(43 rows)
包含 WITH 子句的 INSERT 语句
以下 SQL 使用 WITH 子句将 JOIN 查询中的数据插入到表 total_store_sales
中:
CREATE TABLE total_store_sales (store_key int, region VARCHAR(20), store_sales numeric (12,2));
INSERT INTO total_store_sales
WITH store_sales AS (
SELECT sd.store_key, sd.store_region::VARCHAR(20), SUM (of.total_order_cost)
FROM store.store_dimension sd JOIN store.store_orders_fact of ON sd.store_key = of.store_key
GROUP BY sd.store_region, sd.store_key ORDER BY sd.store_region, sd.store_key)
SELECT * FROM store_sales;
=> SELECT * FROM total_store_sales ORDER BY region, store_key;
store_key | region | store_sales
-----------+-----------+-------------
2 | East | 47668303.00
6 | East | 48136354.00
12 | East | 46673113.00
22 | East | 48711211.00
24 | East | 48603836.00
31 | East | 46836469.00
36 | East | 48461449.00
37 | East | 48018279.00
41 | East | 48713084.00
44 | East | 47808362.00
49 | East | 46990023.00
50 | East | 47643329.00
9 | MidWest | 46851087.00
15 | MidWest | 48787354.00
27 | MidWest | 48497620.00
29 | MidWest | 47639234.00
30 | MidWest | 49013483.00
38 | MidWest | 48856012.00
42 | MidWest | 47297912.00
45 | MidWest | 48544521.00
46 | MidWest | 48887255.00
4 | NorthWest | 47580215.00
39 | NorthWest | 47136892.00
47 | NorthWest | 48477574.00
8 | South | 48131455.00
13 | South | 47605422.00
17 | South | 46054367.00
...
(50 rows)
另请参阅
WITH 子句
36 - SET 语句
SET 语句用于更改数据库的运行方式,例如更改自动提交设置或会话使用的资源池。
36.1 - SET DATESTYLE
指定如何设置当前会话的日期/时间输出格式。使用
SHOW DATESTYLE
验证当前输出设置。
语法
SET DATESTYLE TO { arg | 'arg' }[, arg | 'arg' ]
参数
SET DATESTYLE
只有一个参数,该参数可以设置为一个或两个指定日期排序和样式的实参。每个实参可以单独指定或结合使用;如果结合,则可按任意顺序指定。
下表说明了每种样式及其支持的日期排序实参:
Vertica 将忽略 ISO
和 GERMAN
日期样式的顺序实参。如果日期样式为 SQL
或 POSTGRES
,则顺序设置将决定以 MDY
还是 DMY
顺序输出日期。SQL
和 POSTGRES
都不支持 YMD
顺序。如果为 YMD
或 SQL
指定 POSTGRES
,Vertica 将忽略该设置,并使用默认的 MDY
顺序。
日期样式和排序还会影响 Vertica 解释输入值的方式。有关详细信息,请参阅日期/时间字面量。
特权
无
输入依赖项
在某些情况下,输入格式会决定输出格式,而不管日期样式和顺序的设置:
-
Vertica 中 DATESTYLE
的 ISO 输出为 ISO 长格式,但也接受某些输入样式。如果输入中最先出现年份,则将对输入和输出使用 YMD
,而不考虑 DATESTYLE
值。
-
INTERVAL
输入和输出共用同一格式,以下内容除外:
如果日期样式设置为 ISO,输出将遵照以下格式:
[ quantity unit [...] ] [ days ] [ hours:minutes:seconds ]
示例
=> CREATE TABLE t(a DATETIME);
CREATE TABLE
=> INSERT INTO t values ('3/16/2016');
OUTPUT
--------
1
(1 row)
=> SHOW DATESTYLE;
name | setting
-----------+----------
datestyle | ISO, MDY
(1 row)
=> SELECT * FROM t;
a
---------------------
2016-03-16 00:00:00
(1 row)
=> SET DATESTYLE TO German;
SET
=> SHOW DATESTYLE;
name | setting
-----------+-------------
datestyle | German, DMY
(1 row)
=> SELECT * FROM t;
a
---------------------
16.03.2016 00:00:00
(1 row)
=> SET DATESTYLE TO SQL;
SET
=> SHOW DATESTYLE;
name | setting
-----------+----------
datestyle | SQL, DMY
(1 row)
=> SELECT * FROM t;
a
---------------------
16/03/2016 00:00:00
(1 row)
=> SET DATESTYLE TO Postgres, MDY;
SET
=> SHOW DATESTYLE;
name | setting
-----------+---------------
datestyle | Postgres, MDY
(1 row)
=> SELECT * FROM t;
a
--------------------------
Wed Mar 16 00:00:00 2016
(1 row)
36.2 - SET ESCAPE_STRING_WARNING
当前
会话期间,在字符串字面量中使用反斜杠时发出警告。
语法
SET ESCAPE_STRING_WARNING TO { ON | OFF }
参数
ON
- [默认] 在字符串字面量中使用反斜杠时发出警告。
提示: 已升级较早版本的 Vertica 的组织可以将此参数用作调试工具,以查找过去被视为转义字符,但现在被视为字面量的反斜杠。
OFF
- 忽略字符串字面量内的反斜杠。
特权
无
注意
-
此语句只能在 vsql 下使用。
-
请先关闭标准一致性字符串,然后再开启此参数。
提示
要在所有会话中设置转义字符串警告,请使用 EscapeStringWarnings 配置参数。请参阅
国际化参数。
示例
以下示例显示了如何关闭会话的转义字符串警告。
=> SET ESCAPE_STRING_WARNING TO OFF;
另请参阅
36.3 - SET INTERVALSTYLE
指定是否在当前
会话的间隔输出中包含单位。
语法
SET INTERVALSTYLE TO [ plain | units ]
参数
- plain
- (默认值)设置默认间隔输出以忽略单位。
- units
- 启用在间隔输出中包含子类单位标识符。当
INTERVALSTYLE
设置为单位时,DATESTYLE 参数将控制输出。如果启用了单位,但其未显示在输出中,请检查 DATESTYLE 参数值,该值必须设置为 ISO
或 POSTGRES
才能显示间隔单位。
特权
无
示例
请参阅设置间隔单位显示。
36.4 - SET LOCALE
指定当前
会话的区域设置。
还可以使用 vsql 命令
\locale
设置当前区域设置。
语法
SET LOCALE TO ICU‑locale‑identifier
参数
- locale‑identifier
- 指定要使用的 ICU 区域设置标识符,默认设置为:
en_US@collation=binary
如果设置为空字符串,Vertica 会将区域设置设为 en_US_POSIX
。
需要满足以下要求:
特权
无
常用区域设置
有关标识符选项的详细信息,请参阅关于区域设置。有关区域设置标识符的完整列表,请参阅 ICU 项目。
de_DE
- 德语(德国)
en_GB
- 英语(英国)
es_ES
- 西班牙语(西班牙)
fr_FR
- 法语(法国)
pt_BR
- 葡萄牙语(巴西)
pt_PT
- 葡萄牙语(葡萄牙)
ru_RU
- 俄语(俄罗斯)
ja_JP
- 日语(日本)
zh_CN
- 中文(中国,简体中文)
zh_Hant_TW
- 中文(台湾,繁体中文)
示例
将会话区域设置为 en_GB
:
=> SET LOCALE TO en_GB;
INFO 2567: Canonical locale: 'en_GB'
Standard collation: 'LEN'
English (United Kingdom)
SET
使用区域设置的缩写:
=> SET LOCALE TO LEN;
INFO 2567: Canonical locale: 'en'
Standard collation: 'LEN'
English
SET
指定排序规则:
=> SET LOCALE TO 'tr_tr@collation=standard';
INFO 2567: Canonical locale: 'tr_TR@collation=standard'
Standard collation: 'LTR'
Turkish (Turkey, collation=standard) Türkçe (Türkiye, Sıralama=standard)
SET
另请参阅
36.5 - SET ROLE
为用户的当前会话启用角色。用户可以访问授予该角色的特权。启用角色不会影响当前已启用的角色。
语法
SET ROLE roles‑expression
参数
-
roles‑expression
- 使用以下表达式之一指定此用户的默认角色:
-
NONE
(默认值):禁用所有角色。
-
roles‑list
: 要启用的角色列表,以逗号分隔。您只能设置当前已授予您的角色。
-
ALL [EXCEPT roles‑list]
: 启用当前已授予此用户的所有角色,不包括在可选 EXCEPT
子句中指定的任何以逗号分隔的角色。
-
DEFAULT
:启用所有默认角色。根据定义,默认角色会自动启用,但如果使用 SET ROLE NONE 禁用了这些角色,要重新启用这些角色,此选项可能很有用。
特权
无
示例
示例如下:
-
SHOW AVAILABLE_ROLES; 会列出用户可使用的角色,但不启用。
-
SET ROLE applogs; 为用户启用 applogs 角色。
-
SHOW ENABLED_ROLES; 将 applogs 角色列为已为用户启用 (SET)。
-
SET ROLE appuser; 为用户启用 appuser 角色。
-
SHOW ENABLED_ROLES 将 applogs 和 appuser 列为用户的已启用角色。
-
SET ROLE NONE 禁用用户的所有已启用角色。
-
SHOW ENABLED_ROLES 显示没有为用户启用任何角色。
=> SHOW AVAILABLE_ROLES;
name | setting
-----------------+----------------------------
available roles | applogs, appadmin, appuser
(1 row)
=> SET ROLE applogs;
SET
=> SHOW ENABLED_ROLES;
name | setting
---------------+---------
enabled roles | applogs
(1 row)
=> SET ROLE appuser;
SET
=> SHOW ENABLED_ROLES;
name | setting
---------------+------------------
enabled roles | applogs, appuser
(1 row)
=> SET ROLE NONE;
SET
=> SHOW ENABLED_ROLES;
name | setting
---------------+---------
enabled roles |
(1 row)
设置用户默认角色
虽然通常是由 DBADMIN 用户负责设置用户默认角色,但作为用户,您可以设置自己的角色。例如,如果您运行 SET ROLE NONE,则您的所有已启用角色将被禁用。因而决定了您需要将 role1 作为默认角色进行访问。DBADMIN 使用 ALTER USER 向您分配默认角色:
=> ALTER USER user1 default role role1;
此示例将 role1 设置为 user1 的默认角色,因为 DBADMIN 使用 ALTER USER 分配了此默认角色。
user1 => SET ROLE default;
user1 => SHOW ENABLED_ROLES;
name | setting
-----------------------
enabled roles | role1
(1 row)
将所有角色设为默认值
此示例将所有授予 user1 的角色设为默认角色:
user1 => SET ROLE all;
user1 => show enabled roles;
name | setting
----------------------------------
enabled roles | role1, role2, role3
(1 row)
将所有角色设为默认值(含例外)
此示例将授予用户的所有角色设为默认角色,但 role1 除外。
user1 => set role all except role1;
user1 => SHOW ENABLED_ROLES
name | setting
----------------------------
enabled roles | role2, role3
(1 row)
36.6 - SET SEARCH_PATH
指定当 SQL 语句指定不使用架构名称限定的表名称时 Vertica 搜索架构的顺序。 SET SEARCH_PATH
覆盖当前会话的搜索路径,该路径最初是在用户配置文件中设置的。此搜索路径一直有效,直到下一个 SET SEARCH_PATH
语句或会话结束为止。有关详细信息,请参阅设置搜索路径。
要查看当前搜索路径,请使用
SHOW SEARCH_PATH
。
语法
SET SEARCH_PATH { TO | = } { schema‑list | DEFAULT }
参数
- schema‑list
- 以逗号分隔的架构列表,表示 Vertica 搜索表中架构的顺序,该表的名称不通过架构名称进行限定。
如果搜索路径中包含的架构不存在,或者用户缺少对该架构的访问权限,Vertica 会静默跳过该架构。
DEFAULT
- 将搜索路径设置为数据库默认设置:
"$user", public, v_catalog, v_monitor, v_internal
特权
无
示例
显示当前搜索路径:
=> SHOW SEARCH_PATH;
name | setting
-------------+---------------------------------------------------
search_path | "$user", public, v_catalog, v_monitor, v_internal
(1 row)
将搜索路径重置为架构 store
和 public
:
=> SET SEARCH_PATH TO store, public;
=> SHOW SEARCH_PATH;
name | setting
-------------+-------------------------------------------------
search_path | store, public, v_catalog, v_monitor, v_internal
(1 row)
将搜索路径重置为数据库默认设置:
=> SET SEARCH_PATH TO DEFAULT;
SET
=> SHOW SEARCH_PATH;
name | setting
-------------+---------------------------------------------------
search_path | "$user", public, v_catalog, v_monitor, v_internal
(1 row)
36.7 - SET SESSION AUTOCOMMIT
设置语句是否在完成时自动提交其事务。此语句主要由客户端驱动程序用于启用和禁用自动提交,您永远没有必要直接调用该语句。
语法
SET SESSION AUTOCOMMIT TO { ON | OFF }
参数
ON
- 启用自动提交。语句会在完成时自动提交其事务。这是使用 Vertica 客户端库建立的连接的默认设置。
OFF
- 禁用自动提交。事务不会自动提交。这是交互会话(通过
vsql 建立的连接)的默认设置。
特权
无
示例
此示例显示了如何将 AUTOCOMMIT 设置为“on”,然后再设置为“off”。
=> SET SESSION AUTOCOMMIT TO on;
SET
=> SET SESSION AUTOCOMMIT TO off;
SET
另请参阅
36.8 - SET SESSION CHARACTERISTICS AS TRANSACTION
设置在此语句发出后开始的所有事务的隔离级别和访问模式。
事务将保留其隔离级别直至其完成,即使在事务处理期间会话的隔离级别发生更改也是如此。Vertica 内部进程(例如
Tuple Mover 和
刷新操作)以及 DDL 操作始终以 SERIALIZABLE 隔离级别运行以确保一致性。
语法
SET SESSION CHARACTERISTICS AS TRANSACTION settings
- 设置
- 以下两项中的一个或两个:
-
ISOLATION LEVEL [argument](#IsolationArgs)
-
[READ ONLY | READ WRITE](#ReadWrite)
ISOLATION LEVEL 实参
ISOLATION LEVEL 子句用于确定当同时运行其他多个事务时,此事务可以访问的数据。如果事务已运行,则不能在第一个查询 (SELECT) 或 DML 语句(INSERT、DELETE、UPDATE)之后更改隔离级别。
将 ISOLATION LEVEL 设置为以下实参之一:
SERIALIZABLE
- 设置最严格的 SQL 事务隔离级别。此级别连续而不是并发模拟事务。它持有锁并阻止写入操作,直到事务完成为止。
使用 SERIALIZABLE
的应用程序必须准备好在序列化失败后重试事务。对于正常的查询操作,不建议使用此隔离级别。
将事务隔离级别设置为 SERIALIZABLE
不会应用于临时表。临时表通过其事务范围进行隔离。
REPEATABLE READ
- 自动转换为
SERIALIZABLE
。
READ COMMITTED
- 默认值,允许并发事务。
READ UNCOMMITTED
- 自动转换为
READ COMMITTED
。
READ WRITE/READ ONLY
您可以将事务访问模式设置为以下几项之一:
READ WRITE
- 默认值,允许对 SQL 语句进行读取/写入。
READ ONLY
- 不允许需要写入权限的 SQL 语句:
注意
将事务会话模式设置为只读不会阻止所有写入操作。
特权
无
查看会话事务特征
SHOW TRANSACTION_ISOLATION 和 SHOW TRANSACTION_READ_ONLY 可显示当前会话的事务设置:
=> SHOW TRANSACTION_ISOLATION;
name | setting
-----------------------+--------------
transaction_isolation | SERIALIZABLE
(1 row)
=> SHOW TRANSACTION_READ_ONLY;
name | setting
-----------------------+---------
transaction_read_only | true
(1 row)
36.9 - SET SESSION GRACEPERIOD
设置会话套接字在等待给定查询的客户端输入或输出时保持拦截状态的时间。如果套接字在超过宽限期设置的一段连续时间内被拦截,服务器将关闭套接字并引发致命错误。然后会话终止。如果未设置宽限期,查询可以无限期地在套接字上保留它的块。
Vertica 独立应用会话的宽限期和
RUNTIMECAP
设置。如果未设置宽限期,则无论查询的 RUNTIMECAP
设置如何,查询都可以在会话套接字上无限期地阻塞。
语法
SET SESSION GRACEPERIOD duration
参数
- duration
- 指定查询可以在任何会话套接字上阻塞的时间,可以为以下几项之一:
-
'interval'
:将当前会话查询的最长宽限期指定为间隔,最长 20 天。
-
=DEFAULT
:将此会话中查询的宽限期设置为用户的 GRACEPERIOD
值。新会话最初将设置为此值。
-
NONE
:仅对超级用户有效,将移除之前在会话查询中设置的任何宽限期。
特权
示例
请参阅《管理员指南》中的处理会话套接字阻止。
36.10 - SET SESSION IDLESESSIONTIMEOUT
设置会话在退出之前可以保持空闲的最长时间。
注意
空闲会话没有正在运行的查询。
语法
SET SESSION IDLESESSIONTIMEOUT duration
参数
- duration
- 指定会话在退出之前可以保持空闲的时间:
特权
示例
请参阅《管理员指南》中的管理客户端连接。
36.11 - SET SESSION MEMORYCAP
限制可以为当前
会话中的任何请求分配的内存量。此限制仅适用于当前会话;不限制多个会话使用的内存总量。
语法
SET SESSION MEMORYCAP limit
参数
- 限制
- 以下几项之一:
特权
示例
将会话内存上限设置为 2 GB:
=> SET SESSION MEMORYCAP '2G';
SET
=> SHOW MEMORYCAP;
name | setting
-----------+---------
memorycap | 2097152
(1 row)
将内存上限恢复为用户配置文件中指定的默认设置:
=> SET MEMORYCAP=DEFAULT;
SET
=> SHOW MEMORYCAP;
name | setting
-----------+---------
memorycap | 2013336
(1 row)
另请参阅
管理工作负载
36.12 - SET SESSION MULTIPLEACTIVERESULTSETS
启用或禁用在单一 JDBC 连接上执行多个活动结果集 (MARS)。使用此选项需要具有活动的 JDBC 连接。
语法
SET SESSION MULTIPLEACTIVERESULTSETS TO { ON | OFF }
参数
ON
- 启用 MultipleActiveResultSets。允许您在单一连接上执行多个结果集。
OFF
- 禁用 MultipleActiveResultSets。每个连接只允许一个活动结果集。(默认值。)
特权
无
示例
此示例显示了如何将 MultipleActiveResultSets 设置为“on”,然后再设置为“off”:
=> SET SESSION MULTIPLEACTIVERESULTSETS TO on;
SET
=> SET SESSION MULTIPLEACTIVERESULTSETS TO off;
SET
36.13 - SET SESSION RESOURCE_POOL
将用户
会话与指定资源池关联。
语法
SET SESSION RESOURCE_POOL = { pool-name | DEFAULT }
参数
- pool‑name
- 要与当前会话关联的现有资源池的名称。
DEFAULT
- 将会话的资源池设置为用户的默认资源池。
特权
-
超级用户可以将其会话分配到任意可用的资源池。
-
非超级用户必须具有资源池的 USAGE 权限。
示例
此示例将 ceo_pool
设置为会话资源池:
=> SET SESSION RESOURCE_POOL = ceo_pool;
SET
另请参阅
36.14 - SET SESSION RUNTIMECAP
设置查询和存储过程可以在给定会话中运行的最长时间。如果查询或存储过程超出其会话的 RUNTIMECAP
,Vertica 将终止它并返回错误。不能将 RUNTIMECAP
增加到超出用户配置文件中设置的限制。
注意
Vertica 不严格执行会话 RUNTIMECAP
设置。如果对查询或存储过程进行计时,您可能会发现其运行时间超出了 RUNTIMECAP
设置。
语法
SET SESSION RUNTIMECAP duration
参数
- duration
- 指定给定查询可以在当前会话中运行的时间,为以下几项之一:
-
NONE
(默认值):移除所有当前会话查询的运行时限制。
-
'interval'
:将当前会话查询的最长运行时间指定为间隔,最长为一年,例如,1 minute
或 100 seconds
。
-
=DEFAULT
:将此会话中查询的最长运行时间设置为用户的 RUNTIMECAP
值。
特权
示例
将当前会话的最大查询运行时设置为 10 分钟:
=> SET SESSION RUNTIMECAP '10 minutes';
将会话 RUNTIMECAP
恢复为您的用户默认设置:
=> SET SESSION RUNTIMECAP =DEFAULT;
SET
=> SHOW RUNTIMECAP;
name | setting
------------+-----------
runtimecap | UNLIMITED
(1 row)
将 RUNTIMECAP 设置为 1 SECOND
并使用无限循环运行匿名过程:
=> SET SESSION RUNTIMECAP '1 SECOND';
SET
=> DO $$
BEGIN
LOOP
END LOOP;
END;
$$;
ERROR 0: Query exceeded maximum runtime
HINT: Change the maximum runtime using SET SESSION RUNTIMECAP
另请参阅
36.15 - SET SESSION TEMPSPACECAP
设置
会话发出的任何请求可以消耗的最大临时文件存储量。如果查询的执行计划所需的存储空间超出会话 TEMPSPACECAP,将会返回错误。
语法
SET SESSION TEMPSPACECAP limit
参数
-
限制
- 分配给当前会话的最大临时文件存储量,为以下几项之一:
特权
非超级用户:
示例
将会话 TEMPSPACECAP 设置为 20 GB:
=> SET SESSION TEMPSPACECAP '20G';
SET
=> SHOW TEMPSPACECAP;
name | setting
--------------+----------
tempspacecap | 20971520
(1 row)
注意
SHOW 以 KB 为单位显示 TEMPSPACECAP。
将会话 TEMPSPACECAP 设置为不受限制:
=> SET SESSION TEMPSPACECAP NONE;
SET
=> SHOW TEMPSPACECAP;
name | setting
--------------+-----------
tempspacecap | UNLIMITED
(1 row)
另请参阅
36.16 - SET STANDARD_CONFORMING_STRINGS
指定是否将反斜杠视为当前会话的转义字符。默认情况下,Vertica 符合 SQL 标准并支持 Unicode 转义中的 SQL:2008 字符串字面量。
语法
SET STANDARD_CONFORMING_STRINGS TO { ON | OFF }
参数
ON
- (默认)将普通字符串字面量 ('...') 视为反斜杠 (\),当作文本处理。这意味着反斜杠将被视为字符串字面量,而非转义字符。
OFF
- 将反斜杠视为转义字符。
特权
无
要求
示例
关闭会话的一致性字符串:
=> SET STANDARD_CONFORMING_STRINGS TO OFF;
验证当前设置:
=> SHOW STANDARD_CONFORMING_STRINGS;
name | setting
-----------------------------+---------
standard_conforming_strings | off
(1 row)
打开会话的一致性字符串:
=> SET STANDARD_CONFORMING_STRINGS TO ON;
另请参阅
36.17 - SET TIME ZONE
更改当前
会话的 TIME ZONE 运行时参数。使用
SHOW TIMEZONE
显示会话的当前时区。
如果您使用 POSIX 格式设置时区,您使用的时区缩写将覆盖默认时区缩写。如果将日期样式设置为 POSTGRES,在将时间戳转换为字符串时,也会使用您使用的时区缩写。
语法
SET TIME ZONE [TO] { value | 'value' }
注意
Vertica 将字面量 TIME ZONE
和 TIMEZONE
视为同义词。
参数
- value
- 以下几项之一:
-
Vertica 支持的时区字面量。要查看默认的有效字面量列表,请参阅以下目录中的文件:
/opt/vertica/share/timezonesets
-
带符号整数,表示 UTC 偏移量(以小时为单位)
-
偏移量为带符号整数的时区字面量。例如:
=> SET TIME ZONE TO 'America/New York -3'; -- equivalent to Pacific time
注意
仅当 SET TIME ZONE 的实参为有效时区+偏移量组合时,此实参才有意义。但是,对于无意义的组合(例如 America/NewYork + 150
),Vertica 也不会返回错误。
-
间隔值
-
常数 LOCAL
和 DEFAULT
,分别将时区设置为环境变量 TZ
中指定的时区,或者如果 TZ
未定义,则设置为操作系统时区。
只有有效的(时区+偏移量)组合才能作为此函数的参数。
特权
无
示例
=> SET TIME ZONE TO DEFAULT;
=> SET TIME ZONE TO 'PST8PDT'; -- Berkeley, California
=> SET TIME ZONE TO 'Europe/Rome'; -- Italy
=> SET TIME ZONE TO '-7'; -- UDT offset equivalent to PDT
=> SET TIME ZONE TO INTERVAL '-08:00 HOURS';
另请参阅
在 Vertica 中使用时区
36.17.1 - 用于设置 TIME ZONE 的时区名称
Vertica 将下面列出的时区名称识别为 SQL 时区的有效设置(TIME ZONE 运行时参数)。
注意
时区和夏令时规则由各个政府控制,可能会更改。有关最新信息,请参阅
时区和夏令时数据源。
这些名称不同于
/opt/vertica/share/timezonesets
中显示的名称,后者以 date/time 输入值的形式获得 Vertica 识别。下面列出的 TIME ZONE 名称意味着本地夏令时规则,其中 date/time 输入名称代表 UTC 的固定偏移量。
在许多情况下,同一时区具有多个名称。这些名称位于同一个组中。列表主要按常用时区名称进行排序。
除了列表中的名称之外,Vertica 还接受以下时区名称之一:
其中 STD 为时区缩写,offset 为从 UTC 往西的偏移量数值(以小时为单位),而 DST 为可选的夏令时时区缩写,假定代表比给定偏移量提前一小时。
例如,如果 EST5EDT
还不是公认的时区名称,Vertica 将接受它在功能上等同于美国东海岸时间。如果存在夏令时时区名称,Vertical 将假定该名称使用美国时区规则,因此此功能在北美以外地区的使用受到限制。
当心
请注意,这一预配可能会导致静默接受无效输入,因为对时区缩写的合理性未执行任何检查。例如,SET TIME ZONE TO FOOBANKO
可以使用 GMT 的一个比较奇特的缩写发挥作用,使系统高效运行。
时区
-
非洲
-
美洲
-
南极洲
-
亚洲
-
大西洋
-
澳大利亚
-
CET
-
EET
-
Etc/GMT
-
GMT
-
GMT+0
-
GMT-0
-
GMT0
-
Greenwich
-
Etc/Greenwich
-
欧洲
-
工厂
-
印度洋
-
MET
-
太平洋
-
UCT Etc
-
UCT
-
偏移量
-
Universal Zulu
-
Etc/UTC
-
Etc/Universal
-
Etc/Zulu
-
WET
37 - SHOW
显示当前会话的运行时参数。
语法
SHOW { parameter | ALL }
参数
ALL
- 显示所有运行时设置。
AUTOCOMMIT
- 返回 on/off,以指示语句在完成时是否自动提交事务。
-
AVAILABLE ROLES
- 列出可供用户使用的所有
角色。
DATESTYLE
- 显示日期值的当前样式。请参阅SET DATESTYLE。
-
ENABLED ROLES
- 显示为当前会话启用的角色。请参阅SET ROLE。
ESCAPE_STRING_WARNING
- 返回 on/off,以指示在字符串中发现反斜杠转义时是否发出警告。请参阅SET ESCAPE_STRING_WARNING。
GRACEPERIOD
- 显示通过 SET SESSION GRACEPERIOD 设置的会话 GRACEPERIOD。
IDLESESSIONTIMEOUT
- 显示会话在超时之前可以保持空闲的时间。
INTERVALSTYLE
- 显示在打印时间间隔时是否输出单位。请参阅SET INTERVALSTYLE。
LOCALE
- 显示当前区域设置。请参阅SET LOCALE。
MEMORYCAP
- 显示任何请求使用的最大内存量。请参阅 SET MEMORYCAP。
MULTIPLEACTIVERESULTSETS
- 返回 on/off,以指示是否允许在一个连接上存在多个活动结果集。请参阅SET SESSION MULTIPLEACTIVERESULTSETS。
RESOURCE POOL
- 显示会话当前使用的资源池。请参阅 SET RESOURCE POOL。
RUNTIMECAP
- 显示此会话中查询可运行的最长时间。请参阅 SET RUNTIMECAP。
SEARCH_PATH
- 显示 Vertica 搜索架构时采用的顺序。请参阅SET SEARCH_PATH。例如:
=> SHOW SEARCH_PATH;
name | setting
-------------+---------------------------------------------------
search_path | "$user", public, v_catalog, v_monitor, v_internal
(1 row)
STANDARD_CONFORMING_STRINGS
- 显示是否为会话启用反斜杠转义。请参阅SET STANDARD_CONFORMING_STRINGS。
TEMPSPACECAP
- 显示在会话中查询可以使用的最大临时文件空间。请参阅 SET TEMPSPACECAP。
TIMEZONE
- 显示当前会话中设置的时区。请参阅 SET TIMEZONE。
-
TRANSACTION_ISOLATION
- 显示当前事务隔离设置,如 SET SESSION CHARACTERISTICS AS TRANSACTION 中所述。例如:
=> SHOW TRANSACTION_ISOLATION;
name | setting
-----------------------+----------------
transaction_isolation | READ COMMITTED
(1 row)
-
TRANSACTION_READ_ONLY
- 返回 true/false 以指示当前的只读设置,如 SET SESSION CHARACTERISTICS AS TRANSACTION 中所述。例如:
=> SHOW TRANSACTION_READ_ONLY;
name | setting
-----------------------+---------
transaction_read_only | false
(1 row)
特权
无
示例
显示所有当前运行时参数设置:
=> SHOW ALL;
name | setting
-----------------------------+-----------------------------------------------------------
locale | en_US@collation=binary (LEN_KBINARY)
autocommit | off
standard_conforming_strings | on
escape_string_warning | on
multipleactiveresultsets | off
datestyle | ISO, MDY
intervalstyle | plain
timezone | America/New_York
search_path | "$user", public, v_catalog, v_monitor, v_internal, v_func
transaction_isolation | READ COMMITTED
transaction_read_only | false
resource_pool | general
memorycap | UNLIMITED
tempspacecap | UNLIMITED
runtimecap | UNLIMITED
idlesessiontimeout | UNLIMITED
graceperiod | UNLIMITED
enabled roles | dbduser*, dbadmin*, pseudosuperuser*
available roles | dbduser*, dbadmin*, pseudosuperuser*
(19 rows)
38 - SHOW CURRENT
显示在所有级别设置的活动配置参数值。Vertica 首先检查在会话级别设置的值。如果未在会话级别为配置参数设置值,Vertica 接下来将检查是否为您登录的节点设置值,然后检查数据库级别。如果未设置值,SHOW CURRENT
将显示配置参数的默认值。如果配置参数需要重新启动才能生效,显示的活动值可能不同于设置的值。
语法
SHOW CURRENT { parameter‑name[,...] | ALL }
参数
- parameter‑name
- 要显示的配置参数的名称。
ALL
- 显示在所有级别设置的所有配置参数。
特权
非超级用户: SHOW CURRENT ALL
返回掩码参数设置。尝试查看特定参数设置会返回错误。
示例
显示所有级别的配置参数及其设置。
=> SHOW CURRENT ALL;
level | name |setting
---------+---------------------------+---------
DEFAULT | ActivePartitionCount | 1
DEFAULT | AdvanceAHMInterval | 180
DEFAULT | AHMBackupManagement | 0
DATABASE | AnalyzeRowCountInterval | 3600
SESSION | ForceUDxFencedMode | 1
NODE | MaxClientSessions | 0
...
39 - SHOW DATABASE
显示为数据库设置的配置参数值。
注意
如果配置参数已设置,但需要数据库重新启动才能生效,显示的值可能与实际值有所不同。
语法
SHOW DATABASE db‑spec { parameter‑name[,...] | ALL }
参数
- db‑spec
指定当前数据库,设置为数据库名称或DEFAULT
。
- parameter‑name
- 要显示的一个或多个配置参数的名称。非超级用户只能指定设置未被
SHOW DATABASE...ALL
屏蔽的参数,否则 Vertica 将返回错误。
如果指定的参数未设置,SHOW DATABASE
会为该参数返回一个空行。
要获取数据库级别参数的名称,请查询系统表
CONFIGURATION_PARAMETERS
。
ALL
- 显示在数据库级别设置的所有配置参数。对于非超级用户,Vertica 会屏蔽只有超级用户才能访问的安全性参数设置。
特权
示例
向非超级用户显示在数据库上设置的所有配置参数:
=> SHOW DATABASE DEFAULT ALL;
name | setting
--------------------------------+----------
AllowNumericOverflow | 1
CopyFaultTolerantExpressions | 1
GlobalHeirUsername | ********
MaxClientSessions | 50
NumericSumExtraPrecisionDigits | 0
(6 rows)
显示两个配置参数的设置:
=> SHOW DATABASE DEFAULT AllowNumericOverflow, NumericSumExtraPrecisionDigits;
name | setting
--------------------------------+---------
AllowNumericOverflow | 1
NumericSumExtraPrecisionDigits | 0
(2 rows)
40 - SHOW NODE
显示为节点设置的配置参数值。如果指定的参数未设置,SHOW NODE
会为该参数返回一个空行。
注意
如果配置参数已设置,但需要数据库重新启动才能生效,显示的值可能与实际值有所不同。
语法
SHOW NODE node‑name { parameter‑name [,...] | ALL }
参数
- node‑name
- 目标节点的名称。
- parameter‑name
- 一个或多个节点级别配置参数的名称。要获取节点级别参数的名称,请查询系统表
CONFIGURATION_PARAMETERS
。
ALL
- 显示在节点级别设置的所有配置参数。
特权
无
示例
查看节点 v_vmart_node0001
的所有配置参数及其设置:
=> SHOW NODE v_vmart_node0001 ALL;
name | setting
---------------------------+---------
DefaultIdleSessionTimeout | 5 hour
MaxClientSessions | 20
41 - SHOW SESSION
显示为当前会话设置的配置参数值。如果指定的参数未设置,SHOW SESSION
会为该参数返回一个空行。
注意
如果配置参数已设置,但需要数据库重新启动才能生效,显示的值可能与实际值有所不同。
语法
SHOW SESSION { ALL | UDPARAMETER ALL }
参数
ALL
- 显示在会话级别设置的所有 Vertica 配置参数。
UDPARAMETER ALL
- 显示由用户定义的扩展定义的所有参数。这些参数未显示在 CONFIGURATION_PARAMETERS 表中。
特权
无
示例
查看当前会话的所有 Vertica 配置参数及其设置。不包括用户定义的参数:
=> SHOW SESSION ALL;
name | setting
----------------------------+---------------------------------------------------
locale | en_US@collation=binary (LEN_KBINARY)
autocommit | off
standard_conforming_strings | on
escape_string_warning | on
datestyle | ISO, MDY
intervalstyle | plain
timezone | America/New_York
search_path | "$user", public, v_catalog, v_monitor, v_internal
transaction_isolation | READ COMMITTED
transaction_read_only | false
resource_pool | general
memorycap | UNLIMITED
tempspacecap | UNLIMITED
runtimecap | UNLIMITED
enabled roles | dbduser*, dbadmin*, pseudosuperuser*
available roles | dbduser*, dbadmin*, pseudosuperuser*
ForceUDxFencedMode | 1
(17 rows)
42 - SHOW USER
显示数据库用户的配置参数设置。要获取用户级别参数的名称,请查询系统表 CONFIGURATION_PARAMETERS:
SELECT parameter_name, allowed_levels FROM configuration_parameters
WHERE allowed_levels ilike '%USER%' AND parameter_name ilike '%depot%';
parameter_name | allowed_levels
-------------------------+-------------------------
UseDepotForWrites | SESSION, USER, DATABASE
DepotOperationsForQuery | SESSION, USER, DATABASE
UseDepotForReads | SESSION, USER, DATABASE
(3 rows)
语法
SHOW USER { user‑name | ALL } [PARAMETER] { cfg‑parameter [,...] | ALL }
参数
-
user‑name | ALL
- 显示指定用户或所有用户的参数设置。
-
[PARAMETER] parameter-list
- 用户级别配置参数的逗号分隔列表。
PARAMETER ALL
- 显示为指定用户设置的所有配置参数。
特权
非超级用户:只能查看自己的配置参数设置。
示例
以下示例显示了 Yvonne 和 Ahmed 两个用户的配置参数设置:
=> SELECT user_name FROM v_catalog.users WHERE user_name != 'dbadmin';
user_name
-----------
Ahmed
Yvonne
(2 rows)
=> SHOW USER Yvonne PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Yvonne | DepotOperationsForQuery | Fetches
(1 row)
=> ALTER USER Yvonne SET PARAMETER UseDepotForWrites = 0;
ALTER USER
=> SHOW USER Yvonne PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Yvonne | DepotOperationsForQuery | Fetches
Yvonne | UseDepotForWrites | 0
(2 rows)
=> ALTER USER Ahmed SET PARAMETER DepotOperationsForQuery = 'Fetches';
ALTER USER
=> SHOW USER ALL PARAMETER ALL;
user | parameter | setting
--------+-------------------------+---------
Ahmed | DepotOperationsForQuery | Fetches
Yvonne | DepotOperationsForQuery | Fetches
Yvonne | UseDepotForWrites | 0
(3 rows)
另请参阅
ALTER USER
43 - 启动事务处理
启动事务块。
语法
START TRANSACTION [ isolation_level ]
其中,*isolation_level *是以下几项之一:
ISOLATION LEVEL { SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }READ { ONLY | WRITE }
参数
隔离级别(在下表中介绍)确定在其他事务并发运行时某个事务可以访问的数据。首个查询 (SELECT
) 或 DML 语句(INSERT
、DELETE
或 UPDATE
)运行后,隔离级别不能更改。
事务将保留其隔离级别直至其完成,即使在事务处理期间会话的隔离级别发生更改也是如此。Vertica 内部进程(例如
Tuple Mover 和
刷新操作)以及 DDL 操作始终以 SERIALIZABLE 隔离级别运行以确保一致性。
WORK | TRANSACTION
- 不起任何作用;它们是可选的关键字,目的是提高可读性。
ISOLATION LEVEL { | SERIALIZABLE | REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED }
- SERIALIZABLE:设置最严格的 SQL 事务隔离级别。此级别连续而不是并发模拟事务。它持有锁并阻止写入操作,直到事务完成为止。对于正常的查询操作,不建议使用。
- REPEATABLE READ:通过 Vertica 自动转换为 SERIALIZABLE。
- READ COMMITTED(默认值):允许并发事务。将 READ COMMITTED 隔离用于正常查询操作,但请注意,两者有细微差别。有关详细信息,请参阅 事务。
- READ UNCOMMITTED:通过 Vertica 自动转换为 READ COMMITTED。
READ {WRITE | ONLY}
- 确定事务是读取/写入还是只读。默认值为读/写模式。
如果将事务会话模式设置为只读,将不允许使用以下 SQL 命令,但是不会阻止所有磁盘写入操作:
- INSERT、UPDATE、DELETE 和 COPY - 如果要写入的表不是临时表
- 所有 CREATE、ALTER 和 DROP 命令
- GRANT、REVOKE 和 EXPLAIN - 如果要运行的命令在列出的命令当中。
特权
无
注意
BEGIN 执行与 START TRANSACTION 相同的功能。
示例
此示例显示如何启动事务处理。
= > START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
START TRANSACTION
=> CREATE TABLE sample_table (a INT);
CREATE TABLE
=> INSERT INTO sample_table (a) VALUES (1);
OUTPUT
--------
1
(1 row)
另请参阅
44 - TRUNCATE TABLE
移除与目标表关联的所有存储,同时保留完整的表定义。在执行语句后,TRUNCATE TABLE 将自动提交当前事务,无法回退。
TRUNCATE TABLE 同时还会执行以下操作:
语法
TRUNCATE TABLE [[database.]schema.]table‑name
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
table‑name
- 要截断的锚表或临时表的名称。不能截断外部表。
特权
非超级用户:
示例
请参阅截断表。
另请参阅
45 - UPDATE
对于满足指定条件的所有行,替换其指定列的值。表中所有其他列和行不变。若成功,UPDATE 将返回被更新的行数。为 0 的计数表示没有任何行与该条件匹配。
重要
Vertica 的 UPDATE 操作不同于传统数据库。它不会从磁盘存储中删除数据;而是写入两行,一行包含新数据,另一行标记为待删除。标记为待删除的行仍可用于历史查询。
语法
UPDATE [[database.]schema.]table-reference [AS] alias
SET set‑expression [,...]
[ FROM from-list ]
[ where‑clause ]
参数
-
[database.]schema
数据库和架构。默认架构为 public
。如果指定一个数据库,它必须是当前数据库。
-
table‑reference
- 一个表,为以下几项之一:
您无法更新投影。
-
别名
- 用于引用表的临时名称。
-
SET set‑expression
- 要使用一个或多个 SET 表达式更新的列。每个 SET 子句表达式指定一个目标列及其新值,如下所示:
column-name = { expression | DEFAULT }
其中:
-
column-name 是不含主键或外键
引用完整性约束的任意列,而且不是复杂类型。允许使用原生数组。
-
expression 指定要分配给列的值。该表达式可使用此表列或其他表列的当前值。例如:
=> UPDATE T1 SET C1 = C1+1
-
DEFAULT
将 column-name 设置为其默认值,或者如果没有为该列定义默认值,则将其忽略。
UPDATE 只修改通过 SET 子句指定的列。未指定的列保持不变。
-
FROM from‑list
- 表的表达式列表,允许其他表的列出现在 WHERE 条件和 UPDATE 表达式中。这类似于可在 SELECT 命令的 FROM 子句 中予以指定的表列表。
FROM 子句可以引用目标表,如下所示:
FROM DEFAULT [join-type] JOIN table-reference [ ON join-predicate ]
DEFAULT 指定要更新的表。此关键字只能在 FROM 子句中使用一次,且不能在 UPDATE 语句的其他位置使用。
特权
表所有者或用户 WITH GRANT OPTION 是授予者。
子查询和联接
UPDATE 支持子查询和联接,这有利于根据存储在其他表中的值来更新表中的值。有关详细信息,请参阅UPDATE 和 DELETE 语句中的子查询。
Vertica 采用 SQL-92 事务模型,因此连续的 INSERT、UPDATE 和 DELETE 语句包含在同一个事务中。您无需显式启动此事务,但必须使用 COMMIT 显式结束它,或者使用 COPY 隐式结束它。否则,Vertica 将放弃在该事务中所做的所有更改。
限制
-
不能更新不可变表。
-
不能更新复杂类型的列,原生数组除外。
-
如果 FROM 子句或 WHERE 谓词中指定的联接生成多个目标表中行的副本,则将任意选择表中该行的新值。
-
如果在目标表中启用了主键、唯一键或检查约束以自动强制实施,Vertica 会在您加载新数据时强制实施这些约束。如果发生违规,Vertica 会回滚操作并返回错误。
-
如果更新会违反表或架构磁盘配额,则操作将失败。有关详细信息,请参阅磁盘配额。
示例
在 fact
表中,对于 cost
列值大于 100 的所有行,修改其 price
列值:
=> UPDATE fact SET price = price - cost * 80 WHERE cost > 100;
在 retail.customer
表中,若 CID
列值大于 100,则将 state
列设置为 NH
:
=> UPDATE retail.customer SET state = 'NH' WHERE CID > 100;
要在 UPDATE 查询中使用表别名,请考虑以下两个表:
=> SELECT * FROM result_table;
cust_id | address
---------+--------------------
20 | Lincoln Street
30 | Beach Avenue
30 | Booth Hill Road
40 | Mt. Vernon Street
50 | Hillside Avenue
(5 rows)
=> SELECT * FROM new_addresses;
new_cust_id | new_address
-------------+---------------
20 | Infinite Loop
30 | Loop Infinite
60 | New Addresses
(3 rows)
以下查询和子查询使用表别名将 result_table
(别名 address
)中的 r
列更新为 new_addresses
表(别名 n
)中相应列的新地址:
=> UPDATE result_table r
SET address=n.new_address
FROM new_addresses n
WHERE r.cust_id = n.new_cust_id;
result_table
显示了顾客 ID 20 和 30 的 address
字段更新:
=> SELECT * FROM result_table ORDER BY cust_id;
cust_id | address
---------+------------------
20 | Infinite Loop
30 | Loop Infinite
30 | Loop Infinite
40 | Mt. Vernon Street
50 | Hillside Avenue
(5 rows)
不能使用 UPDATE 更新原生数组的单个元素。只能替换整个数组值。以下示例使用 ARRAY_CAT 将元素添加到数组列:
=> SELECT * FROM singers;
lname | fname | bands
--------+-------+---------------------------------------------
Cher | | ["Sonny and Cher"]
Jagger | Mick | ["Rolling Stones"]
Slick | Grace | ["Jefferson Airplane","Jefferson Starship"]
(3 rows)
=> UPDATE singers SET bands=ARRAY_CAT(bands,ARRAY['something new'])
WHERE lname='Cher';
OUTPUT
--------
1
(1 row)
=> SELECT * FROM singers;
lname | fname | bands
--------+-------+---------------------------------------------
Jagger | Mick | ["Rolling Stones"]
Slick | Grace | ["Jefferson Airplane","Jefferson Starship"]
Cher | | ["Sonny and Cher","something new"]
(3 rows)