云服务器内容精选

  • 语法格式 收集表的统计信息。 1 2 { ANALYZE | ANALYSE } [ { VERBOSE } ] [ table_name [ ( column_name [, ...] ) ] ]; 收集分区的统计信息。 1 2 3 { ANALYZE | ANALYSE } [ { VERBOSE } ] [ table_name [ ( column_name [, ...] ) ] ] PARTITION ( partition_name ) ; 普通分区表目前支持针对某个分区的统计信息的语法,但功能上不支持针对某个分区的统计信息收集。对指定分区执行ANALYZE,会有相应的WARNING提示。 不支持使用临时采样表来收集分区的统计信息。 不支持分区上的多列统计信息和表达式统计信息。 收集外表的统计信息。 1 2 { ANALYZE | ANALYSE } [ VERBOSE ] { foreign_table_name | FOREIGN TABLES };
  • 示例 使用ANALYZE语句更新表customer_info统计信息: 1 ANALYZE customer_info; 使用ANALYZE VERBOSE语句更新表customer_info统计信息,并输出表的相关信息: 1 2 3 4 5 ANALYZE VERBOSE customer_info; INFO: analyzing "cstore.pg_delta_3394584009"(cn_5002 pid=53078) INFO: analyzing "public.customer_info"(cn_5002 pid=53078) INFO: analyzing "public.customer_info" inheritance tree(cn_5002 pid=53078) ANALYZE
  • 注意事项 仅8.1.1及以上集群版本支持在匿名块、事务块、函数或存储过程内对单表进行ANALYZE操作。 对于ANALYZE全库,库中各表的ANALYZE处于不同的事务中,所以不支持在匿名块、事务块、函数或存储过程内对全库执行ANALYZE。 统计信息的回滚操作不支持PG_CLASS中相关字段的回滚。 ANALYZE VERIFY操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。 单次新增、修改量占表总量10%以上场景,需在业务中增加显式Analyze操作。 更多开发设计规范参见总体开发设计规范。
  • 参数说明 VERBOSE 启用显示进度信息。 如果指定了VERBOSE,ANALYZE发出进度信息,表明目前正在处理的表。各种有关表的统计信息也会打印出来。 table_name 需要分析的特定表的表名(可能会带模式名),如果省略,将对数据库中的所有表(非外部表)进行分析。 对于ANALYZE收集统计信息,目前仅支持行存表、列存表、HDFS表、ORC格式的OBS外表、CARBONDATA格式的OBS外表、协同分析的外表。 取值范围:已有的表名。 column_name,column_1_name,column_2_name 需要分析特定列的列名,默认为所有列。 取值范围:已有的列名。 partition_name 如果table为分区表,在关键字PARTITION后面指定分区名partition_name表示分析该分区表的统计信息。目前语法上支持分区表做ANALYZE,但功能实现上暂不支持对指定分区统计信息的分析。 取值范围:表的某一个分区名。 foreign_table_name 需要分析的特定外表的表名(可能会带模式名),该表的数据存放于HDFS分布式文件系统中。 取值范围:已有的表名。 FOREIGN TABLES 分析所有当前用户权限下,数据位于HDFS分布式文件系统中的HDFS外表。 index_name 需要分析的特定索引表的表名(可能会带模式名)。 取值范围:已有的表名。 FAST|COMPLETE 对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。 对于列存表,FAST模式下主要对于列存表的CRC和magic进行校验,如果校验失败则会告警;而COMPLETE模式下,则主要对列存表的CU进行解析校验。 CASCADE CASCADE模式下会对当前表的所有索引进行检测处理。
  • 功能描述 用于收集有关数据库中表内容的统计信息,统计结果存储在系统表PG_STATISTIC下。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。 如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column和partition_name参数把分析限定在特定的表、列或分区表中。 能够执行ANALYZE特定表的用户,包括表的所有者、表所在数据库的所有者、通过GRANT被授予该表上ANALYZE权限的用户或者被授予了gs_role_analyze_any角色的用户以及有SYSADMIN属性的用户。 在百分比采样收集统计信息时,用户需要被授予ANALYZE和SELECT权限。 ANALYZE|ANALYSE VERIFY用于检测数据库中普通表(行存表、列存表)的数据文件是否损坏,目前此命令暂不支持HDFS表。
  • 示例 1 2 3 4 5 6 7 8 9 10 11 DROP TABLE IF EXISTS CUSTOMER; CREATE TABLE CUSTOMER ( C_CUSTKEY BIGINT NOT NULL CONSTRAINT C_CUSTKEY_pk PRIMARY KEY , C_NAME VARCHAR(25) , C_ADDRESS VARCHAR(40) , C_NATIONKEY INT , C_PHONE CHAR(15) , C_ACCTBAL DECIMAL(15,2) ) DISTRIBUTE BY HASH(C_CUSTKEY); 使用ANALYZE语句更新表customer_info统计信息: 1 ANALYZE CUSTOMER; 使用ANALYZE VERBOSE语句更新表customer_info统计信息,并输出表的相关信息: 1 ANALYZE VERBOSE CUSTOMER;
  • 语法格式 收集表的统计信息。 1 2 { ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ]; 收集分区表的统计信息。 1 2 3 { ANALYZE | ANALYSE } [ VERBOSE ] [ table_name [ ( column_name [, ...] ) ] ] PARTITION ( patrition_name ) ; 普通分区表目前支持针对某个分区的统计信息的语法,但功能上不支持针对某个分区的统计信息收集。对指定分区执行ANALYZE,会有相应的WARNING提示。 收集外表的统计信息。 1 2 { ANALYZE | ANALYSE } [ VERBOSE ] { foreign_table_name | FOREIGN TABLES };
  • 参数说明 VERBOSE 启用显示进度信息。 如果指定了VERBOSE,ANALYZE发出进度信息,表明目前正在处理的表。各种有关表的统计信息也会打印出来。 table_name 需要分析的特定表的表名(可能会带模式名),如果省略,将对数据库中的所有表(非外部表)进行分析。 对于ANALYZE收集统计信息,目前仅支持行存表、列存表、HDFS表、ORC格式的OBS外表、CARBONDATA格式的OBS外表、协同分析的外表。 取值范围:已有的表名。 column_name,column_1_name,column_2_name 需要分析特定列的列名,默认为所有列。 取值范围:已有的列名。 partition_name 如果table为分区表,在关键字PARTITION后面指定分区名partition_name表示分析该分区表的统计信息。目前语法上支持分区表做ANALYZE,但功能实现上暂不支持对指定分区统计信息的分析。 取值范围:表的某一个分区名。 foreign_table_name 需要分析的特定外表的表名(可能会带模式名),该表的数据存放于HDFS分布式文件系统中。 取值范围:已有的表名。 FOREIGN TABLES 分析所有当前用户权限下,数据位于HDFS分布式文件系统中的HDFS外表。 index_name 需要分析的特定索引表的表名(可能会带模式名)。 取值范围:已有的表名。 FAST|COMPLETE 对于行存表,FAST模式下主要对于行存表的CRC和page header进行校验,如果校验失败则会告警; 而COMPLETE模式下,则主要对行存表的指针、tuple进行解析校验。 对于列存表,FAST模式下主要对于列存表的CRC和magic进行校验,如果校验失败则会告警;而COMPLETE模式下,则主要对列存表的CU进行解析校验。 CASCADE CASCADE模式下会对当前表的所有索引进行检测处理。
  • 功能描述 用于收集有关数据库中表内容的统计信息,统计结果存储在系统表PG_STATISTIC下。执行计划生成器会使用这些统计数据,以确定最有效的执行计划。 如果没有指定参数,ANALYZE会分析当前数据库中的每个表和分区表。同时也可以通过指定table_name、column和partition_name参数把分析限定在特定的表、列或分区表中。 能够执行ANALYZE特定表的用户,包括表的所有者、表所在数据库的所有者、通过GRANT被授予该表上ANALYZE权限的用户或者被授予了gs_role_analyze_any角色的用户以及有SYSADMIN属性的用户。 在百分比采样收集统计信息时,用户需要被授予ANALYZE和SELECT权限。 ANALYZE|ANALYSE VERIFY用于检测数据库中普通表(行存表、列存表)的数据文件是否损坏,目前此命令暂不支持HDFS表。
  • 注意事项 仅8.1.1及以上集群版本支持在匿名块、事务块、函数或存储过程内对单表进行ANALYZE操作。 对于ANALYZE全库,库中各表的ANALYZE处于不同的事务中,所以不支持在匿名块、事务块、函数或存储过程内对全库执行ANALYZE。 统计信息的回滚操作不支持PG_CLASS中相关字段的回滚。 ANALYZE VERIFY操作处理的大多为异常场景检测需要使用RELEASE版本。ANALYZE VERIFY场景不触发远程读,因此远程读参数不生效。对于关键系统表出现错误被系统检测出页面损坏时,将直接报错不再继续检测。 单次新增、修改量占表总量10%以上场景,需在业务中增加显式Analyze操作。 更多开发设计规范参见总体开发设计规范。
  • 示例 将创建在模式tpcds里的所有表(和视图)的SELECT权限授予每一个用户: 1 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT SELECT ON TABLES TO PUBLIC; 将tpcds下的所有表的插入权限授予用户jack: 1 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT INSERT ON TABLES TO jack; 撤销上述权限: 1 2 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE SELECT ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE INSERT ON TABLES FROM jack; 假设有两个用户test1、test2,如果想要test2用户对test1用户未来创建的表都有查询权限可以用如下操作: 首先,把test1的schema的权限赋权给test2用户: 1 GRANT usage, create ON SCHEMA test1 TO test2; 其次,把test1用户下的表的查询权限赋值给test2用户: 1 ALTER DEFAULT PRIVILEGES FOR USER test1 IN SCHEMA test1 GRANT SELECT ON tables TO test2; 然后,test1用户创建表: 1 2 SET ROLE test1 password '{password}'; CREATE TABLE test3( a int, b int); 最后,用test2用户去查询: 1 2 3 4 5 SET ROLE test2 password '{password}'; SELECT * FROM test1.test3; a | b ---+--- (0 rows)
  • 参数说明 target_role 已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。 target_role必须有schema_name的CREATE权限。查看角色/用户是否具有schema的CREATE权限可使用has_schema_privilege函数。 1 SELECT a.rolname, n.nspname FROM pg_authid as a, pg_namespace as n WHERE has_schema_privilege(a.oid, n.oid, 'CREATE'); 取值范围:已有角色的名称。 schema_name 现有模式的名称。 如果指定了模式名,那么之后在这个模式下面创建的所有对象默认的权限都会被修改。如果IN SCHEMA被省略,那么全局权限会被修改。 取值范围:现有模式的名称。 role_name 被授予或者取消权限角色的名称。 取值范围:已存在的角色名称。 如果想删除一个被赋予了默认权限的角色,必须撤销其默认权限的更改或者使用DROP OWNED BY删除该角色的默认权限记录。
  • 语法格式 1 2 3 4 ALTER DEFAULT PRIVILEGES [ FOR { ROLE | USER } target_role [, ...] ] [ IN SCHEMA schema_name [, ...] ] abbreviated_grant_or_revoke; 其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。 1 2 3 4 5 6 7 8 grant_on_tables_clause | grant_on_functions_clause | grant_on_types_clause | grant_on_sequences_clause | revoke_on_tables_clause | revoke_on_functions_clause | revoke_on_types_clause | revoke_on_sequences_clause 其中grant_on_tables_clause子句用于对表授权。 1 2 3 4 5 GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFEREN CES | TRIGGER | ANALYZE | ANALYSE | VACUUM | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON TABLES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_functions_clause子句用于对函数授权。 1 2 3 4 GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTIONS TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_types_clause子句用于对类型授权。 1 2 3 4 GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中grant_on_sequences_clause子句用于对序列授权。 1 2 3 4 5 GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES TO { [ GROUP ] role_name | PUBLIC } [, ...] [ WITH GRANT OPTION ] 其中revoke_on_tables_clause子句用于回收表对象的权限。 1 2 3 4 5 6 REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ANALYZE | ANALYSE | VACUUM | ALTER | DROP } [, ...] | ALL [ PRIVILEGES ] } ON TABLES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_functions_clause子句用于回收函数的权限。 1 2 3 4 5 REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTIONS FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_types_clause子句用于回收类型的权限。 1 2 3 4 5 REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ] 其中revoke_on_sequences_clause子句用于回收序列的权限。 1 2 3 4 5 6 REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON SEQUENCES FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT | CASCADE CONSTRAINTS ]
  • 示例 创建用户: 1 CREATE USER jack PASSWORD '{Password}'; 创建模式: 1 CREATE SCHEMA tpcds; 将创建在模式tpcds里的所有表(和视图)的SELECT权限授予每一个用户: 1 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT SELECT ON TABLES TO PUBLIC; 将tpcds下的所有表的插入权限授予用户jack: 1 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds GRANT INSERT ON TABLES TO jack; 撤销上述权限: 1 2 ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE SELECT ON TABLES FROM PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA tpcds REVOKE INSERT ON TABLES FROM jack; 假设有两个用户test1、test2,如果想要test2用户对test1用户未来创建的表都有查询权限可以用如下操作: 创建用户test1、test2: 1 2 CREATE USER test1 PASSWORD '{Password}'; CREATE USER test2 PASSWORD '{Password}'; 首先,把test1的schema的权限赋权给test2用户: 1 GRANT usage, create ON SCHEMA test1 TO test2; 其次,把test1用户下的表的查询权限赋值给test2用户: 1 ALTER DEFAULT PRIVILEGES FOR USER test1 IN SCHEMA test1 GRANT SELECT ON tables TO test2; 然后,test1用户创建表: 1 2 SET ROLE test1 password '{Password}'; CREATE TABLE test3( a int, b int); 最后,用test2用户去查询: 1 2 SET ROLE test2 password '{Password}'; SELECT * FROM test1.test3;
  • 参数说明 target_role 已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。 target_role必须有schema_name的CREATE权限。查看角色/用户是否具有schema的CREATE权限可使用has_schema_privilege函数。 1 SELECT a.rolname, n.nspname FROM pg_authid as a, pg_namespace as n WHERE has_schema_privilege(a.oid, n.oid, 'CREATE'); 取值范围:已有角色的名称。 schema_name 现有模式的名称。如果指定了模式名,那么之后在这个模式下面创建的所有对象默认的权限都会被修改。如果IN SCHEMA被省略,那么全局权限会被修改。 取值范围:现有模式的名称。 role_name 被授予或者取消权限角色的名称。 取值范围:已存在的角色名称。 如果想删除一个被赋予了默认权限的角色,有必要恢复改变的缺省权限或者使用DROP OWNED BY来为角色脱离缺省的权限记录。