华为云用户手册

  • maintenance_work_mem 参数说明:设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。 参数类型:USERSET 取值范围:整型,1024~INT_MAX,单位为KB。 默认值:小规格内存为512MB, 大规格内存为2GB(max_process_memory大于等于30GB为大规格内存,否则为小规格内存)。 设置建议: 建议设置此参数的值等于work_mem,可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。 当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。 如果进行大数据量的cluster等,可以在session中调大该值。
  • cstore_buffers 参数说明:设置列存和OBS、HDFS外表列存格式(orc、parquet、carbondata)所使用的共享缓冲区的大小。 参数类型:POSTMASTER 取值范围:整型,16384~INT_MAX,单位为KB。 默认值:CN为32MB,DN取公式计算:POWER(2,ROUND(LOG(max_process_memory*1024/18,2),0)) 设置建议: 列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。 OBS、HDFS外表使用cstore_buffers设置ORC、Parquet、Carbondata的元数据和数据的缓存,元数据缓存大小为cstore_buffers的1/4,最大不超过2GB,其余缓存空间为列存数据和外表列存格式数据共享使用。
  • buffer_ring_ratio 参数说明:设置并行导出时使用环形缓冲区的阈值大小。 参数类型:USERSET 取值范围:整型,1~1000 默认值:250 默认值表示阈值为shared_buffers的250/1000即1/4。 最小为shared_buffers的1/1000。 最大为shared_buffers的大小。 设置建议:导出时出现缓存命中率不符合预期的场景建议在DN中设置此参数。
  • temp_buffers 参数说明:设置每个数据库会话使用的LOCAL临时缓冲区的大小。 参数类型:USERSET 取值范围:整型,800~INT_MAX/2,单位为8KB。 默认值:8MB 在每个会话的第一次使用临时表之前可以改变temp_buffers的值,之后的设置将是无效的。 一个会话将按照temp_buffers给出的限制,根据需要分配临时缓冲区。如果在一个并不需要大量临时缓冲区的会话里设置一个大的数值,其开销只是一个缓冲区描述符的大小。当缓冲区被使用,就会额外消耗8192字节。
  • max_process_memory 参数说明:设置一个数据库节点可用的最大物理内存。 参数类型:POSTMASTER 取值范围:整型,2*1024*1024~INT_MAX/2,单位为KB。 默认值:非从备DN节点自动适配,公式为(物理内存大小)* 0.8 / (1+主DN个数),当结果不足2GB时,默认取2GB。从备DN默认为12GB。 设置建议: DN上该数值需要根据系统物理内存及单节点部署主DN个数决定的。计算公式如下:(物理内存大小 – vm.min_free_kbytes)* 0.8 / (n+主DN个数)。该参数目的是尽可能保证系统的可靠性,不会因数据库内存膨胀导致节点OOM。这个公式中提到vm.min_free_kbytes,其含义是预留操作系统内存供内核使用,通常用作操作系统内核中通信收发内存分配,至少为5%内存。即, max_process_memory=物理内存*0.8/(n+主DN个数),其中,当集群规模小于256时, n=1;当集群规模大于256且小于512时, n=2;当集群规模超过512时,n=3。 CN上该数值内存可设置与DN数值一样。 RAM:集群规划时分配给集群的最大使用内存。
  • enable_memory_limit 参数说明:启用逻辑内存管理模块。 参数类型:POSTMASTER 取值范围:布尔型 on表示启用逻辑内存管理模块。 off表示不启用逻辑内存管理模块。 默认值:on 若max_process_memory-max_shared_memory-cstore buffers少于2G,GaussDB(DWS)强制把enable_memory_limit设置为off。 max_shared_memory参数与shared_buffer、max_connections以及max_prepared_transactions参数强相关,如果max_shared_memory过大,可以通过调整这三个参数减小。 动态负载管理功能依赖内存管理功能,当关闭参数enable_memory_limit后,动态负载管理和TopSQL功能会失效。
  • 数据库用户类型 表1 数据库用户类型 用户类型 描述 可进行的操作 如何创建 管理员dbadmin 管理员也称作系统管理员,是指具有SYSADMIN属性的账户。 非三权分立模式下,拥有系统的最高权限,能够执行所有的操作。系统管理员具有与对象所有者相同的权限。 在GaussDB(DWS) 管理控制台创建集群时创建的用户dbadmin是系统管理员。 使用CREATE USER或ALTER USER语法创建和设置管理员用户。 CREATE USER sysadmin WITH SYSADMIN password '{Password}'; ALTER USER u1 SYSADMIN; 普通用户 普通用户 使用工具连接数据库。 拥有数据库系统特定操作的属性,如CREATEDB、CREATEROLE、SYSADMIN。 访问数据库对象。 执行SQL语句。 使用CREATE USER语法创建普通用户。 CREATE USER u1 PASSWORD '{Password}'; 私有用户 在非三权分立模式下,创建的具有INDEPENDENT属性的私有用户。 数据库管理员在未经其授权前,只能进行控制操作(DROP、ALTER、TRUNCATE),无权进行INSERT、DELETE、SELECT、UPDATE、COPY、GRANT、REVOKE、ALTER OWNER操作。 使用CREATE USER语法创建私有用户。 CREATE USER user_independent WITH INDEPENDENT IDENTIFIED BY '{Password}';
  • PG_RESOURCE_POOL PG_RESOURCE_POOL系统表存储数据库资源池的信息。 表1 PG_RESOURCE_POOL字段 名称 类型 描述 respool_name name 资源池名称。 mem_percent integer 内存配置的百分比。 cpu_affinity bigint 保留字段,无实际意义。 control_group name 资源池所在的control group名字。 active_statements integer 资源池上最大的并发数。 max_dop integer 资源池允许的简单作业最大并发数。-1和0代表不限制。 memory_limit name 资源池最大的内存。 parentid oid 父资源池OID。 io_limits integer 保留字段,无实际意义。 io_priority text 保留字段,无实际意义。 is_foreign boolean 表示资源池是否用于逻辑集群之外的用户。如果为true,表示资源池用来控制不属于当前资源池的普通用户的资源。 short_acc boolean 资源池是否开启短查询加速,默认开启。 短查询加速开启,简单查询在快车道管控。 短查询加速关闭,简单查询在慢车道管控。 except_rule text 资源池关联的异常规则,支持关联多个异常规则,异常规则间用逗号分隔。 父主题: 系统表
  • PG_SHADOW PG_SHADOW视图显示了所有在PG_AUTHID中标记了rolcanlogin的角色的属性。 此系统视图的名称源于它不是所有用户可读的,因为包含口令。PG_USER是一个在PG_SHADOW上全局可读的视图,只是把口令域填充成了空白。 表1 PG_SHADOW字段 名字 类型 引用 描述 usename name PG_AUTHID.rolname 用户名。 usesysid oid PG_AUTHID.oid 用户的ID。 usecreatedb boolean - 用户可以创建数据库。 usesuper boolean - 用户是系统管理员。 usecatupd boolean - 用户可以更新系统表。即使是系统管理员,如果此字段不为真,也不能更新系统表。 userepl boolean - 用户可以初始化流复制和使系统处于或不处于备份模式。 passwd text - 口令(可能是加密的);如果没有则为null。参阅PG_AUTHID获取加密的口令是如何存储的信息。 valbegin timestamp with time zone - 账户的有效开始时间;如果没有设置有效开始时间,则为NULL。 valuntil timestamp with time zone - 账户的有效结束时间;如果没有设置有效结束时间,则为NULL。 respool name - 用户使用的资源池。 parent oid - 父资源池。 spacelimit text - 永久表存储空间限额。 tempspacelimit text - 临时表存储空间限额。 spillspacelimit text - 算子落盘空间限额。 useconfig text[ ] - 运行时配置变量的会话缺省。 父主题: 系统视图
  • enable_dynamic_workload 参数说明:是否开启动态负载管理功能。 参数类型:POSTMASTER 取值范围:布尔型 on表示打开动态负载管理功能。 off表示关闭动态负载管理功能。 默认值:on 开启内存自适应后,收集统计信息后不再需要使用work_mem进行算子内存使用调优,由系统根据当前负载情况,为每个语句生成计划,并估算每个算子的内存使用量和整个语句的内存使用量。系统根据负载情况和整个语句内存使用量进行队列调度,所以多并发场景会出现语句排队的情况。 由于优化器行数估算不准现象的存在,会出现语句内存使用量低估或高估的情况。低估时,执行时内存会自动扩展。高估时,会导致系统内存利用不足,排队语句增多,可能导致性能非最优。此时需要识别语句估算内存远大于实际DN峰值内存的语句,通过设置query_max_mem进行调优,详见SQL调优关键参数调整。
  • topsql_retention_time 参数说明:设置历史TopSQL中gs_wlm_session_info和gs_wlm_operator_info表中数据的保存时间。 参数类型:SIGHUP 取值范围:整型,0~3650,单位为天。 值为0时,表示数据永久保存。 值大于0时,表示数据能够保存的对应天数。 默认值:30 设置此GUC参数启用数据保存功能前,请先清理gs_wlm_session_info和gs_wlm_operator_info表中的数据。 新建集群默认值为30,升级场景该参数的默认值为保持前向兼容维持原值。
  • transaction_pending_time 参数说明:当enable_transaction_parctl为on时,事务块语句和存储过程语句排队的最大时间。 参数类型:USERSET 取值范围:整型,-1~INT_MAX,单位为秒。 值为-1或0:事务块语句和存储过程语句无超时判断,排队至资源满足可执行条件。 值大于0:事务块语句和存储过程语句排队超过所设数值的时间后,无视当前资源情况强制执行。 默认值:0 此参数仅对存储过程及事务块的内部语句有效,即PG_SESSION_WLMSTAT中enqueue字段显示为Transaction或StoredProc的语句才会生效。
  • wlm_sql_allow_list 参数说明:用于指定资源管理SQL白名单语句,SQL白名单语句不受资源管理监控。 参数类型:SIGHUP 取值范围:字符串 默认值:空 wlm_sql_allow_list中可指定一条或多条SQL白名单语句,指定多条时,通过“;”进行分隔。 系统通过前置匹配判断SQL语句是否受监控,不区分大小写,例如:wlm_sql_allow_list='SELECT',则所有select语句均不受资源管理监控。 识别参数值白名单字符串头部的空格,例如:'SELECT'与' SELECT'的含义是不一致的,' SELECT'只过滤头部带空格的SELECT语句。 系统默认部分SQL语句为白名单语句,默认白名单语句不可修改;可以通过系统视图gs_wlm_sql_allow查询默认和已经通过GUC设置成功的SQL白名单语句。 通过wlm_sql_allow_list指定的SQL语句不可追加,只能通过覆盖的方式设置;若需追加SQL语句,需要先查出原先指定的GUC值,在原值后面加补上新增的语句,以“;”分隔后重新设置。
  • resource_track_duration 参数说明:设置资源监控实时视图(参见表1)中记录的语句执行结束后进行历史信息转存的最小执行时间。当执行完成的作业,其执行时间不小于此参数值时,作业信息会从实时视图(以statistics为后缀的视图)转存到相应的历史视图(以history为后缀的视图)中。该参数只有当enable_resource_track为on时才有效。 参数类型:USERSET 取值范围:整型,0~INT_MAX,单位为秒。 值为0时,资源监控实时视图(表1)中记录的所有语句都进行历史信息归档。 值大于0时,资源监控实时视图(表1)中记录的语句的执行时间超过这个值就会进行历史信息归档。 默认值:60s
  • session_respool 参数说明:当前的session关联的resource pool。 参数类型:USERSET 即如果先设置cgroup_name,再设置session_respool,那么session_respool关联的控制组起作用,如果再切换cgroup_name,那么新切换的cgroup_name起作用。 切换cgroup_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 建议尽量不要混合使用cgroup_name和session_respool。 取值范围:字符串,通过create resource pool所设置的资源池。 默认值:invalid_pool
  • space_readjust_schedule 参数说明:空间管控和空间统计功能中,控制是否触发自动校准以及校准空间误差阈值。该参数8.1.3及以上集群版本支持。 参数类型:SIGHUP 取值范围:字符串 off表示关闭自动校准功能。 auto表示打开自动校准功能,并且触发自动校准的误差阈值为1GB。 auto(空间大小+K/M/G)表示打开自动校准功能,并且触发自动校准的误差阈值为自定义的空间大小,单位:KB/MB/GB。例如,auto(200M)表示打开自动校准功能,且触发自动校准的误差阈值为200MB。 默认值:auto
  • enable_resource_record 参数说明:设置是否开启资源监控记录归档功能。开启时,对于执行结束的记录,会分别被归档到相应的INFO视图(GS_WLM_SESSION_INFO和GS_WLM_OPERAROR_INFO)。此参数需在CN和DN同时应用。 参数类型:SIGHUP 取值范围:布尔型 on表示开启资源监控记录归档功能。 off表示关闭资源监控记录归档功能。 默认值:on 新建集群默认值为on,升级场景该参数的默认值为保持前向兼容维持原值。
  • resource_track_level 参数说明:设置当前会话的资源监控的等级。该参数只有当参数enable_resource_track为on时才有效。 参数类型:USERSET 取值范围:枚举型 none,不开启资源监控功能。 query,开启query级别资源监控功能,开启此功能会把SQL语句的计划信息(类似explain输出信息)记录到top SQL中。 perf,开启perf级别资源监控功能,开启此功能会把包含实际执行时间和执行行数的计划信息(类似explain analyze输出信息)记录到top SQL中。 operator,开启operator级别资源监控功能,开启此功能不仅会把包含实际执行时间和执行行数的信息记录到top SQL中,还会把算子级别执行信息刷新到top SQL中。 默认值:query
  • enable_user_metric_persistent 参数说明:设置是否开启用户/资源池历史资源监控转存功能。开启时,对于PG_TOTAL_USER_RESOURCE_INFO视图中数据,会定期采样保存到GS_WLM_USER_RESOURCE_HISTORY系统表中;对于GS_RESPOOL_RESOURCE_INFO视图中数据,会定期采样保存到GS_RESPOOL_RESOURCE_HISTORY系统表中。 参数类型:SIGHUP 取值范围:布尔型 on表示开启用户/资源池历史资源监控转存功能。 off表示关闭用户/资源池历史资源监控转存功能。 默认值:on
  • resource_track_cost 参数说明:设置对当前会话的语句进行资源监控的最小执行代价。该参数只有当参数enable_resource_track为on时才有效。 参数类型:USERSET 取值范围:整型,-1~INT_MAX 值为-1时,不进行资源监控。 值大于或等于0时,对执行代价超过该参数值的语句进行资源监控。 默认值:0 新建集群默认值为0,升级场景该参数的默认值为保持前向兼容维持原值。
  • use_workload_manager 参数说明:是否开启资源管理功能。此参数需在CN和DN同时应用。 参数类型:SIGHUP 取值范围:布尔型 on表示打开资源管理。 off表示关闭资源管理。 当使用GUC参数设置来修改参数值时,新参数值只能对更改操作执行后启动的线程生效。此外,对于后台线程以及线程复用执行的新作业,该参数值的改动不会生效。如果希望这类线程即时识别参数变化,可以使用kill session或重启节点的方式来实现。 use_workload_manager参数由off变为on状态后,资源管理视图变为可用,并且可以查询off状态下统计的存储资源使用情况。若存在些许误差,则需要矫正用户使用的存储资源,可数据库中执行如下命令,在执行该命令的过程中,如果对表中插入数据,可能会出现统计不够准确的情况: 1 SELECT gs_wlm_readjust_user_space(0); 默认值:on
  • cgroup_name 参数说明:设置当前使用的Cgroups的名字或者调整当前group下排队的优先级。 即如果先设置cgroup_name,再设置session_respool,那么session_respool关联的控制组起作用,如果再切换cgroup_name,那么新切换的cgroup_name起作用。 切换cgroup_name的过程中如果指定到Workload控制组级别,数据库不对级别进行验证。级别的范围只要在1-10范围内都可以。 参数类型:USERSET 建议尽量不要混合使用cgroup_name和session_respool。 取值范围:字符串 默认值:DefaultClass:Medium DefaultClass:Medium表示DefaultClass下Timeshare控制组中的Medium控制组。
  • enable_track_record_subsql 参数说明:设置是否开启子语句记录归档功能。开启时,存储过程、匿名块内部的子语句会被纪录归档到相应的INFO表(GS_WLM_SESSION_INFO)。此参数为会话级参数,可在与CN的连接会话中设置生效,仅影响该会话连接中的语句;也可在CN和DN上同时设置,能全局生效。 参数类型:USERSET 取值范围:布尔型 on表示开启子语句资源监控记录归档功能。 off表示关闭子语句资源监控记录归档功能。 默认值:off
  • max_active_statements 参数说明:设置全局的最大并发数量。此参数只应用到CN,且针对一个CN上的执行作业。 数据库管理员需根据系统资源(如CPU资源、IO资源和内存资源)情况,调整此数值大小,使得系统支持最大限度的并发作业,且防止并发执行作业过多,引起系统崩溃。 参数类型:SIGHUP 取值范围:整型,-1 ~ INT_MAX。设置为-1和0表示对最大并发数不做限制。 默认值:60
  • 示例 以员工表emp,表的属主alice及角色matu、july为例,简要介绍数据脱敏过程。其中,表emp包含员工的姓名、手机号、邮箱、银行卡号、薪资等隐私数据。 使用管理员用户连接数据库后,创建角色alice、matu和july。 1 2 3 CREATE ROLE alice PASSWORD '{Password}'; CREATE ROLE matu PASSWORD '{Password}'; CREATE ROLE july PASSWORD '{Password}'; 赋予alice、matu和july当前数据库的模式权限。 1 GRANT ALL PRIVILEGES on schema public to alice,matu,july; 切换至角色alice,创建表emp并插入三条员工信息。 1 2 3 4 5 6 7 SET ROLE alice PASSWORD '{Password}'; CREATE TABLE emp(id int, name varchar(20), phone_no varchar(11), card_no number, card_string varchar(19), email text, salary numeric(100, 4), birthday date); INSERT INTO emp VALUES(1, 'anny', '13420002340', 1234123412341234, '1234-1234-1234-1234', 'smithWu@163.com', 10000.00, '1999-10-02'); INSERT INTO emp VALUES(2, 'bob', '18299023211', 3456345634563456, '3456-3456-3456-3456', '66allen_mm@qq.com', 9999.99, '1989-12-12'); INSERT INTO emp VALUES(3, 'cici', '15512231233', NULL, NULL, 'jonesishere@sina.com', NULL, '1992-11-06'); alice将表emp的读取权限授予matu、july。 1 GRANT SELECT ON emp TO matu, july; 创建脱敏策略mask_emp,仅alice可查看员工所有信息,matu和july对员工银行卡号和薪资数据不可见。字段card_no是数值类型,采用MASK_FULL全脱敏成固定值0;字段card_string是字符类型,采用MASK_PARTIAL按指定的输入输出格式对原始数据进行部分脱敏;字段salary是数值类型,采用MASK_PARTIAL指定数字9部分脱敏倒数第二位前的所有数位值。 1 2 3 4 CREATE REDACTION POLICY mask_emp ON emp WHEN (current_user IN ('matu', 'july')) ADD COLUMN card_no WITH mask_full(card_no), ADD COLUMN card_string WITH mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV','VVVV-VVVV-VVVV-VVVV','#',1,12), ADD COLUMN salary WITH mask_partial(salary, '9', 1, length(salary) - 2); 切换到matu和july,查看员工表emp。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SET ROLE matu PASSWORD '{Password}'; SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00 (3 rows) SET ROLE july PASSWORD '{Password}'; SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00 (3 rows) 若需要matu也有员工所有信息的查看权限,只有july不可见,修改策略生效范围即可。 1 2 SET ROLE alice PASSWORD '{Password}'; ALTER REDACTION POLICY mask_emp ON emp WHEN(current_user = 'july'); 切换到matu和july,重新查看员工表emp。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 SET ROLE matu PASSWORD '{Password}'; SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+------------------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 1234123412341234 | 1234-1234-1234-1234 | smithWu@163.com | 10000.0000 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 3456345634563456 | 3456-3456-3456-3456 | 66allen_mm@qq.com | 9999.9900 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00 (3 rows) SET ROLE july PASSWORD '{Password}'; SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 13420002340 | 0 | ####-####-####-1234 | smithWu@163.com | 99999.9990 | 1999-10-02 00:00:00 2 | bob | 18299023211 | 0 | ####-####-####-3456 | 66allen_mm@qq.com | 9999.9990 | 1989-12-12 00:00:00 3 | cici | 15512231233 | | | jonesishere@sina.com | | 1992-11-06 00:00:00 (3 rows) 员工信息phone_no、email和birthday也是隐私数据,更新脱敏策略mask_emp,新增三个脱敏列。 1 2 3 4 SET ROLE alice PASSWORD '{Password}'; ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN phone_no WITH mask_partial(phone_no, '*', 4); ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN email WITH mask_partial(email, '*', 1, position('@' in email)); ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN birthday WITH mask_full(birthday); 切换到july,查看表emp数据。 1 2 3 4 5 6 7 8 SET ROLE july PASSWORD '{Password}'; SELECT * FROM emp; id | name | phone_no | card_no | card_string | email | salary | birthday ----+------+-------------+---------+---------------------+----------------------+------------+--------------------- 1 | anny | 134******** | 0 | ####-####-####-1234 | ********163.com | 99999.9990 | 1970-01-01 00:00:00 2 | bob | 182******** | 0 | ####-####-####-3456 | ***********qq.com | 9999.9990 | 1970-01-01 00:00:00 3 | cici | 155******** | | | ************sina.com | | 1970-01-01 00:00:00 (3 rows) 通过视图redaction_policies和redaction_columns查看当前脱敏策略mask_emp的详细信息。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 SELECT * FROM redaction_policies; object_schema | object_owner | object_name | policy_name | expression | enable | policy_description | inherited ---------------+--------------+-------------+-------------+-----------------------------------+--------+--------------------+----------- public | alice | emp | mask_emp | ("current_user"() = 'july'::name) | t | | f (1 row) SELECT object_name, column_name, function_info FROM redaction_columns; object_name | column_name | function_info -------------+-------------+------------------------------------------------------------------------------------------------------- emp | card_no | mask_full(card_no) emp | card_string | mask_partial(card_string, 'VVVVFVVVVFVVVVFVVVV'::text, 'VVVV-VVVV-VVVV-VVVV'::text, '#'::text, 1, 12) emp | email | mask_partial(email, '*'::text, 1, "position"(email, '@'::text)) emp | salary | mask_partial(salary, '9'::text, 1, (length((salary)::text) - 2)) emp | birthday | mask_full(birthday) emp | phone_no | mask_partial(phone_no, '*'::text, 4) (6 rows) 新增一列salary_info,若需要将文本类型的薪资信息统一脱敏成“*.*”,可以创建自定义脱敏函数实现。此处采用PL/PGSQL语言定义脱敏函数mask_regexp_salary,创建脱敏列时,只需自定义脱敏的函数名和参数列表,详细内容可参考用户自定义函数。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 SET ROLE alice PASSWORD '{Password}'; ALTER TABLE emp ADD COLUMN salary_info TEXT; UPDATE emp SET salary_info = salary::text; CREATE FUNCTION mask_regexp_salary(salary_info text) RETURNS text AS $$ SELECT regexp_replace($1, '[0-9]+','*','g'); $$ LANGUAGE SQL STRICT SHIPPABLE; ALTER REDACTION POLICY mask_emp ON emp ADD COLUMN salary_info WITH mask_regexp_salary(salary_info); SET ROLE july PASSWORD '{Password}'; SELECT id, name, salary_info FROM emp; id | name | salary_info ----+------+------------- 1 | anny | *.* 2 | bob | *.* 3 | cici | (3 rows) 无需为表emp设置敏感策略,删除脱敏策略mask_emp。 1 2 SET ROLE alice PASSWORD '{Password}'; DROP REDACTION POLICY mask_emp ON emp;
  • 分割一个分区 范围分区表和列表分区表分割分语法有所区别: 使用ALTER TABLE语句为范围分区表分割一个分区。例如,将表web_returns_p1分区pxxxx以20201231为分割点分割为p2020和p20xx两个分区。 1 ALTER TABLE web_returns_p1 SPLIT PARTITION pxxxx AT(20201231) INTO (PARTITION p2020,PARTITION p20xx); 使用ALTER TABLE语句为列表分区表分割一个分区。例如,将表sales_info分区province2_202201分割为province3_202201和province4_202201两个分区。 1 ALTER TABLE sales_info SPLIT PARTITION province2_202201 VALUES(('202201', 'city5')) INTO (PARTITION province3_202201,PARTITION province4_202201);
  • 查询分区 查询分区p2019。 1 2 SELECT * FROM web_returns_p1 PARTITION (p2019); SELECT * FROM web_returns_p1 PARTITION FOR (20201231); 查看分区表信息,可使用系统表dba_tab_partitions。 1 SELECT * FROM dba_tab_partitions where table_name='web_returns_p1';
  • 对已有的表进行分区 表只能在创建时被分区。 如果用户有一个表想要分区,用户必须创建一个分过区的表,把原始表的数据载入到新表,再删除原始表并且把分过区的表重命名为原始表的名称。 用户还必须重新授权表上的权限。例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE web_returns_p2 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(20161231) END(20191231) EVERY(10000), PARTITION p0 END(maxvalue) ); 1 2 3 4 5 INSERT INTO web_returns_p2 SELECT * FROM web_returns_p1; DROP TABLE web_returns_p1; ALTER TABLE web_returns_p2 RENAME TO web_returns_p1; GRANT ALL PRIVILEGES ON web_returns_p1 TO dbadmin; GRANT SELECT ON web_returns_p1 TO jack;
  • 分区策略选择 当表有以下特征时,可以考虑使用表分区策略: 数据具有明显区间性的字段。 分区表需要根据有明显区间性字段进行表分区。比如按照日期、区域、数值等字段进行分区,时间字段是最常见的分区字段。 业务查询有明显的区间范围特征。 查询数据可落到区间范围指定的分区内,这样才能通过分区剪枝,只扫描查询需要的分区,从而提升数据扫描效率,降低数据扫描的IO开销。 表数据量比较大。 小表扫描本身耗时不大,分区表的性能收益不明显,因此只建议对大表采取分区策略。列存储模式下因为每个列是单独的文件存储,且最小的存储单元CU可存储6w行数据,因此对于列存分区表,建议每个分区的数据不小于DN个数*6w。
  • 创建范围(range)分区表 示例:创建一个按wr_returned_date_sk范围分区的表web_returns_p1。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 CREATE TABLE web_returns_p1 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE (wr_returned_date_sk) ( PARTITION p2016 VALUES LESS THAN(20161231), PARTITION p2017 VALUES LESS THAN(20171231), PARTITION p2018 VALUES LESS THAN(20181231), PARTITION p2019 VALUES LESS THAN(20191231), PARTITION pxxxx VALUES LESS THAN(maxvalue) ); 对于分区间隔固定、批量创建分区的场景。可使用如下示例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE web_returns_p2 ( wr_returned_date_sk integer, wr_returned_time_sk integer, wr_item_sk integer NOT NULL, wr_refunded_customer_sk integer ) WITH (orientation = column) DISTRIBUTE BY HASH (wr_item_sk) PARTITION BY RANGE(wr_returned_date_sk) ( PARTITION p2016 START(20161231) END(20191231) EVERY(10000), PARTITION p0 END(maxvalue) );
共100000条