华为云用户手册

  • 云耀 云服务器配置 选型 表1 云耀云服务器固定带宽套餐配置选型 类型 实例规格 云硬盘 带宽 适用场景 入门型 1vCPUs | 1G 40GB 高IO 1Mbit/s 面向轻型负载提供基础的计算能力,适用于入门级网站搭建应用。 基本型 1vCPUs | 2G 40GB 高IO 1Mbit/s 面向小型负载提供适合的计算能力,适用于小型网站、软件及应用。 进阶型 2vCPUs | 4G 40GB 高IO 2Mbit/s 面向中小型负载提供适合的计算能力,适用于中小型网站、软件、应用及系统。 随心购 您可以根据具体的业务场景自定义云服务器的规格,详见表2。 表2 支持自定义的云耀云服务器固定带宽套餐配置 实例规格 云硬盘 带宽 1vCPUs | 1G 1vCPUs | 2G 2vCPUs | 4G 4vCPUs | 8G 8vCPUs | 16G 1vCPUs | 4G 2vCPUs | 8G 4vCPUs | 16G 8vCPUs | 32G 40GB 高IO 60GB 高IO 80GB 高IO 1 Mbit/s 2 Mbit/s 5 Mbit/s 10 Mbit/s 15 Mbit/s 支持暂不配置带宽
  • Linux操作系统使用须知 不要修改“/etc/issue”文件内容,否则可能导致系统发行版本无法被识别。 不要删除系统目录或文件,否则可能导致系统无法正常运行或启动。 不要修改系统目录的权限或名称,否则可能导致系统无法正常运行或启动。 请勿随意升级Linux操作系统的内核。 不建议删除重置密码进程“CloudResetPwdAgent”和“CloudResetPwdUpdateAgent”,否则会导致一键重置密码功能不可用。 不建议修改系统默认DNS SERVER(“/etc/resolv.conf”),否则可能会导致软件源、NTP等内部服务无法使用。 不建议修改主机默认的内网网络配置信息(IP、子网掩码及网关地址),否则可能会导致网络异常。
  • Windows操作系统使用须知 不要结束系统进程,结束系统进程可能会导致服务器发生蓝屏、重启。 建议您预留2G以上的内存,否则在使用过程中可能会出现蓝屏、卡顿、服务无法正常运行等情况。 不建议修改注册表,修改注册表可能会导致系统启动失败。如果一定要修改,请在修改前备份注册表。 不建议修改服务器时钟,修改服务器时钟可能会使DHCP租约失效进而导致IP丢失。 不建议删除重置密码进程“CloudResetPwdAgent”和“CloudResetPwdUpdateAgent”,否则会导致一键重置密码功能不可用。 不建议关闭虚拟内存,关闭虚拟内存可能会使系统性能降低或运行异常。 不要删除VMTool程序,会导致云服务器运行异常。
  • 云耀云服务器使用场景须知 禁止使用云耀云服务器搭建赌博、私服、跨境VPN等违法违规业务。 禁止使用云耀云服务器对电商网站开展刷单、刷广告等虚假交易操作。 禁止利用云耀云服务器对外部系统发起网络攻击,如:DDoS攻击、CC攻击,Web攻击,暴力破解,传播病毒、木马等。 禁止使用云耀云服务器提供流量穿透服务。 禁止利用云耀云服务器搭建爬虫环境,对外部系统发起爬虫搜索。 未经外部系统主体授权,禁止利用云耀云服务器对外部系统发起扫描、渗透等探测行为。 禁止在云耀云服务器上部署任何违法违规网站和应用。
  • 使用限制 请勿卸载云服务器硬件的驱动程序。 请勿在云服务器上加载外接硬件设备,例如:硬件加密狗、U盘等。 请勿修改网卡的MAC地址。 云耀云服务器不支持二次虚拟化。 不支持使用云耀云服务器创建私有镜像。 部分软件的鉴权模式可能会导致License与物理机的硬件信息绑定,云服务器的迁移操作可能会引起物理信息变更进而导致License失效。 由于物理机故障导致云服务器发生迁移,迁移时可能会出现重启或关机现象,建议您在系统业务进程配置自动拉起和开机自启动,或者通过业务集群部署、主备部署等方式实现业务的高可用。 建议您为部署核心关键业务的云服务器做好数据备份。 建议您为云服务器上的应用业务指标做好监控配置。 不建议您修改默认的DNS,如您有公网DNS配置需求,可以在云服务器上配置公网DNS和内网DNS。
  • 云耀云服务器与弹性云服务器的购买和配置区别 表1 云耀云服务器与弹性云服务器的购买和配置区别 产品优势 特点 云耀云服务器 HE CS 弹性云服务器 ECS 更轻量的业务场景 适用的场景 适用于网站搭建、开发测试环境、企业应用等低负载应用场景。 全业务场景,典型场景有:网站应用、企业电商、图形渲染、数据分析、高性能计算等高负载应用场景。 更优惠的计费方式 计费模式 包年/包月 包年/包月 按需计费 竞价计费 规格 按套餐售卖,提供多种vCPUs | 内存比的套餐类型。 分为入门型、基本型、进阶型,或自定义配置HECS的规格。 多种规格实例类型和规格。 ECS实例类型 推荐参考ECS智选推荐。 磁盘 购买HECS时,以控制台套餐实际情况为准。 新增磁盘支持如下磁盘类型: 高IO 超高IO 支持选择多种磁盘类型。 弹性云服务器支持使用的磁盘类型,请参见云硬盘。 网络 自动分配弹性公网IP。 购买HECS时如果选择的是自定义配置,带宽类型选择“暂不配置”,那么支持在购买完成后挂载弹性公网IP。 默认BGP,以控制台套餐实际情况为准。 带宽类型为按带宽计费。 自定义是否绑定弹性公网IP。 线路类型可选。 带宽类型分为按带宽计费、按流量类计费、共享带宽。 更简单的使用体验 产品优势 易搭建、更实惠、易维护、更安全 稳定可靠、安全保障、软硬结合、弹性伸缩 镜像 创建HECS:公共镜像、市场镜像,基本覆盖主流应用场景,满足用户基本需求。 镜像种类、数目丰富,包括:公共镜像、私有镜像、共享镜像、市场镜像。 鉴权方式 密码。 密码、密钥对。 集成的云产品 主机安全 云监控 (支持在HECS控制台设置告警规则) 主机安全 云监控 集成的应用管理 以高频使用的功能为例: CloudShell登录Linux云服务器。 磁盘挂载、扩容、新增。 安全组配置。 添加网卡、删除网卡、切换VPC。 支持查看各区域HECS资源分布。 应用搭建指导。 以高频使用的功能为例: CloudShell登录Linux云服务器。 磁盘挂载、扩容、新增。 安全组配置。 添加网卡、删除网卡、切换VPC。 支持查看各区域ECS资源分布。
  • 云耀云服务器与普通ECS、普通VPS功能对比 表2 云耀云服务器与普通ECS、普通VPS功能对比 产品 云耀云服务器 普通ECS 普通VPS 客户群体 中小企业、开发者、学生 大中型企业用户 有端到端技术实力的用户 应用场景 轻量级应用场景: 轻量企业OA、博客、论坛 云端开发测试环境 跨境电商管理,网站建设 架构复杂的应用场景: 高并发网站,复杂分布集群 大型游戏,大数据分析 视频解码,AI应用 各类自建应用: 轻量级场景 架构复杂的应用场景 自定义场景 技术能力要求 低 中 高 运维能力要求 低 中 高 建设成本 低 中 高 售卖方式 高性价比套餐,整体更优惠 灵活选配资源,独立叠加计费 购买全部资源 应用构建 部分场景开箱即用 手动搭建 全流程手动搭建 管理控制台 一站式整合,独立且简化 面向全业务,较多细节 全流程手动搭建 镜像配置 丰富的应用镜像 丰富的应用镜像 系统镜像 网络配置 自动创建 手动配置 全流程手动配置 华为生态 支持 支持 不支持
  • 云耀云服务器与弹性云服务器区别 与弹性云服务器相比,云耀云服务器简化了购买ECS过程中的一些高级配置,一站式融合购买、登录、磁盘配置、网络配置、云监控、主机安全等多种功能,帮助您更加便捷高效的部署、配置和管理应用。 HECS底层使用的物理硬件资源与ECS一致,同CPU、内存的HECS与ECS计算能力在同一标准。 云耀云服务器与弹性云服务器的主要区别: 云耀云服务器:云耀云服务器是可以快速搭建简单应用的新一代云服务器,按已搭配的套餐售卖,适用于低负载应用场景,可以更加便捷、更加高效的部署、配置和管理应用。 高负载应用场景推荐使用弹性 云服务器ECS ,性能更稳定。 弹性云服务器:弹性云服务器提供多种计费模式、规格类型、镜像类型、磁盘类型,针对不同的业务场景,自定义配置弹性云服务器。
  • 注意事项 通过ALTER修改enable_hstore值可以将列存表变成HStore表,或者将HStore修改成列存表。但需要注意enable_delta为on时,无法设置enable_hstore为on。 对于部分ALTER操作(修改列类型,分区合并,添加NOT NULL约束,添加主键约束),HStore表需要先将数据MERGE到主表然后再执行原有的ALTER逻辑,这可能会带来额外的性能开销, 性能影响大小与delta表的数据量相关。 当需要增加列时, 建议不要与其它类型的ALTER(比如修改列类型等)组合使用,在一条ALTER里只有ADD COLUMN情况下,由于不需要做FULL MERGE, 性能会有很大提升。 不支持修改存储参数ORIENTATION。
  • 参数说明 第一种不指定索引。会在所有主键或唯一索引上检查冲突,有冲突就会忽略或者更新。 第二种指定索引。会从ON CONFLICT子句中指定列名、包含列名的表达式或者约束名上推断主键或者唯一索引。 唯一索引推断 对于第二种语法形式,通过指定列名或者约束名推断主键或者唯一索引。列名可以是单一列名,或者由多个列名组成的表达式,比如column1,column2,column3。 UPDATE子句 UPDATE子句可以通过VALUES(colname)或者EXCLUDED.colname引用插入的数据。EXCLUDED表示因冲突原本该排除的数据行。 WHERE子句 用于在数据冲突时,判断是否满足指定条件。如果满足,则更新冲突数据。否则忽略。 只有第二种语法形式的冲突更新语法可以指定WHERE子句。即 INSERT INTO ON CONFLICT(...) DO UPDATE SET WHERE
  • 语法格式 表1 UPSERT语法格式 语法格式 冲突更新 冲突忽略 第一种:不指定索引 INSERT INTO ON DUPLICATE KEY UPDATE INSERT IGNORE INSERT INTO ON CONFLICT DO NOTHING 第二种:从指定列名或者约束上可以推断唯一约束 INSERT INTO ON CONFLICT(...) DO UPDATE SET INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO UPDATE SET INSERT INTO ON CONFLICT(...) DO NOTHING INSERT INTO ON CONFLICT ON CONSTRAINT con_name DO NOTHING
  • 示例 创建表reason_upsert并向表中插入数据: 1 2 3 4 5 6 7 CREATE TABLE reason_upsert ( a int primary key, b int, c int )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); INSERT INTO reason_upsert VALUES (1, 2, 3); 忽略冲突的数据: 1 INSERT INTO reason_upsert VALUES (1, 4, 5),(2, 6, 7) ON CONFLICT(a) DO NOTHING; 更新冲突的数据: 1 INSERT INTO reason_upsert VALUES (1, 4, 5),(3, 8, 9) ON CONFLICT(a) DO UPDATE SET b = EXCLUDED.b, c = EXCLUDED.c;
  • 约束限制 当需要使用HStore表时,需要同步修改以下几个参数的默认值,否则会导致HStore表性能严重劣化。 推荐的参数修改配置是:autovacuum_max_workers_hstore=3,autovacuum_max_workers=6,autovacuum=true。 当前HStore与列存都不支持使用vacuum清理索引脏数据,在频繁update场景可能会导致索引膨胀,后续版本会支持。 当使用HStore异步排序功能时,有两点需要注意。 异步排序期间可能会阻塞部分数据的DML操作,最大的阻塞粒度为异步排序的行数阈值,因此在反复DML的场景下不建议使用此功能。 自动异步排序与列存vacuum互斥,当autovacuum流程中满足列存vacuum的条件,则直接跳过流程中的异步排序,等待下次触发(极端场景下因为反复大批量DML操作的执行,列存vacuum会不停被触发,因此异步排序总是无法被触发)。
  • autovacuum_max_workers_hstore 参数说明:设置Autovacuum_max_workers里面,能同时运行的专用于清理hstore的自动清理线程的最大数量。 参数类型:SIGHUP 取值范围:整型 默认值:1 当需要使用hstore表时,一定要同步修改以下几个参数的默认值,否则会导致hstore表性能严重劣化,推荐的修改配置是: autovacuum_max_workers_hstore=3,autovacuum_max_workers=6,autovacuum=true。
  • gtm_option 参数说明: GaussDB (DWS)场景下,指定GTM运行模式。该参数仅8.2.1及以上集群版本支持。 GTM模式:常规模式,由GTM统一管理运行中的事务,以及XID和CSN的分配工作。 GTM-Lite模式:GTM只负责XID的分配和CSN的更新,不再负责全局事务管理。GTM-Lite模式适用于高并发,短查询的TP场景,可以在保证事务一致性的情况下提升查询性能。 GTM-Free模式:分布式事务只支持写外部一致性,不具有读外部一致性。实时数仓场景下设置该模式不生效。 参数类型:POSTMASTER 取值范围:枚举类型 gtm或0:表示开启GTM模式。 gtm-lite或1:表示开启GTM-Lite模式。 gtm-free或2:表示开始GTM-Free模式。 默认值:gtm GaussDB(DWS)和GTM都有相同含义的gtm_option参数,对于GTM和GTM-Lite两种模式,一定要在gaussdb和gtm上设置为相同的模式,否则会出现业务报错无法执行的问题。 GTM-Free模式可以通过enable_gtm_free = on或gtm_option = gtm-free的任一方法开启。 设置非GTM-Free模式时,enable_gtm_free 必须设置为off。 GTM-Free模式仅在混合云与ESL场景设置后生效。
  • enable_hstore_keyby_upsert 参数说明:用于控制是否开启hstore表对于批量upsert的特定优化,针对前端可以保证不会并发upsert到同一行且是全列upsert的场景,建议开启,性能会有较大提升,该参数仅8.3.0及以上集群版本支持。 参数类型:USERSET 取值范围:布尔型 on表示开启对hstore表上的upsert特定优化。 off表示关闭对hstore表上的upsert特定优化,走老的流程。 默认值:off
  • autovacuum_max_workers 参数说明:设置能同时运行的自动清理线程的最大数量,该参数的取值上限与max_connections和job_queue_processes大小有关。 参数类型:SIGHUP 取值范围:整型 最小值为0,表示不会自动进行autovacuum。 理论最大值为262143,实际最大值为动态值。计算公式为“262143 - max_inner_tool_connections - max_connections - job_queue_processes - 辅助线程数 – autovacuum的launcher线程数 - 1”,其中辅助线程数和autovacuum的launcher线程数由两个宏来指定,当前版本的默认值分别为20和2。 默认值:4
  • 示例 创建表reason_t2: 1 2 3 4 5 6 7 CREATE TABLE reason_t2 ( TABLE_SK INTEGER , TABLE_ID VARCHAR(20) , TABLE_NA VARCHAR(20) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); INSERT INTO reason_t2 VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB'); 使用WHERE 条件删除: 1 2 DELETE FROM reason_t2 WHERE TABLE_SK = 2; DELETE FROM reason_t2 AS rt2 WHERE rt2.TABLE_SK = 2; 使用IN语法删除: 1 DELETE FROM reason_t2 WHERE TABLE_SK in (1,3);
  • 注意事项 如果需要删除表上的所有数据,建议使用TRUNCATE语法,可以有效提高性能同时减少空间膨胀。 HStore表上的单条Delete操作,会往Delta中插入一条type是D的记录,同时在更新内存更新链用于管理并发。 HStore表上的批量Delete操作,对于每个CU上的连续delete,会插入一条type是D的记录。 对于并发delete场景, 传统列存储格式由于同时操作相同CU时会阻塞所以并发性能较差, 对于HStore表由于不需要阻塞等待,并发delete性能可达到列存的百倍以上。 语法完全兼容列存,更多信息可以参考UPDATE语法。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 MERGE INTO table_name [ [ AS ] alias ] USING { { table_name | view_name } | subquery } [ [ AS ] alias ] ON ( condition ) [ WHEN MATCHED THEN UPDATE SET { column_name = { expression | DEFAULT } | ( column_name [, ...] ) = ( { expression | DEFAULT } [, ...] ) } [, ...] [ WHERE condition ] ] [ WHEN NOT MATCHED THEN INSERT { DEFAULT VALUES | [ ( column_name [, ...] ) ] VALUES ( { expression | DEFAULT } [, ...] ) [, ...] [ WHERE condition ] } ];
  • 参数说明 INTO子句 指定正在更新或插入的目标表。 table_name 目标表的表名。 alias 目标表的别名。 取值范围:字符串,符合标识符命名规范。 USING子句 指定源表,源表可以为表、视图或子查询。 ON子句 关联条件,用于指定目标表和源表的关联条件。不支持更新关联条件中的字段。ON关联条件可以是ctid, xc_node_id, tableoid这三个系统列。 WHEN MATCHED子句 当源表和目标表中数据针对关联条件可以匹配上时,选择WHEN MATCHED子句进行UPDATE操作。 不支持更新分布列、系统表以及系统列。 WHEN NOT MATCHED子句 当源表和目标表中数据针对关联条件无法匹配时,选择WHEN NOT MATCHED子句进行INSERT操作。 不支持INSERT子句中包含多个VALUES。 WHEN MATCHED和WHEN NOT MATCHED子句顺序可以交换,可以缺省其中一个,但不能同时缺省。 不支持同时指定两个WHEN MATCHED或WHEN NOT MATCHED子句。
  • 示例 创建进行MERGE INTO的目标: 1 2 CREATE TABLE target(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO target VALUES(1, 1),(2, 2); 创建数据源表: 1 2 CREATE TABLE source(a int, b int)WITH(ORIENTATION = COLUMN, ENABLE_HSTORE = ON); INSERT INTO source VALUES(1, 1),(2, 2),(3, 3),(4, 4),(5, 5); 执行MERGE INTO操作: 1 2 3 4 5 6 7 MERGE INTO target t USING source s ON (t.a = s.a) WHEN MATCHED THEN UPDATE SET t.b = t.b + 1 WHEN NOT MATCHED THEN INSERT VALUES (s.a, s.b) WHERE s.b % 2 = 0;
  • 参数说明 IF NOT EXISTS 指定IF NOT EXISTS时,若不存在同名表,则可以成功创建表。若已存在同名表,创建时不会报错,仅会提示该表已存在并跳过创建。 table_name 要创建的表名。 表名长度不超过63个字符,以字母或下划线开头,可包含字母、数字、下划线、$、#。 column_name 新表中要创建的字段名。 字段名长度不超过63个字符,以字母或下划线开头,可包含字母、数字、下划线、$、#。 data_type 字段的数据类型。 LIKE source_table [ like_option ... ] LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型。 新表与原表之间在创建动作完毕之后是完全无关的。在原表做的任何修改都不会传播到新表中,并且也不可能在扫描原表的时候包含新表的数据。 被复制的列并不使用相同的名字进行融合。如果明确的指定了相同的名字或者在另外一个LIKE子句中,将会报错。 HStore表只能从HStore表中进行继承。 WITH ( { storage_parameter = value } [, ... ] ) 这个子句为表指定一个可选的存储参数。 ORIENTATION 指定表数据的存储方式,即时序方式、行存方式、列存方式,该参数设置成功后就不再支持修改。对于HStore表,应当使用列存方式,同时设置enable_hstore为on。 取值范围: TIMESERIES,表示表的数据将以时序方式存储。 COLUMN,表示表的数据将以列存方式存储。 ROW,表示表的数据将以行方式存储。 默认值:ROW。 COMPRESSION 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。 取值范围: HStore表和列存表的有效值为YES/NO和/LOW/MIDDLE/HIGH,默认值为LOW。 行存表的有效值为YES/NO,默认值为NO。 COMPRESSLEVEL 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。该参数只对时序表和列存表有效。 取值范围:0~3 默认值:0 MAX_BATCHROW 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对时序表和列存表有效。 取值范围:10000~60000 默认值60000 PARTIAL_CLUSTER_ROWS 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对时序表和列存表有效。 取值范围:600000~2147483647 enable_delta 指定了在列存表是否开启delta表。对HStore表不能开启该参数。 默认值:off enable_hstore 指定了是否创建为HStore表(基于列存表实现)。该参数只对列存表有效。该参数仅8.2.0.100及以上集群版本支持。 默认值:off 打开该参数时必须设置以下GUC参数用于保证HStore表的清理,推荐值如下: autovacuum=true,autovacuum_max_workers=6,autovacuum_max_workers_hstore=3。 enable_disaster_cstore 指定了列存表是否开启细粒度容灾功能。该参数仅适用于COLVERSION为2.0的列存表,并且不能和enable_hstore同时打开。该参数仅8.2.0.100及以上集群版本支持。 默认值:off 设置该参数为on前需要先设置GUC参数enable_metadata_tracking=on,否则可能开启细粒度容灾功能失败。 SUB_PARTITION_COUNT 指定二级分区的个数。该参数用于设置在导入阶段二级分区个数。在建表时进行设置,建表后不支持修改。不建议用户随意设置该默认值,可能会影响导入和查询的性能。 取值范围:1~1024 默认值:32 DELTAROW_THRESHOLD 指定HStore表导入时小于多少行(SUB_PARTITION_COUNT * DELTAROW_THRESHOLD)的数据进入delta表。 取值范围:0~60000 默认值为60000 COLVERSION 指定存储格式的版本。 HStore表只支持2.0版本,enable_hstore_opt表支持2.0和3.0版本。 取值范围: 1.0:列存表的每列以一个单独的文件进行存储,文件名以relfilenode.C1.0、relfilenode.C2.0、relfilenode.C3.0等命名。 2.0:列存表的每列合并存储在一个文件中,文件名以relfilenode.C1.0命名。 默认值:2.0 DISTRIBUTE BY 指定表如何在节点之间分布或者复制。 取值范围: HASH (column_name ) :对指定的列进行Hash,通过映射,把数据分布到指定DN。 TO { GROUP groupname | NODE ( nodename [, ... ] ) } TO GROUP指定创建表所在的Node Group,目前不支持hdfs表使用。TO NODE主要供内部扩容工具使用,一般用户不应该使用。 PARTITION BY 指定HStore表的初始分区。 secondary_part_column 指定列存表二级分区列的列名,仅能指定一列作为二级分区列且只适用于HStore列存表。该参数仅8.3.0及以上集群版本支持,其中v3表不支持该参数,会走hashbucket剪枝。 被指定为二级分区的列不能被删除或者修改。 只能在建表时指定二级分区列,建表后不支持修改。 不建议指定分布列作为二级分区列。 指定二级分区列后,该表将会在DN上按照二级分区列进行逻辑上的HASH分区存储,从而有效提升该列等值查询的性能。 secondary_part_num 指定列存表二级分区的数量,仅适用于HStore列存表。该参数仅8.3.0及以上集群版本支持,v3表不支持该参数,会走hashbucket剪枝。 取值范围:1~32 默认值:8 只有secondary_part_column被指定时,该参数才可以指定。 只能在建表时指定二级分区的数量,建表后不支持修改。 不建议用户随意设置该默认值,否则会影响导入和查询的性能。
  • 示例 创建简单的HStore表: CREATE TABLE warehouse_t1 ( W_WAREHOUSE_SK INTEGER NOT NULL, W_WAREHOUSE_ID CHAR(16) NOT NULL, W_WAREHOUSE_NAME VARCHAR(20) , W_WAREHOUSE_SQ_FT INTEGER , W_STREET_NUMBER CHAR(10) , W_STREET_NAME VARCHAR(60) , W_STREET_TYPE CHAR(15) , W_SUITE_NUMBER CHAR(10) , W_CITY VARCHAR(60) , W_COUNTY VARCHAR(30) , W_STATE CHAR(2) , W_ZIP CHAR(10) , W_COUNTRY VARCHAR(20) , W_GMT_OFFSET DECIMAL(5,2) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); CREATE TABLE warehouse_t2 (LIKE warehouse_t1 INCLUDING ALL);
  • 列存表的Delta表差异 表1 HStore表与列存表的辅助Delta表差异 数仓类型 列存的delta表 HStore的delta表 HStore Opt的delta表 表结构 与列存主表的表定义一致。 与主表定义不一致。 不同于主表,与HStore表相同。 功能 用于暂存小批量insert的数据,满阈值后再merge到主表,避免直接insert到主表产生大量小CU。 用于持久化存储update/delete/insert信息。在产生故障后用于恢复内存更新链等管理并发更新的内存结构。 用于持久化存储update/delete/insert信息。在产生故障后用于恢复内存更新链等管理并发更新的内存结构。相比HStore进一步优化。 缺陷 来不及merge导致delta表膨胀,影响查询性能,同时无法解决并发update的锁冲突问题 依赖后台常驻autovacuum来做merge操作。 依赖后台常驻autovacuum来做merge操作。 入库建议 综合入库、查询和空间情况,建议选择hstore_opt表,微批copy无更新入库场景性能要求高的情况下选择hstore表。 HStore/HStore Opt共同点: update入库性能差,建议修改为upsert。 delete入库,确定计划走索引扫描即可,用JDBC batch方式入库最佳。 merge into入库建议在单次入库数据量超过100W/dn,且无并发数据保证无重复的情况下使用。 尽量避免设置 default_orientation,因为存在较高风险。 尽量避免对冷分区的数据进行修改和新增。 HStore的upsert入库建议: 选择流程: 第1步:部分列upsert选择方式二,全列upsert(遇到冲突update所有列到新值且没有表达式)进入第2步判断。 第2步:数据入库是否会并发更新到同一个key,没有冲突时选择方式一,有冲突时进入第3步判断。 第3步:入库的数据可能遇到重复数据,选择方式二,否则进入第4步判断。 第4步:入库的方式是copy攒批临时表时,选择方式三,否则(包括jdbc的batch入库,简单的单行入库)选择方式二。 配置方式选项解释: 方式一:enable_hstore_nonconflict_upsert_optimization开启+enable_hstore_partial_upsert_optimization关闭。 方式二:enable_hstore_nonconflict_upsert_optimization关闭+enable_hstore_partial_upsert_optimization开启。 方式三:enable_hstore_nonconflict_upsert_optimization关闭+enable_hstore_partial_upsert_optimization关闭。 附加说明:攒批小于2000使用batch模式入库,大于2000使用copy临时表模式入库。 HStore Opt的upsert入库建议: 无并发冲突下开启enable_hstore_nonconflict_upsert_optimization参数,其他场景都关闭即可,会自动选择最优路径。 点查建议 综合点查场景,建议使用HStore Opt表。 HStore/HStore Opt共同点: 在等值过滤条件使用最多且distinct值分布相对均匀的一个列上创建二级分区。 HStore的点查建议: 使用主键之外的索引加速不能得到预期效果,不建议开启。 如果数据类型多为numeric或者16字节以内的字符串,建议使用turbo加速。 HStore Opt的点查建议: 除了二级分区之外的等值过滤列,如果过滤条件涉及的列在查询中基本固定,使用cbtree索引,如果不断变化建议使用GIN索引,注意创建索引的列数不要超过5列。 所有涉及等值过滤的字符串列,都可以建表时指定bitmap索引,不限列数,但后续不可修改。 时间范围过滤的列,指定为分区列。 点查返回数据量超过10W/dn的场景,索引扫描的性能提升有限,建议针对这种情况使用guc参数enable_seqscan对比测试,灵活选择。
  • 注意事项 创建HStore表的用户需要拥有schema cstore的USAGE权限。 表级参数enable_delta与enable_hstore无法同时开启,因为enable_delta用于控制普通列存表的delta开启,会与enable_hstore冲突。 每一个HStore表绑定一张delta表,delta表的oid记录在pg_class中reldeltaidx字段(reldelta字段被列存表的delta表使用)。
  • 语法格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE TABLE [ IF NOT EXISTS ] table_name ({ column_name data_type | LIKE source_table [like_option [...] ] } } [, ... ]) [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] [ DISTRIBUTE BY HASH ( column_name [,...])] [ TO { GROUP groupname | NODE ( nodename [, ... ] ) } ] [ PARTITION BY { {RANGE (partition_key) ( partition_less_than_item [, ... ] )} } [ { ENABLE | DISABLE } ROW MOVEMENT ] ]; 其中like选项like_option为: { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | DISTRIBUTION | ALL }
  • 语法格式 1 2 3 INSERT [/*+ plan_hint */] [ IGNORE | OVERWRITE ] INTO table_name [ AS alias ] [ ( column_name [, ...] ) ] { DEFAULT VALUES | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] | query }
  • 示例 创建表reason_t1: 1 2 3 4 5 6 7 -- 创建表reason_t1。 CREATE TABLE reason_t1 ( TABLE_SK INTEGER , TABLE_ID VARCHAR(20) , TABLE_NA VARCHAR(20) )WITH(ORIENTATION=COLUMN, ENABLE_HSTORE=ON); 向表中插入一条记录: 1 INSERT INTO reason_t1(TABLE_SK, TABLE_ID, TABLE_NA) VALUES (1, 'S01', 'StudentA'); 向表中插入多条记录: 1 2 3 4 5 6 7 8 INSERT INTO reason_t1 VALUES (1, 'S01', 'StudentA'),(2, 'T01', 'TeacherA'),(3, 'T02', 'TeacherB'); SELECT * FROM reason_t1 ORDER BY 1; TABLE_SK | TABLE_ID | TABLE_NAME ----------+----------+------------ 1 | S01 | StudentA 2 | T01 | TeacherA 3 | T02 | TeacherB (3 rows)
  • 注意事项 当单次插入的数据量大于等于表级参数DELTAROW_THRESHOLD时,数据会直接插入主表生成CU(Compress Unit)。 当插入的数据量小于表级参数DELTAROW_THRESHOLD时,会在辅助Delta表上插入一条类型为I的记录,同时将数据序列化存储到这条记录的values字段。 插入到Delta表的数据跟主表使用全局统一分配的cuid。 插入到delta表的数据依赖autovacuum 来merge到主表CU。
共100000条