云服务器内容精选

  • max_connections 参数说明:允许和数据库连接的最大并发连接数。此参数会影响集群的并发能力。 参数类型:POSTMASTER 取值范围:整型。CN最小值为1,最大值为16384;DN最小值为1, 最大值为262143,由于集群内部存在着各种连接,设置时通常达不到最大值,若日志中出现'invalid value for parameter "max_connections"',需要调小DN的max_connections值。 默认值:CN节点为800,DN节点为5000,如果该默认值超过内核支持的最大值(在执行gs_initdb的时候判断),系统会提示错误。 设置建议: CN中此参数建议保持默认值。DN中此参数按照如下公式计算: dop_limit * 20 * 6 + 24,公式中的dop_limit为集群中每个DN对应的CPU数,计算公式为:dop_limit = 单机器的CPU逻辑核数 / 单机器的DN数。 最小值5000。 增大这个参数可能导致 GaussDB (DWS)要求更多的SystemV共享内存或者信号量,可能超过操作系统缺省配置的最大值。这种情况下,请酌情对数值加以调整。 max_connections取值的设置受max_prepared_transactions的影响,在设置max_connections之前,应确保max_prepared_transactions的值大于或等于max_connections的值,这样可确保每个会话都有一个等待中的预备事务。
  • connection_info 参数说明:连接数据库的驱动类型、驱动版本号、当前驱动的部署路径和进程属主用户。(运维类参数,不建议用户设置) 参数类型:USERSET 取值范围:字符串 默认值:空字符串 空字符串,表示当前连接数据库的驱动不支持自动设置connection_info参数或应用程序未设置。 驱动连接数据库的时候自行拼接的connection_info参数格式如下: 1 {"driver_name":"ODBC","driver_version": "(GaussDB 8.1.3 build 39137c2d) compiled at 2022-04-01 15:43:11 commit 3629 last mr 5138 debug","driver_path":"/usr/local/lib/psqlodbcw.so","os_user":"dbadmin"} ODBC,JDBC,gsql连接默认显示driver_name和driver_version,driver_path,os_user,其他接口连接默认显示driver_name和driver_version,driver_path和os_user的显示由用户控制。
  • GaussDB(DWS)总体开发设计军规 为有效降低资源消耗、减少业务阻塞、提升数据开发效率,在使用GaussDB(DWS)进行数据开发之前,开发设计应遵循表1列举的开发设计军规。 该军规中所陈述的“必须”和“建议”含义如下: 必须:用户应当遵守的设计军规。遵守这些规则,能够保证业务的高效运行;违反这些规则,将导致业务性能的大幅下降或某些业务逻辑错误。 建议:建议用户遵守的设计军规。如果不遵守,可能会影响业务性能。 本开发设计军规从用户和连接管理、对象设计、操作规范、运维管理4个维度展开。其中,对象设计除了下表列举的总体军规外,其他数据库对象设计、JDBC配置、SQL编写的详细规则参见后续章节。 表1 总体开发设计军规 场景 序号 军规 级别 不遵守军规带来的影响 用户和连接管理 1 禁止所有业务使用同一个数据库用户运行,按业务模块规划不同数据库用户。 必须 异常业务或用户操作导致整体集群问题时,无法快速隔离和管控。 2 禁止使用管理员用户跑业务,不同模块业务请通过多用户和权限进行访问控制。 必须 管理员用户权限过高,难以管控。 3 禁止业务直连单CN,需配置负载均衡保证各CN连接均衡。 必须 CN上连接不均、负载倾斜,拖慢整体性能。 4 连接数据库完成所需操作后,要及时关闭数据库连接,避免空闲连接持续占位,消耗连接和公共资源。 必须 空闲连接过多,消耗大量公共资源,正常业务无法建立连接和运行。 5 使用数据库连接池的场景,在业务中通过SET语句进行数据库GUC参数设置后,归还连接池前必须通过RESET还原参数设置。 必须 使用连接池的作业之间互相干扰。 对象设计 6 禁止创建普通表时指定自定义TABLESPACE。 必须 自定义表空间所占存储空间不受管控,会导致空间和性能类问题。 7 禁止创建行存表时指定COMPRESS压缩属性。 必须 行存压缩功能不稳定,后续已废弃。 8 禁止针对普通列存表进行频繁小批量实时入库。 必须 列存实时入库导致小CU膨胀严重,触发持续的空间、资源、性能类问题。 9 创建HASH分布的表对象时,要确保数据分布均匀(10G以上数据量的表,倾斜率控制在10%以内)。 必须 数据分布倾斜,进而导致计算倾斜,导致空间和性能类问题。 10 创建REPLICATION分布的表对象,要确保表数据量控制在100万行以内。 建议 复制表数据量过大会导致存储空间增长风险。 11 创建HSTORE表时,必须确保数据库GUC参数设置满足以下条件: autovacuum设置为on。 autovacuum_max_workers_hstore取值大于0。 autovacuum_max_workers取值大于autovacuum_max_workers_hstore的取值。 必须 HSTORE的delta表急剧膨胀,性能持续下降。 12 针对存在时间字段的大表(数据量5000万行以上),必须设计成分区表,根据查询特征合理设计分区间隔。 必须 针对分区表进行特定时间段的查询、清理效率远高于非分区表。 13 针对有大批量数据增删改的表,索引个数建议控制在3个以内,最多不超过5个。 必须 索引过多影响增删改效率。 操作规范 14 客户端显式开启事务或手动关闭Autocommit场景,业务最后必须手动执行Commit提交事务。 必须 事务不提交导致长事务,阻塞其他持锁业务和回收操作。 15 针对执行时长超过30分钟的语句,建议优化。 建议 业务效率及性能问题。 16 禁止出现执行时长超过2小时的业务,避免长事务、长持锁等影响。 必须 业务性能,长事务阻塞其他持锁业务和回收操作。 17 禁止随意执行DROP对象操作(如DATABASE、USER/ROLE、SCHEMA、TABLE、VIEW等对象),含带CASCADE级联删除场景,需考虑数据备份。 必须 数据被异常删除,无法快速恢复。 18 避免在业务高峰期执行ALTER(增删改列、DROP PARTITION等)、TRUNCATE操作,避免有长SQL阻塞ALTER、TRUNCATE操作或SQL业务被ALTER、TRUNCATE阻塞。 必须 ALTER、TRUNCATE持锁级别高,会阻塞其他也并发业务,也会被其他业务阻塞,造成业务卡问题。 19 避免在业务高峰期执行对大表执行CREATE INDEX和REINDEX操作。 必须 CREATE INDEX、REINDEX操作会阻塞数据入库,大表上执行耗时较长会长时间阻塞数据入库。 20 禁止出现计划不下推的SQL写法(EXPLAIN输出的执行计划中出现"_REMOTE_XXX_QUERY_")。 必须 业务性能问题、CN瓶颈。 21 尽量避免行存大表(数据量1000万行以上)的频繁COUNT查询。 建议 业务性能问题、高IO资源消耗。 22 单SQL的UNION/UNION All分支不能超过50,多表关联不能超过25张非复制表。 必须 业务性能问题、高资源消耗。 23 禁止大表关联时缺少关联条件而求笛卡尔积。 必须 业务性能问题、高资源消耗。 24 多表关联查询时,单个语句Stream建议控制在100以内。 建议 业务性能问题、高CPU消耗。 25 谨慎使用递归语句(WITH RECURSIVE),需明确数据重复度和终止条件,确保递归可按预期结束。 必须 业务性能问题、死循环。 26 避免使用UPDATE/DELETE大批量刷新和删除数据,考虑使用TRUNCATE PARTITION/DROP PARTITION代替。 建议 业务性能、脏页问题。 27 避免UPDATE/UPSERT并发更新同一张列存表。 必须 业务性能、锁问题。 28 尽量避免使用存储过程,尤其不要开发结构复杂、嵌套多层的存储过程。 建议 维护效率低、问题定位成本高。 运维管理 29 默认开启Autovacuum/Autoanalyze自动运维开关(8.1.3及以上版本支持)。 必须 对象膨胀、业务性能问题。 30 单次新增、修改量占表总量10%以上场景,需在业务中增加显式Analyze操作。 必须 业务性能稳定性问题。 31 定期对脏页率、小CU占比超过25%的表执行VACUUM FULL,普通表需在低峰期执行,系统表需离线执行。 必须 对象膨胀、业务性能问题。 32 数据库重要程度以上告警,需及时处理并消除告警。 必须 集群长期稳定性。 33 业务批量上线、上量前需在测试集群进行相当规模测试验证,并知会技术支持人员进行业务保障。 必须 业务上线评估、保障。 父主题: GaussDB(DWS)开发设计规范
  • 其他算子 其他算子包括Stream算子,以及RemoteQuery等算子。Stream算子主要有三种类型:Gather stream、Broadcast stream及Redistribute stream。 Gather算子:每个源节点都将其数据发送给目标节点进行汇聚。 Broadcast stream:由一个源节点将其数据发给N个目标节点进行运算。 Redistrubute stream:每个源节点将其数据根据连接条件计算Hash值,根据重新计算的Hash值进行分布,发给对应的目标节点。 表5 其他算子 算子 含义 场景 Stream 多节点数据交换 执行分布式查询计划,节点间存在数据交换。 Partition Iterator 分区迭代器 分区表扫描,迭代扫描每个分区。 RowToVec 行转列 行列混合场景。 DfsScan / DfsIndexScan HDFS表(索引)扫描 HDFS表扫描。
  • 控制算子 控制算子是一类用于处理特殊情况的节点,用于实现特殊的执行流程。 表4 控制算子 算子 含义 场景 Result 直接进行计算 1. 不包含表扫描。 2. INSERT语句中只有一个VALUES子句。 3. 当 Append/MergeAppend为计划根节点(投影上推)。 ModifyTable INSERT/UPDATE/DELETE上层节点 INSERT/UPDATE/DELETE Append 追加 1. UNION(ALL)。 2. 继承表。 MergeAppend 追加(输入有序) 1. UNION(ALL)。 2. 继承表。 RecursiveUnion 处理WITH子句中递归定义的UNION子查询 WITH RECURSIVE … SELECT … 语句。 BitmapAnd Bitmap逻辑与操作 多维索引扫描的BitmapScan。 BitmapOr Bitmap逻辑或操作 多维索引扫描的BitmapScan。 Limit 处理LIMIT子句 OFFSET … LIMIT …
  • 物化算子 物化算子是一类可缓存元组的节点。在执行过程中,很多扩展的物理操作符需要首先获取所有的元组才能进行操作(例如聚集函数操作、没有索引辅助的排序等),这是要用物化算子将元组缓存起来; 表3 物化算子 算子 含义 场景 Material 物化 缓存子节点结果。 Sort 排序 ORDER BY子句,连接操作,分组操作,集合操作,配合Unique。 Group 分组操作 GROUP BY子句。 Agg 执行聚集函数 COUNT/SUM/AVG/MAX/MIN等聚集函数。 DISTINCT子句。 UNION去重。 GROUP BY子句。 WindowAgg 窗口函数 WINDOW子句。 Unique 去重(下层已排序) DISTINCT子句。 UNION去重。 Hash HashJoin辅助节点 构造hash表,配合HashJoin。 SetOp 处理集合操作 INTERSECT/INTERSECT ALL,EXCEPT/EXCEPT ALL LockRows 处理行级锁 SELECT … FOR SHARE/UPDATE
  • 连接算子 连接算子对应了关系代数中的连接操作,以表 t1 join t2 为例,主要的集中连接类型如下:inner join、left join、right join、full join、semi join、 anti join,其实现方式包括Nestloop、HashJoin及MergeJoin。 表2 连接算子 算子 含义 场景 实现特点 NestLoop 嵌套循环连接,暴力连接,对每一行都扫描内表。 Inner Join, Left Outer Join, Semi Join, Anti Join 适用于被连接的数据子集较小的查询。在嵌套循环中,外表驱动内表,外表返回的每一行都要在内表中检索找到它匹配的行,因此整个查询返回的结果集不能太大(不能大于10000),要把返回子集较小的表作为外表,而且在内表的连接字段上建议要有索引。 MergeJoin 归并连接(输入有序),内外表排序,定位首尾两端,一次性连接元组。等值连接。 Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join 也称作“融合连接”,是先将关联表的关联列各自做排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。 因为Merge join需要做更多的排序,所以消耗的资源更多,因此通常情况下执行性能差于Hash Join。 如果源数据已经被排序过,在执行融合连接时,并不需要再排序,此时Merge Join的性能优于Hash Join。 (Sonic) HashJoin 哈希连接,内外表使用join列的hash值建立hash表,相同值的必在同一个hash桶。等值连接连接两端必须为类型相同的等值连接,且支持hash散列。 Inner Join, Left Outer Join, Right Outer Join, Full Outer Join, Semi Join, Anti Join 哈希连接,适用于数据量大的表的连接方式。优化器使用两个表中较小的表,利用连接键在内存中建立hash表,然后扫描较大的表并探测散列,找到与散列匹配的行。Sonic和非Sonic的Hash Join的区别在于所使用hash表结构不同,不影响执行的结果集。
  • 扫描算子 扫描算子用来扫描表中的数据,每次获取一条元组作为上层节点的输入, 存在于查询计划树的叶子节点,它不仅可以扫描表,还可以扫描函数的结果集、链表结构、子查询结果集。常见的扫描算子如下表所示: 表1 扫描算子 算子 含义 场景 SeqScan 顺序扫描 最基本的扫描算子,用于扫描物理表(没有索引辅助的顺序扫描)。 IndexScan 索引扫描 选择条件涉及的属性上建立了索引。 IndexOnlyScan 直接从索引返回元组 索引列完全覆盖结果集列。 BitmapScan(BitmapIndexScan, BitmapHeapScan) 利用Bitmap获取元组 BitmapIndexScan利用属性上的索引进行扫描,返回结果为一个位图;BitmapHeapScan从BitmapIndexScan输出的位图中获取元组。 TidScan 通过元组tid获取元组 WHERE conditions(like CTID = tid or CTID IN (tid1, tid2, …)) ; UPDATE/DELETE … WHERE CURRENT OF cursor; SubqueryScan 子查询扫描 以另一个查询计划树(子计划)为扫描对象进行元组的扫描。 FunctionScan 函数扫描 FROM function_name ValuesScan 扫描values链表 对VALUES子句给出的元组集合进行扫描。 ForeignScan 外部表扫描 查询外部表。 CteScan CTE表扫描 扫描SELECT查询中用WITH子句定义的子查询。
  • 示例 创建学生信息表student(ID、姓名、性别、学校)。 1 2 3 4 5 6 7 SET current_schema=public; DROP TABLE IF EXISTS student; CREATE table student( sId VARCHAR(10) NOT NULL, sname VARCHAR(10) NOT NULL, sgender VARCHAR(10) NOT NULL, sschool VARCHAR(10) NOT NULL); 给表student插入数据。 1 2 3 4 5 6 7 8 INSERT INTO student VALUES('s01' , 'ZhaoLei' , 'male', 'NENU'); INSERT INTO student VALUES('s02' , 'QianDian' , 'male', 'SJTU'); INSERT INTO student VALUES('s03' , 'SunFenng' , 'male', 'Tongji'); INSERT INTO student VALUES('s04' , 'LIYun' , 'male', 'CCOM'); INSERT INTO student VALUES('s05' , 'ZhouMei' , 'female', 'FuDan'); INSERT INTO student VALUES('s06' , 'WuLan' , 'female', 'WHU'); INSERT INTO student VALUES('s07' , 'ZhengZhu' , 'female', 'NWAFU'); INSERT INTO student VALUES('s08' , 'ZhangShan' , 'female', 'Tongji'); 查看表student。 1 SELECT * FROM student; 回显如下: 创建教师信息表teacher(ID、姓名、性别、学校)。 1 2 3 4 5 6 DROP TABLE IF EXISTS teacher; CREATE table teacher( tid VARCHAR(10) NOT NULL, tname VARCHAR(10) NOT NULL, tgender VARCHAR(10) NOT NULL, tschool VARCHAR(10) NOT NULL); 给表teacher插入数据。 1 2 3 INSERT INTO teacher VALUES('t01' , 'ZhangLei', 'male', 'FuDan'); INSERT INTO teacher VALUES('t02' , 'LiLiang', 'male', 'WHU'); INSERT INTO teacher VALUES('t03' , 'WangGang', 'male', 'Tongji'); 查询表teacher。 1 SELECT * FROM teacher; 使用UNION(合并且去重)获取学生和教师所在学校,并按学校名称首字母升序排序。 1 2 3 4 5 6 7 8 SELECT t.school FROM ( SELECT sschool AS school FROM student UNION SELECT tschool AS school FROM teacher ) t ORDER BY t.school ASC; 回显如下: 使用UNION ALL(合并不去重)获取所有学生和教师所在学校,并按学校名称首字母升序排序。 1 2 3 4 5 6 7 8 SELECT t.school FROM ( SELECT sschool AS school FROM student UNION ALL SELECT tschool AS school FROM teacher ) t ORDER BY t.school ASC; 使用UNION ALL(合并带有WHERE子句SQL结果集)获取来自“Tongji”的学生和教师的所有信息,并按学生和教师的编号升序排序。 1 2 3 4 5 6 7 8 9 10 SELECT t.* FROM ( SELECT Sid AS id,Sname AS name,Sgender AS gender,Sschool AS school FROM student WHERE Sschool='Tongji' UNION ALL SELECT Tid AS id,Tname AS name,Tgender AS gender,Tschool AS school FROM teacher WHERE Tschool='Tongji' ) t ORDER BY t.id ASC;
  • 8.1.3.330 表3 8.1.3.330新增功能/解决问题列表 类别 功能或问题描述 问题原因 问题出现版本 修复建议 新增功能 无 - - - 解决问题 insert into select语句在计划生成阶段core,执行select部分不会core。 ORCLAUSE转换,对两个相同的sublink替换,将其指向同一个OpExpr,再次提升时在OffsetVarNodes中会将varno调整两次,造成后续core。 8.1.3.330以前版本 升级到8.1.3.330及以上。 列存轻量化用例概率触发core: CS torePartitionInsert::findBiggestPartition。 列存分区表统计bulkloadUsedMemSize,将update算子和insert算子混在一起统计,但是在判断是刷盘到disk时,内存自适应的大小是根据每个算子估出来的,导致g_bulkloadUsedMemSize统计常常大于估算值,update算子占用内存到估算内存临界值时,可能造成insert算子一条数据都无法插入。 8.1.3.330以前版本 出现wait ccn排队,但是看资源池的估算内存和占用内存,以及并发数未到排队阈值。 作业在CCN排队时无法进行全局内存校准,阻塞了作业。 8.1.3.330以前版本 用户直接查表没有权限 ,但是嵌套一层查询就可以查到。 light proxy的权限检查是在CN的checkLightQuery中调用权限校验公共函数ExecCheckRTPerms实现的,在DN上不会再进行权限检查。而在调用ExecCheckRTPerms时,其入参rangeTables需要是RTE_RELATION。否则会在ExecCheckRTEPerms中直接返回true。当是嵌套SQL时,类型是RTE_SUBQUERY,绕过了权限检查。 8.1.3.330以前版本 作业运行过程中偶现删除语句报错,报错信息为canceling statement due to statement timeout。 w报文未重新设置事务时间,导致线程复用。 8.1.3.330以前版本 json类型查询内存泄露,导致重分布占用大量内存影响业务。 在jsonb的out函数中存在内存未释放问题,数据量大时出现堆积造成使用内存高。 8.1.3.330以前版本 作业并发执行报错:tuple concurrently updated。 分区和表的oid相同,analyze时使用分区的oid更新了pg_object,实质上是将表的pg_object记录更新。此时有并发的DDL操作,例如alter table同时更新了表的pg_object记录,就会出现并发更新的报错。 8.1.3.330以前版本
  • 8.1.3.325 表4 8.1.3.325新增功能/解决问题列表 类别 功能或问题描述 问题原因 问题出现版本 修复建议 新增功能 新增支持GB18030_2022的字符编码。 支持禁用子查询hint功能。 GDS外表兼容utf8非法字符。 - - - 解决问题 DN节点重启,日志截断,集群出现hang问题。 stream线程报错打印日志时,响应了cancel信号,再次打印日志会引发hang问题。 8.1.3.320 升级到8.1.3.325。 业务表创建偶现报错:relation “xxx” already exists。 业务偶现报错:could not read block xxx in file "xxx"。 OID使用超过42亿之后重新开始分配,在复用过程中引起业务偶现报错。 8.1.3.323及以下版本 DN备机checkpoint无法成功,导致备机xlog日志无法回收,持续堆积。 DN备机在redo checkpoint时,如果看到有不完整的btree分裂就会报告RM 11问题,实际上可能是btree分裂失败或者处于btree分裂过程中。 8.1.3.323及以下版本 列存表执行轻量化update和后台执行autovacuum并发操作时报错:Unsupported to update different rows with the same cuid and col in light update。 在轻量化update中,不支持使用相同的cuid和col更新不同的行。 8.1.3.323及以下版本 某些场景no_merge的hint操作不生效。 不支持禁用子查询hint功能。 8.1.3.323及以下版本 后台执行长时间查询语句时,通过CTRL + C方式结束语句未等语句彻底退出,又通过CTRL + Z方式退出gsql客户端,会导致语句残留。 CN收到CTRL + C的取消信号后,CN线程处于报错长跳转流程中,此时去调用EmitErrorReport,而EmitErrorReport未响应信号。 8.1.3.323及以下版本 使用大宽表与实时表做关联更新时出现内存占用率太高,影响性能。 使用大宽表与实时表做关联更新,更新时update会将无关列加上,导致执行计划做优化器估算时内存占用率太高,影响性能。 8.1.3.323及以下版本 ShareScan计划中,存放CTE的tuplestore和batchstore的内存不能扩展易产生下盘。 ShareScan执行计划结构体中的cteMaxMem未进行copy、read和write处理,导致DN上在CTE的执行计划上未获取到该值,导致创建的保存CTE结果集的tuplestore和batchstore无法进行内存扩展而下盘。 8.1.3.323及以下版本 执行列存轻量化update报错:could not determine data type of parameter。 在执行计划的Remote query中,创建parame参数为其在基表中的位置,且系统列也匹配不上该参数。 8.1.3.323及以下版本
  • 8.1.3.336 表1 8.1.3.336新增功能/解决问题列表 类别 功能或问题描述 问题原因 问题出现版本 修复建议 新增功能 无 - - - 解决问题 外表导入报错value too long for type character varying(512)。 ORC外表类型与文件对应字段类型不一致时(外表类型是varchar(y),文件对应字段类型是string),导入时由于字段超长导致报错。 8.1.1.100 升级到8.1.3.336及以上。
  • 8.1.3.320 表6 8.1.3.320新增功能/解决问题列表 类别 功能或问题描述 问题原因 问题出现版本 修复建议 新增功能 truncate、exchange与select并发: 新增GUC参数ddl_select_concurrent_mode,该特性主要解决数据量较大或复杂查询的场景中,查询语句持续时间过长,阻塞DDL的场景,与Oracle效果一致。 支持场景: 支持truncate和select并发; 支持exchange和select并发。 场景约束: 与高级别的锁冲突(大于1级),不支持并发(比如autoanalyze_mode=normal时,同时select触发了autoanalyze); 与事务块中的锁冲突,不支持并发。 DWS常用连接方式约束: jdbc、odbc、python驱动时,如果程序设置了autocommit = false,不支持该特性; Data Studio下发的所有查询语句,自动起事务,不支持该特性。 - - - 支持控制LIMIT语句是否启用early stop优化: 新增GUC参数enable_limit_stop,控制LIMIT语句是否启用early stop优化。 - - - 解决问题 语句级估算内存超过max_process_memory限制,导致ccn排队。 语句级估算内存超过max_process_memory限制。 8.1.3.310及以下版本 升级到8.1.3.320及以上版本。具体升级策略请参见版本收编策略。 执行merge报错:value xxx is out of range for type integer。 pg_toast_get_baseid()函数中使用int接口处理OID。 8.1.3.310及以下版本 查询20万行数据大表的脏页率视图,内存占用大。 查询数据的时候,查询统计信息的内置函数中创建的链表内每个结点上申请了内存空间用于存放tupStatus,查询结束后,仅释放了链表上结点的内存,结点内申请的内存未释放。 8.1.1.x版本 Vacuum执行超时被查杀后,部分DN出现线程残留,无法响应信号,阻塞其他语句执行。 由于btvacuumscan中未响应信号,导致Vacuum执行超时被查杀后,部分dn出现线程残留,无法响应信号。 8.1.1.x版本 对MySQL兼容库中的分区表、时序表执行analyze百分比采样操作时报错:unsupported feature with temporary/unlogged table for partitioned table。 由于8.1.3版本中为了兼容MySQL中CREATE TABLE LIKE语法,默认继承模式为INCLUDING ALL,且执行analyze百分比采样时,含有自动创建临时复制表命令,导致analyze时出现报错。 8.1.3.310及以下版本 冷热表的select查询语句触发runtime autoanalyze,性能慢。 执行truncate partition,exchange partition,drop partition,alter distribute,alter column type这五种操作后,再执行select该表会触发autoanalyze。 8.1.3.310及以下版本 pg_session_wlmstat中elapsed_time与TOP SQL实际执行的时间不一致。 查询pg_session_wlmstat视图,语句处于RUNNING状态时elapsed_time过大。 8.0.x 给外表执行grant select权限时报错:has no distribute type。 obs dfs server只写外表没有指定默认的分布方式导致报错。 8.1.3.310及以下版本
  • 构造复合值 要把复合值写作文字常量,可以将字段值括在圆括号中,并用逗号分隔。可以在任何字段值加上双引号,如果字段值包含逗号或括号则必须这样做。复合常量的一般格式如下: 1 '( val1 , val2 , ... )' 上文中的'("fuzzy dice",42,1.99)'便属于inventory_item类型的一个合法值。 要让一个字段为NULL,在列表中对应位置上空出即可。如果需要一个字段为空字符串,使用引号即可。例如下列示例,第一个字段是非NULL空字符串,第三个是NULL: 1 '("",42,)' ROW表达式也能被用来构建组合值。例如: 1 2 ROW('fuzzy dice', 42, 1.99) ROW('', 42, NULL)
  • 复合类型的声明 GaussDB(DWS)支持用户使用CREATE TYPE定义复合类型: 1 2 3 4 5 6 7 8 9 10 CREATE TYPE complex AS ( r double precision, i double precision ); CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric ); 定义复合类型之后,可用来创建表或函数: 1 2 3 4 5 6 CREATE TABLE on_hand ( item inventory_item, count integer ); INSERT INTO on_hand VALUES (ROW('fuzzy dice', 42, 1.99), 1000); 1 2 3 4 CREATE FUNCTION price_extension(inventory_item, integer) RETURNS numeric AS 'SELECT $1.price * $2' LANGUAGE SQL; SELECT price_extension(item, 10) FROM on_hand;