• [技术解读] GaussDB SQL基础语法示例-数组表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。欢迎使用GaussDB数据库数组表达式。在本文中,我们将介绍GaussDB数据库中数组表达式的概念、语法和用法。GaussDB是一种高性能、高可扩展的分布式数据库,广泛应用于各种业务场景。数组表达式是GaussDB数据库中的一种强大功能,它允许用户在数据库查询中使用数组操作符和函数来处理数组类型的数据。通过学习本文,您将了解如何使用GaussDB数据库的数组表达式来简化数据处理流程,提高查询效率,从而更好地满足业务需求。二、条件表达式的概念及GaussDB中的常见的数组表达式GaussDB支持SQL语言以及一些扩展功能。在GaussDB中,数组表达式用于处理数组类型的数据。以下是一些常见的数组表达式:1、IN :expression IN (value [, ...])使用IN运算符可以判断一个数组是否包含在一个给定的值列表中。如果数组包含所有在括号中指定的值,则返回true;否则返回false。2、NOT IN :expression NOT IN (value [, ...])使用NOT IN运算符可以判断一个数组是否不包含在一个给定的值列表中。如果数组不包含任何在括号中指定的值,则返回true;否则返回false。3、ANY(array):expression operator ANY (array expression)ANY运算符用于判断一个数组是否满足给定数组中的任何一个条件。其中,operator是比较运算符,如=、<、>等。如果左侧的数组满足右侧数组中的任何一个条件,则返回true;否则返回false。4、SOME (array) :expression operator SOME (array expression)SOME运算符用于判断一个数组是否满足给定数组中的至少一个条件。其中,operator是比较运算符,如=、<、>等。如果左侧的数组满足右侧数组中的至少一个条件,则返回true;否则返回false。 需要注意的是,SOME在GaussDB中的用法与ANY相同,因此上述例子同样适用于SOME。5、ALL (array) :expression operator ALL (array expression)ALL运算符用于判断一个数组是否满足给定数组中的所有条件。其中,operator是比较运算符,如=、<、>等。如果左侧的数组满足右侧数组中的所有条件,则返回true;否则返回false。三、GaussDB中常用的数组表达式(语法 + 示例)1、expression IN (value [, ...])右侧括号中的是一个数组表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果列表中的内容符合左侧表达式的结果,则IN的结果为true。如果没有相符的结果,则IN的结果为false。使用in的时候,忽略为null的,不会查询出为null的数据。如果表达式结果为null,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。示例:基础表:教师表、课程表--在教师表中是否可以匹配到代课的老师SELECT * FROM course WHERE teid IN (SELECT teid FROM teacher );2、expression NOT IN (value [, ...])右侧括号中的是一个表达式列表。左侧表达式的结果与表达式列表的内容进行比较。如果在列表中的内容没有符合左侧表达式结果的内容,则NOT IN的结果为true。如果有符合的内容,则NOT IN的结果为false。如果查询语句返回结果为空,或者表达式列表不符合表达式的条件且右侧表达式列表返回结果至少一处为空,则NOT IN的返回结果为null,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。示例(基础表course、teacher见上文截图):--在教师表中是否可以匹配到代课的老师SELECT * FROM course WHERE teid NOT IN (SELECT teid FROM teacher );3、expression operator ANY/ SOME (array expression)右侧括号中的是一个数组表达式,它必须产生一个数组值。左侧表达式的结果使用操作符对数组表达式的每一行结果都进行计算和比较,比较结果必须是布尔值。如果对比结果至少获取一个真值,则ANY的结果为true。如果对比结果没有真值,则ANY的结果为false。如果结果没有真值,并且数组表达式生成至少一个值为null,则ANY的值为NULL,而不是false。这样的处理方式和SQL返回空值的布尔组合规则是一致的。示例:基础表:部门1、部门2--查找部门1的员工年龄大于部门2的员工SELECT * FROM department1WHERE age > ANY (SELECT age FROM department2);SOME跟ANY 类似:--查找部门1的员工年龄大于部门2的员工SELECT * FROM department1WHERE age > SOME (SELECT age FROM department2);补充说明:> any 大于子查询结果中的某个值< any 小于子查询结果中的某个值>= any 大于或等于子查询结果中的某个值<= any 小于或等于子查询结果中的某个值= any 等于子查询结果中的某个值,相当于IN!= any 不等于子查询结果中的某个值4、expression operator ALL (array expression)右侧括号中的是一个数组表达式,它必须产生一个数组值。左侧表达式的结果使用操作符对数组表达式的每一行结果都进行计算和比较,比较结果必须是布尔值。如果所有的比较结果都为真值(包括数组不含任何元素的情况),则ALL的结果为true。如果存在一个或多个比较结果为假值,则ALL的结果为false。如果数组表达式产生一个NULL数组,则ALL的结果为NULL。如果左边表达式的值为NULL ,则ALL的结果通常也为NULL(某些不严格的比较操作符可能得到不同的结果)。另外,如果右边的数组表达式中包含null元素并且比较结果没有假值,则ALL的结果将是NULL(某些不严格的比较操作符可能得到不同的结果), 而不是真。这样的处理方式和SQL返回空值的布尔组合规则是一致的。示例:(基础表department1、department2见上文截图)SELECT * FROM department1WHERE age > ALL (SELECT age FROM department2);补充说明:> all 大于子查询结果中的所有值< all 小于子查询结果中的所有值>= all 大于或等于子查询结果中的所有值<= all 小于或等于子查询结果中的所有值= all 等于子查询结果中所有值!= all 不等于子查询结果中的任何一个值,相当于NOT IN四、小结通过本文的介绍,相信您已经对GaussDB数据库的数组表达式有了深入的了解。数组表达式是GaussDB数据库中非常实用的功能,它可以帮助您更高效地处理数组类型的数据,简化查询语句,提高查询效率。希望本文对您有所帮助。 ——结束
  • [技术解读] GaussDB SQL基础语法示例-常见的条件表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》为主线进行介绍。二、条件表达式的概念及GaussDB中的常见条件表达式条件表达式是指在数据库中进行SQL语句查询时,根据特定条件筛选出符合要求的数据所使用的表达式。 在GaussDB数据库中,CASE、DECODE、COALESCE、NULLIF、GREATEST和NVL等都是常用的条件表达式。CASE:根据条件进行多分支判断,根据不同的条件返回不同的结果。DECODE:GaussDB数据库提供的函数功能,相当于SQL语言中的IF-THEN-ELSE语句,根据第一个参数和后续参数进行比较,返回符合条件的结果。COALESCE:返回第一个非空的参数值。如果所有参数都为空,那么就会返回NULL。COALESCE不会计算不需要用来判断结果的参数;即在第一个非空参数右边的参数不会被计算。NULLIF:用于比较两个字段的值,如果它们相等,则返回NULL,否则返回第一个字段的值。要求两个表达式数据类型一致。GREATEST:用于返回多个数字值中的最大值。NVL:接受两个参数,如果第一个参数为空,则返回第二个参数的值;如果第一个参数不为空,则返回第一个参数的值。下文将逐一进行介绍。三、GaussDB中常用的条件表达式(语法 + 示例)1、CASE表达式1)语法:CASE WHEN condition1 THEN result1WHEN condition2 THEN result2……ELSE resultEND说明:根据条件进行多分支判断,根据不同的条件返回不同的结果。如果结果为真,CASE表达式的结果就是符合该条件所对应的result。如果结果为假,则以相同方式处理随后的WHEN或ELSE子句。如果各WHEN condition都不为真,表达式的结果就是在ELSE子句执行的result。如果省略了ELSE子句且没有匹配的条件,结果为NULL。2)示例:SELECT name,age,CASEWHEN age < 18 THEN '未成年'WHEN age >= 18 AND age < 60 THEN '成年'ELSE '老年'END AS age_groupFROM company;解析:这段代码主要是从 "company" 表中选择 "name" 和 "age" 数据,并通过“CASE表达式”为每个用户生成一个根据年龄划分的组别('未成年'、'成年' 或 '老年')。另参见,前面的文章《GaussDB SQL基本语法示例-CASE表达式》 。2、DECODE表达式1)语法:DECODE(base_expression,compare1,value1,compare(n),value(n),default)说明:GaussDB数据库提供的函数功能,相当于IF-THEN-ELSE语句,根据第一个参数和后续参数进行比较,返回符合条件的结果。2)示例:SELECT name,salary,DECODE(salary, NULL, '未知', 5000, '初级标准线', 20000, '中级标准线',30000, '高级级标准线', '其他') AS salary_levelFROM company ORDER BY salary ;解析:这段代码的目的是从 "company" 表中选择 "name" 和 "salary" 数据,并通过“DECODE表达式”定义工资级别('未知'、'初级标准线'、'中级标准线'、 '高级标准线'、‘其他’)。3、COALESCE表达式1)语法:COALESCE(value1,value2,…)说明:返回第一个非空的参数值。如果所有参数都为空,那么就会返回NULL。COALESCE不会计算不需要用来判断结果的参数;即在第一个非空参数右边的参数不会被计算。2)示例:SELECT name,COALESCE(address, '未知地址') AS addressFROM company;解析:这个查询将返回每个员工的名字和地址,通过“表达式COALESCE”判断,如果地址未知,它将显示 '未知地址'。4、NULLIF表达式1)语法:NULLIF(value1,value2)说明:用于比较两个字段的值,如果它们相等,则返回NULL,否则返回第一个字段的值。要求两个表达式数据类型一致。2)示例:SELECT NULLIF('abc', 'abc'); -- 返回NULLSELECT NULLIF('abc', '123'); -- 返回'123'5、GREATEST/ LEAST表达式1)语法:GREATEST(value1,value2,…)LEAST(value1,value2,…)说明:GREATEST用于返回多个数字值中的最大值。LEAST,从一个任意数字表达式的列表里选取最小的数值。以上的数字表达式必须都可以转换成一个普通的数据类型。2)示例:SELECT GREATEST(10, 20, 30); -- 返回30SELECT LEAST(10, 20, 30); -- 返回106、NVL表达式1)语法:NVL(value1,value2,…)说明:接受两个参数,如果第一个参数为空,则返回第二个参数的值;如果第一个参数不为空,则返回第一个参数的值,参数类型必须一致。2)示例:SELECT name,salary,NVL(salary,default_salary) AS d_salaryFROM company;解析:这个查询将返回每个员工的名字和薪水,通过“表达式NVL”判断,如果salary为空,则用取默认的default_salary 。四、小结条件表达式是数据库查询中非常有用的工具,今天介绍的CASE、DECODE、COALESCE、NULLIF、GREATEST和NVL等,在GaussDB数据库中是非常常用的,通过使用这些条件表达式,我们可以更加灵活地对数据进行查询和操作,提高程序的效率和可读性。同时,它们也使得数据的处理更为方便和快捷,为数据分析和决策提供了有力的支持。--结束
  • [技术解读] GaussDB关键技术原理:高性能(二)
     GaussDB关键技术原理:高性能(一)从数据库性能优化系统概述对GaussDB的高性能技术进行了解读,本篇将从查询处理综述方面继续分享GaussDB的高性能技术的精彩内容。2 查询处理综述内容概要:本章节介绍查询端到端处理的执行流程,首先让读者对查询在数据库内部如何执行有一个初步的认识,充分理解查询处理各阶段主要瓶颈点以及对应的解决方案,本章以GaussDB为例讲解查询执行的几个主要阶段,并且对相关的模块的重要优化点优化方向予以明确。目的:通过对数据库执行处理过程的理解,能够把数据库性能调优分析的理解更加白盒化,在后续了解优化手段的同时也能够对根本内部实现原理有一个理解,能够让读者更加深入理解数据优化的核心理论实现。2.1 查询处理流程查询在经典数据库实现中需要依次进行以下4个环节,(1)查询解析:对用户输入查询进行编译,把查询从文本方式翻译成执行引擎可以识别的语句。(2)查询优化:对查询的进行基于规则的逻辑优化RBO和基于代价CBO的物理优化(3)查询执行:将查询执行计划高效执行(4)数据读取:实现对数据库的高效读取(5)分布式执行:实现数据库的高效通信(分布式数据库)​对数据库的执行过程来说以上每个环节处理所花销的时间都是对最后查询执行时间的组成,因此每个环节执行效率都对性能会产生影响,决定查询端到端的性能。2.2 查询解析器查询解析是指将用户的SQL文本输入转换为数据库内核能够进行逻辑运算的翻译过程,SQL的解析过程主要分为以下几个阶段:​(1)词法分析Lexical Analysis:将用户输入的SQL语句拆解成单词(Token)序列,并识别出关键字、标识、常量等(2)语法分析Syntax Analysis:分析器对词法分析器解析出来的单词(Token)序列在语法上是否满足SQL语法规则,通常识别出语法错误问题(3)语义分析Semantic Analysis:语义分析是SQL解析过程的一个逻辑阶段,主要任务是在语法正确的基础上进行上下文有关性质的审查,在SQL解析过程中该阶段完成表名、操作符、类型等元素的合法性判断,同时检测语义上的二义性问题以下是例举查询解析的全过程,从用户输入的SQL语句开始,依次经历了词法、语法、语义解析几个阶段:​查询解析阶段影响性能的关键因素:(1)词法、语法分析效率(2)语义分析效率(3)查询的复杂度查询解析阶段优化技术:查询缓存技术,模板查询免解析2.3 查询优化器查询优化阶段主要是SQL执行过程中在优化器SQL Optimizer中执行的部分,优化器作为数据库的大脑是SQL执行路径决策者,从全局视角出发提升查询的性能,降低用户使用数据库调优的门槛。查询优化总体上分为逻辑优化、物理优化。​查询优化从总体上可以分成两类:1、基于规则的逻辑优化(Rule-Base-Optimization),根据等价逻辑的变换让查询的计算复杂度降低,从而达到提升查询性能的作用。​上述例子中,通过等价outer join -> inner join变换,可以避免对内表结果集NULL的处理,减少了处理数据量,进而提升性能。2、基于代价的物理优化(Cost-Base-Optimization),根据数据的分布(统计信息)情况来对查询执行路径进行评估,从可选的路径中选择一个执行代价最小的路径进行执行,例如是否选择索引SeqScan vs. IndexScan、选择哪个索引,两表关联选择什么样的连接顺序,选择怎样的具体算法等。​上述例子中,对数据量的准确评估,确定表关联的顺序,进而提升性能。查询优化阶段的核心点:高效生成执行计划,有效消减处理数据的数据量、缩短执行流程,提升查询性能。查询优化阶段优化技术:查询重写、基于成本预估的路径生成。2.4 查询执行器执行引擎负责查询的执行,在SQL执行栈中起到接受优化器生成的执行计划Plan、并对通过存储引擎提供的数据读写接口,实现对数据进行计算得到查询的结果集。在分布式数据库中,执行引擎的范围还应包括节点间网络数据交换和传输的部分。经典的执行模型:Tuple-At-A-Time模型(Volcano-Model)数据库的执行是把查询的处理步骤抽象成独立的基础算子,然后由执行框架驱动算子迭代的方式执行,每个算子抽象成open()/next()/close()三种操作,上层算子通过嵌套调用下层的next()进行处理数据的返回,同样初始化的过程和结束过程也通过open()/close()嵌套调用,火山模型也是大多数传统数据库实现的执行模型。计划节点typedef struct Operator{ NodeTag ... /* input plan tree(s) */ struct Operator *lefttree; struct Operator *righttree; ...} Plan;计划节点迭代执行/* operator open 初始化操作 */State *exec_init_opr(state){ switch(nodeTag(state)) { ... }}/* operator next 执行操作 */Tuple *exec_process(plan){ switch(nodeTag(plan)) { case Scan: exec_scan(); case Join: exec_join(); // process state->left & righttree{ exec_proc_node(state->lefttree); exec_proc_node(state->righttree);} case Agg: exec_agg(); ... }}/* operator close 结束操作 */void exec_deinit (state){ switch(nodeTag(state)) { ... }}关系数据库本身是对关系集合Relation的运算操作,执行引擎作为运算的控制逻辑主题夜视仪围绕着关系运算来实现的,在传统数据库实现理论中,算子的分类可以分成以下几类:1、扫描类算子(Scan Plan Node)扫描节点负责从底层数据来源抽取数据,数据来源可能是来自文件系统,也可能来自网络(分布式查询)。一般而言扫描节点都位于执行树的叶子节点,作为执行数的数据输入来源,典型代表SeqScan、IndexScan、SubQueryScan关键特征:输入数据、叶子节点、表达式过滤2、控制类算子(Control Plan Node)控制算子一般不映射代数运算符,是为了执行器完成一些特殊的流程引入的算子,例如Limit、RecursiveUnion、Union关键特征:用于控制数据流程3、物化算子(Materialize Plan Node)物化算子一般指算法要求,在做算子逻辑处理的时候,要求把下层的数据进行缓存处理,因为对于下层算子返回的数据量不可提前预知,因此需要在算法上考虑数据无法全部放置到内存的情况,例如Agg、Sort关键特征:需要扫描所有数据之后才返回4、连接算子(Join Plan Node)这类算子是为了应对数据库中最常见的关联操作,根据处理算法和数据输入源的不同分成以下几种关键特征:多个输入传统执行模型的优缺点优点:逻辑清晰,可读性可维护性较好缺点:由于存在大量的function call, instruction cache missing因此运行效率低2.5 分布式执行分布式执行主要为分布式数据库提供一套完备的支撑数据跨节点交换,协同计算的计算框架,能够支撑位于不同地点的许多计算分片机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库,数据的分布式切片方式从大的分类上有3种:(1)Share-Memory共享内存(典型代表SQL Server),多个处理进程共享同一片内存,处理进程之间通过内部通讯机制进行通讯,通常具有很高的效率;但当更多的处理进程被添加到主机上时,内存/CPU资源竞争就成为瓶颈,进程越多瓶颈越厉害(2)Share-Disk共享磁盘(典型代表Oracle RAC),各个处理单元使用自己的私有 CPU和Memory,共享磁盘系统,可通过增加节点来提高并行处理的能力,扩展能力较好,类似于SMP(对称多处理)模式,这种架构需要通过一个狭窄的数据管道将所有I/O信息过滤到昂贵的共享磁盘子系统,当存储器接口达到饱和的时候,增加节点并不能获得更高的性能 。(3)Share-Nothing无共享(典型代表Teradata,GaussDB),各个处理单元都有自己私有的CPU/内存/硬盘等彼此之间相互独立,类似于MPP(大规模并行处理)模式,它是把某个表从物理存储上被水平分割,并分配给多台服务器(或多个实例),每台服务器可以独立工作,各处理单元之间通过协议通信,并行处理和扩展能力更好,只需增加服务器数就可以增加处理能力和容量,缺点是对于数据分库分表的设计存在门槛。分布式执行-数据的分布与分区:GaussDB的分布式部署模式采用shared-nothing方式,每个定义的表逻辑上通过分布列进行分布,通过分布类查询可以做到单DN访问。分布式执行:数据重分布Data-Shuffling分布式数据库中当两表关联的时候,如果有一张表的关联键不是分布键,或者发生聚集操作GroupKey不是分布键,那么就会发生表的广播或者重分布,将数据移动到一个节点上进行关联,否则查询的正确性无法得到保证。数据库工作节点数据迁移的类型主要有Broadcast广播(N:1)和Redistribute重分布(N:M)两种表信息: - T1: distribute By HASH(c1) - T2: distribute By HASH(c2)执行查询: - select * from t1 join t2 on t1.c1 = t2.c1由于T1、T2的分布键不相同,直接在各个datanode上关联T1、T2查询的结果正确性无法保证。方案1:对表T2按照t2.c1的键值进行重分布redistribute操作redis(t2)->t2’, t1 join t2’方案2:对T1进行复制broadcast操作dup(t1)->t1’, t1’join t2方案3:对T2进行复制broadcast操作dup(t2)->t2’, t2’join t1对于两表关联中如果之间的Data-Locality不匹配,则需要先进行data-shuffling方可进行关联操作,data-shuffling的方案根据代价通常是数据移动的成本(数据量大小、数据倾斜)因素由优化器进行判断。2.6 存储引擎数据读取存储引擎主要实现高效存储数据确保数据库ACID(原子性、一致性、隔离性、持久性),正确并发读写、高性能读写等问题,从查询处理的视角通常执行算子Scan层调用存储引擎的数据读取接口进行数据读写,传统的存储引擎在查询处理的位置如下图GaussDB包含多种存储模式,按照存储格式划分可分为行存储格式、列存储格式,其中前者,主要适合在线交易类型业务(OLTP)而后者主要适合数据分析类型业务 (OLAP),此外还包含PAX混合存储格式,目前商用数据库支持的不多,开源的如ORC, Parquet格式,主要也是用于OLAP场景。存储引擎主要核心模块:(1)数据页面缓存池:数据页面读写先从页面缓存里读取和修改,如果缓存里不存在,再从数据文件读取页面。(2)堆表Heap:表数据存储格式和访问接口(3)索引Index:高效查询表数据(4)日志WAL:  修改数据页面,必须先写WAL日志(redo log),  事务提交之前和脏页写盘之前必须保证WAL日志持久化到存储设备。(5)事务并发控制: 正确读写,高性能并发读写。(6)事务提交日志: 事务状态和提交时间戳(7)WAL日志恢复:从检查点日志往后回放WAL日志索引技术索引在数据库中的实现为B树结构,索引的键值按照B树进行排序,能够将索引键值的查找由线性查找优化成B树查找。(1)对于非叶子节点,indexTup指向下一个节点,而对于叶子节点,indexTup指向堆表里的行(2)Special space中,实现了两个指针,用于指向左右兄弟节点。(3)索引元组有序,第一个叶子节点中indexTup3实际为最大健值索引元组,即high key,第二个叶子节点中IndexTup1跟indexTup3指向相同的堆表中的行。High key是为了减少比较次数。数据页面缓冲区数据页面缓冲池设计主要是为了减少磁盘的读写。读页面尽可能多的命中内存buffer page,减少磁盘读取页面, 写操作批量刷盘,  而不是每修改一条数据,就写数据页面。(1)为了提高缓存命中率,设计缓存淘汰算法来保证频繁访问的热页面尽量在内存buffer里(2)设计多个buffer pool用于缓存不同的对象,一方面为了减少冲突,同时也提高了缓存命中率(3)对于批量导入和批量读取的场景, 为避免污染整个buffer pool,  顺序读取一遍表数据,把整个buffer pool里页面都淘汰。设计buffer 批量读写获取策略,采用buffer ring的策略,固定范围的获取free buffer。以上内容为查询处理综述的相关内容,下篇将分享高性能关键技术的精彩内容,敬请期待!
  • [问题求助] GaussDB随着表中的数据越来越多,是否也要做手动分库分表?不分的话是否会影响性能
    GaussDB随着表中的数据越来越多,是否也要做手动分库分表?不分的话是否会影响性能
  • [问题求助] GaussDB单表最多能存储多少数据
    GaussDB单表最多能存储多少数据
  • [问题求助] 视图的DDL有什么方法能恢复原样
    创建了一个视图后,在data studio里面查看这个视图的DDL,代码如下CREATE OR REPLACE VIEW riskdata.XXXX AS SELECT a.news_id, a.news_source_id, a.title AS news_title, a.url AS news_link, b.news_source, COALESCE(b.news_text_nohtml, b.news_text) AS news_text, b.publish_time, a.publish_type, a.ori_publish_type, a.publish_institution, a.ori_pub_inst, f_news_penalty_zj_pubinst_XXX(a.ori_pub_inst) AS area, f_news_penalty_zj_pubinst_XXX(a.publish_institution, a.ori_pub_inst) AS org_type FROM (t_news_penalty a LEFT JOIN t_news_info b ON (((a.news_id)::text = (b.news_id)::text))) WHERE ((EXISTS (SELECT 1 AS "?column?" FROM t_news_penalty_object b WHERE (((a.news_id)::text = (b.news_id)::text) AND ((b.object_type)::text = ANY ((ARRAY['02'::character varying, '03'::character varying])::text[]))))) AND ((a.data_source)::text = 'NLPPLATFORM.PENALTY'::text));主要的问题是注释没有了;可读性很差,非常不好维护
  • [技术解读] GaussDB SQL基础语法示例-BOOLEAN表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持的SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》为主线进行介绍。二、GaussDB SQL 中的BOOLEAN表达式介绍1、概念在GaussDB数据库中,BOOLEAN表达式是一种很常见的表达式类型,它用于比较两个条件,来确定其是否为真或假。BOOLEAN表达式可以用于条件判断或在循环语句中作为终止条件。其语法非常简单,只需要使用逻辑运算符对两个条件进行比较。GaussDB SQL支持AND、OR等逻辑运算符,这些运算符可以将结果组合成更复杂的布尔表达式。2、组成运算符:比较运算符(如=、<>、<、>、<=、>=)和逻辑运算符(如AND、OR、NOT等)。操作数:用于比较的字段值或常量。3、语法示例如下截图是游标使用中的SQL部分,SQL中涉及到BOOLEA表达式用于条件判断和循环语句部分,可参考:1)条件判断,见红色方框“v_salary>=20000”,在这个例子中,当v_salary >= 20000 时,则执行THEN 后面的 UPDATE语句。2)循环语句,见蓝色方框“%NOTFOUND”,是游标的属性之一,用于控制程序流程或者了解程序的状态。当最近的DML(数据操作语言)操作(如INSERT,UPDATE,DELETE等)没有影响任何行时,该属性为真。'EXIT WHEN c1%NOTFOUND;' 就会执行。三、在GaussDB SQL中的基础应用使用布尔表达式可以根据特定条件对结果进行过滤,只返回满足条件的数据。以下是一些在SELECT列表中使用布尔表达式的示例。1、示例1,使用比较运算符--根据工资是否大于2w判断其是否为高工资,返回TRUE或FALSESELECT *,(salary > 20000) AS high_salaryFROM company;上述SQL示例中,我们从company表中选择name、age、address、salary和一个布尔表达式(salary > 20000),该表达式用于判断员工的工资是否高收入。 结果集中的high_salary列将显示布尔值TRUE或FALSE。2、示例2,使用逻辑运算符--根据年龄是否在18-60之间,判断其是否为有效年龄,返回TRUE或FALSESELECT *,(age >= 18 AND age <= 60) AS valid_ageFROM company;上述SQL示例中,我们从company表中选择name、age、address、salary和一个布尔表达式(age >= 18 AND age <= 60),该表达式用于判断员工的年龄是否有效。 结果集中的valid_age列将显示布尔值TRUE或FALSE。3、示例3,使用IS NOT NULL运算符--判断地址是否为空,返回TRUE或FALSESELECT *,(address IS NOT NULL) AS null_addressFROM company;上述SQL示例中,我们从company表中选择name、age、address、salary和一个布尔表达式(address IS NOT NULL),该表达式用于判断员工的地址是否为空值。 结果集中的null_address列将显示布尔值TRUE或FALSE。4、示例4,使用like模式匹配操作符LIKE:判断字符串是否能匹配上LIKE后的模式字符串。如果字符串与提供的模式匹配,则LIKE表达式返回为真(NOT LIKE表达式返回假),否则返回为假(NOT LIKE表达式返回真)。--判断地址是否是CN,返回TRUE或FALSESELECT *,(address LIKE 'CN%') AS c_addressFROM company;上述SQL示例中,我们从company表中选择name、age、address、salary和一个布尔表达式(address LIKE 'CN%'),该表达式用于判断员工的地址是否在CN。 结果集中的c_address列将显示布尔值TRUE或FALSE。附:在GaussDB SQL中还有一个模式匹配操作符SIMILAR TO。描述:SIMILAR TO操作符根据自己的模式是否匹配给定串而返回真或者假。他和LIKE非常类似,只不过他使用SQL标准定义的正则表达式理解模式。四、小结BOOLEAN表达式在SQL中非常常用,它们允许开发人员构建逻辑语句,这些语句能够对表中的数据进行复杂的过滤和选择。通过使用布尔表达式,查询结果可以缩小到满足特定条件的行,或者可以根据这些条件对数据进行聚合和分组。总之,布尔表达式可以帮助我们进行逻辑判断和循环控制,提高代码的可读性。 熟练掌握BOOLEAN表达式的使用,在GaussDB SQL等开发过程中非常重要。——结束
  • [技术解读] GaussDB关键技术原理:高性能(一)
    引言对数据库性能进行优化是令人激动的,无论是对其进行性能需求分析、性能需求设计、性能问题定个位都是富于变化又充满挑战的工作,本章围绕“数据库性能”进行全面系统化的介绍,首先从数据库在现代软件栈中所处的位置出发,介绍数据库系统性能、涉及的人员、所做的事情、分析的视角以及面临的挑战;其次,以GaussDB样板对数据库查询处理的主要流程进行详细介绍,帮助大家理解数据库内部的处理流程,各个模块对整体性能的主要问题,以及相应模块在性能优化方面使用到的主要的技术和手段;最后,详细介绍数据库性能相关的关键技术与模块,本章内容大体分为:1)性能优化系统概述2)性能视角理解GaussDB查询处理流程3)数据库高性能关键技术4)高斯数据库性能优化总结1 数据库性能优化系统概述内容概要:本章不独立于数据库本身,把数据库看成是整个系统软件栈的基础软件层部分,对性能、资源、时延等本质内容进行原理上的说明,把数据库性能优化抽象成为对一般基础软件的研究。目的:从计算机体系结构的角度对性能分析做理论上的铺垫,能够让读者后续对数据库性能优化的理解深入本质如系统资源、CPU、内存、IO等,能够让读者更加客观、具体的理解数据库性能问题。1.1 数据库的软件栈视角在深入数据库性能这个领域之前,我们需要明白数据库作为系统软件,如何把数据库的处理性能、吞吐量发挥到极致,其本质上是对整个计算机体系结构的研究,包含了所有的硬件组件和整个软件栈,同时随着近年新硬件、新技术的出现数据库的优化不断的下沉到OS、网络协议栈、硬件层,可以说包括几乎所有的硬件组件和整个软件栈。凡是处于处理路径的环节都可以对数据库的性能产生影响。从上图中可以看到,数据库这一原本软件层的概念,从性能优化的视角他是全栈的,上层涉及到应用程序、客户端,下层涉及到硬件、网络协议等,确保各个组件模块之间在时序节奏上匹配是性能优化的是一个核心问题,也是性能优化的难点之一,因此理解数据库性能优化需要具备多个维度的基础知识以及系统性的思考问题方式。备注:本章不独立于数据库本身,把数据库看成是整个系统软件栈的基础软件层部分,对性能、资源、时延等本质内容进行原理上的说明,把数据库性能优化抽象成为对一般基础软件的研究,从计算机体系结构的角度对性能分析做理论上的铺垫,能够让读者后续对数据库性能优化的理解深入本质如系统资源、CPU、内存、IO等,能够让读者更加客观、具体的理解数据库性能问题。1.2 系统性工程视角理解性能优化数据库的性能优化是个系统性工程,它包含从对象建模、部署模型设计、业务流程设计、局部处理优化等多个环节,从软件工程的角度来看,对数据库优化有以下3个关键要素需要明确关键点1:性能设计需要合理分工,优化系统性能是一项需要多类人员参与合作完成的事务,其中包括:(1)系统设计师:负责系统的整体设计,包括系统级架构设计分析,为容量规划(capacity planning)、性能规划(performance planning)定义明确的指标,以及对各个子模块的指标分解(2)应用开发人员:负责具体某一个模块的开发,确保在软件模块在局部的性能指标达成(3)数据库性能专家:参与系统的整体设计,从数据库容量、性能诉求的角度出发给出数据面的优选部署方案、以及对象模型在库内的实现(索引、数据类型等),同时对模块与数据库的交互进行细节优化达成优化目标关键点2:性能设计需要流程规范化,性能开发过程包含了以下的事情,建议按照顺序执行:(1)设置性能目标、建立性能模型(2)基于已有的硬件条件和数据库本身的能力,给出部署模型建议(3)对开发代码进行性能分析,整理出数据库处理部分的占比、以及优化任务分解(4)对数据库的建表语句、数据类型、索引方面结合具体业务查询进行详细设计(5)系统联调确定当前应用程序与数据库交互效率是否达成性能指标(6)特定问题的性能分析(7)重复5/6确定所有的性能问题都已经解决。因此针对性能设计的建议:性能设计和开发是贯穿整个系统开发过程的,数据库性能专家在硬件选型、软件设计开发之前,就应当开始工作并持续到系统转维阶段。性能设计需要有设定明确的性能目标、以及可验证、可度量的性能模型,如果缺失了这一步性能工程工作会被推迟直到问题出现,假设在架构决策确定以后,随着系统开发一步步推进,修复性能问题的难度和成本会越来越大。1.3 性能复杂并充满挑战系统的性能工程是一个充满挑战的领域,具体的原因很多,主要的原因在于通常系统性的性能问题有主观的成分也有其复杂的一面,而且常常是多维度问题并存首先,性能能问题的主观性,通常性能问题按照不同的视角去理解可能会得到不同的结果,例如下面这幅图,不同的人由于其专注点、思考问题的角度不同会得到完全不同的结论因此关于性能的主观性,可以归纳为以下两点:软件工程等计算机相关的科学理论知识往往是建立在客观具体范畴上的,大多数业界人士审视问题非黑即白。在进行软件故障查找的时候,只需要判断问题bug是否存在或者是否已修复就可以了。因为问题bug总是伴随着错误信息,而错误信息通常容易解读性能问题往往是主观的,开始着手性能问题时,对问题是否存在的判断都有可能是模糊的,在性能问题被修复的时候,被一个用户认为是“不好”的性能,另一个可能认为是“好”的。例如:某个查询耗时1s返回,这里是“好性能” 还是“不好的性能呢”?虽然查询响应时间可以用具体的时间单位来准确度量,但如果脱离目标还是很难说明达成的情况或者效果,因此对于性能需要定义清晰的目标。核心重点性能目标定义要清晰,诸如平均响应时间latency、吞吐量throughput,考虑到波动因素时需要定义的最大响应时间、落进一定响应时间范围内的请求统计其百分比,一定要尽可能的把主观的问题客观化性能问题描述要具体,需要包含硬件配置、组网、部署模型、测试模型、测试结果的量化描述。举例:其次,性能问题往往由多个模块交互相互作用而成,造成很难在开始找到实际的根因,更糟糕的时有时甚至会被一些表面的现象带错了方向,导致花费很长时间无法找到实际原因。关于性能问题分析的复杂性主要有以下特征:特征1:性能问题通常缺少一个明确的分析起点问题暴露的表象往往只是结果而不是根因,有时候我们只能从猜测开始,比如,猜测网络时延大猜测磁盘IO成为了瓶颈猜测操作系统在调度上不符合我们的预期猜测某个位置不受控的进程影响了我们keep in mind:分析性能问题的开始往往需要对这个是不是一个正确的方向做出判断,一个有经验的性能专家往往能够在开始找准方向特征2:性能问题可能出现在子系统之间复杂的互联上即便这些子系统隔离时都表现的很好,也可能是由于连锁故障出现的性能问题(模块间交互逻辑不匹配)Keep in mind:不仅清晰理解模块间数据流、组件之间的关系,还需要理解他们之间是如何协作的,往往需要全局系统的方法特征3:性能问题可能是多个问题并存在复杂的系统中可能会有多个问题,他们之间可能相关也可能不相关,因此真正的任务可能不是寻找问题,而是辨别问题或者说辨别哪些问题是重要的Keep in mind:需要造成当前性能问题的主要矛盾1.4 性能相关的术语这里介绍一些在数据库性能调优时经常用到的术语:(1)关键术语:IOPS(PPS)每秒钟发生的输入输出操作次数,是数据传输的一个度量方法。对于磁盘的读写,IOPS指的是每秒钟读写次数。数据库场景中,常用IOPS来描述数据库系统数据盘每秒钟对磁盘施加的IO频率,常用PPS来描述网络传输包的频率(2)关键术语:吞吐量(Throughput)评价工作执行的速率,在数据传输方面描述的是数据传输的速度(byte/s,bit/s)。在数据库场景中往往指的是每秒钟处理的事务数TPS、查询数QPS(3)关键术语:响应时间(延时)Response time (Latency)一次操作完成的时间,包括用于等待和服务的时间,也包括用来返回结果的时间。在数据库场景中用于描述一条查询的从发起到返回结果时的时间开销(4)关键术语:饱和度Resource Saturation指的是某一资源无法满足服务的排队工作量。数据库场景中用于描述大并发场景下处于等待工作队列的任务书,通常反映了当前系统作业被积压的情况(5)关键数据:瓶颈Bottleneck在系统性能力,瓶颈指的是限制系统性能的那个资源,辨别和优化掉瓶颈是系统性能优化的重要工作(6)关键术语:工作负载Workload系统的输入或者是对系统所施加的负载叫做工作负载。对数据库来说,工作负载是用户通过客户端给数据库发送的查询、运维操作等方面的请求(7)关键术语:缓存Cache用于复制或者缓冲一定数据的高速存储区域,目的是为了避免关键路径被较慢的处理过程拖慢,从而提高性能。对数据库来说,主要指计划缓存(避免查询重复编译)、结果集缓存物化(避免同类查询重复执行)以上内容为数据库性能优化系统概述的相关内容,下篇将分享查询处理综述的精彩内容,敬请期待!
  • [问题求助] openGauss有没有设置sql脚本最大长度的参数? 类似于PG的statement_max_length。
    求助: openGauss有没有设置sql脚本最大长度的参数? 类似于PG的statement_max_length,谢谢了!
  • [技术解读] GaussDB技术解读——GaussDB架构介绍(五)
    GaussDB架构介绍(四)从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构进行了解读,本篇将从关键技术方案的事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续介绍GaussDB云原生架构。事务存储组件云原生数据库支持透明多写,所有节点对等,每个计算节点都可以读写全部的数据页面,事务在本节点执行,没有分布式事务。每个计算节点都有Local buffer pool,采用Remote memory pool扩展计算节点的内存,在多个计算节点之间共享buffer地址,避免页面在多个计算节点之间传来传去。存储引擎采用Inplace update引擎,底层存储接口统一采用段页式存储方式。事务ID本节点分配,保证唯一性。事务提交时间戳统一分配,合并原来的CLOG和CSN LOG统一记录。存储层采用Log is data,把数据库存储引擎的持久化卸载到Page Store执行日志持久化,日志回放修改页面,创建检查点。图1 分布式缓冲池示意图在计算节点,分布式缓冲池位于数据访问层和分布式存储层的中间,所有的数据访问都要经过缓冲池。分布式缓冲池需要保证页面数据的一致性和页面查找访问的高效性,是云原生数据库实现透明多写,内存资源弹性的关键模块。具体设计如下:1、本地内存和远程内存两级缓存本地内存和远程内存的读写时延差别非常大(30~100ns 和 800ns~5us的区别), 哪些页面在本地缓存,哪些页面在远程缓存非常关键。同时还有一个重要的因素需要考虑,那就是页面是否在多个计算节点被读写,因此云原生数据库把页面分为三大类,一类是页面在多个计算节点被读写(Heap页面,FSM页面),适合存放在远程内存里,页面地址共享;一类是页面大概率被读,几乎不被修改或者极低概率被修改(索引的非叶子页面,系统表的页面)适合存放在本地内存;另外一类是页面只在固定的单节点被读写,(智能路由优化后索引的叶子节点页面),适合存放在本地内存。理想的页面分布情况如下图所示:图2 理想页面分布示意图2、页面查找机制每个页面缓存对应一个元信息,称为page directory(PD),它描述了页面的最新版本在哪个节点,也就是page owner node(PON),页面是否是共享的远程页面地址,以及远程页面地址。PD 也是分布在各个计算节点上,每个计算节点管理一部分PD, 采用一致性Hash的方法管理PD。图3 页面查找示意图索引页面按照Range自动汇聚算法,根据SQL访问把相关页面汇聚到一个节点,提高索引访问的本地内存的亲和性。索引的叶子节点本身就是从左到右按照索引key的大小顺序存放的,因此很容易根据索引的叶子节点自动划分Range,SQL优化器的路由模块按照Range路由就可以让索引页面按照Range汇聚到SQL节点的本地缓存里实现亲和性访问。针对多个索引的多个Range的亲和性场景,优先选择主键作为亲和性的Range路由。3、支持远程内存池, 内存独立扩展。云原生数据库在云上支持各种业务负载,CPU、MEM和Storage的配比很难一开始就配置合适,有的是计算密集型的业务,有的是内存密集型的业务,有的是存储容量大的业务。针对各类业务场景,云原生数据库需要提供精细的各种资源的独立扩展能力。支持远程内存池,实现了集群物理内存独立扩展。内存池是可选服务,也可以跟计算节点合部署。4、本地缓存远程页面地址,页面地址共享,全RDMA/UB单边读写。页面如果频繁在多个节点被读写,为了避免页面在多个节点之间传来传去,采用共享页面地址的方式,SQL节点Local buffer pool里缓存页面的远程地址,通过全单边读写远程页面。在设计上需要考虑读写页面的Latch问题以及写页面过程中故障的处理问题。对于exclusive latch采用lock bit和lock owner node的方式表示,对于share latch,lock bit和lock owner node的方式无法表示, 因为可以有很多发起者同时持有share latch。因此云原生在设计上采用lock-free无锁机制读取页面。5、Lamport LSN在云原生数据库多写的架构下,每个节点有独立的日志流,本地日志流的LSN是本地分配维护的,本地有序逻辑递增,页面在各个SQL节点之间分别被修改的情况下,需要保证在新节点上修改页面产生的日志LSN要比这个页面之前的日志LSN要大才可以,也就是说从多个节点修改过同一个页面,日志虽然在各个节点独立的日志流里,但是要维护修改页面的日志顺序LSN。Redo日志在多个SQL节点都存在,需要保证这些日志的LSN顺序,才可以保证日志回放的顺序正确性,因此采用Lamport LSN。这部分的详细设计请参照文档<< GaussDB Kernel TD V600R001C00 XLog日志系统设计说明书.docx>>。图4 页面Lamport LSN维护示意图SQL引擎组件云原生数据库SQL引擎继承原来openGauss的词法解析,语法解析,查询重写,查询优化和执行引擎的能力。由于云原生数据库是shared disk 架构,一个事务在一个节点上执行,所以不需要原来分布式根据分布式key进行数据分布,分布式执行和分布式2PC提交的能力。为了支持数据库粒度的异地多活,云原生数据库引入了CDB和ADB的概念,SQL引擎在访问表等对象的过程中,需要记录当前执行的数据库上下文信息,内存上下文根据CDB来分配和管理,并且需要把当前的CDB信息透传到存储引擎,把日志持久化到相应CDB的日志流中。云原生支持SQL读写一致性路由,根据当前会话的数据一致性要求和CDB的主备把SQL路由到相应集群进行处理。云原生支持SQL数据亲和性路由,根据数据的访问亲和性对数据进行汇聚,SQL优化识别出数据分区所在节点后,把SQL路由到相应节点进行处理。云原生长期演进要求数据和程序的解耦,在SQL引擎中实现系统表存储和解析的解耦,实现系统表的前向兼容。DCS组件云原生数据库支持DCS一是为了DCS能够支持持久化能力,二是构建一站式的云数据库服务能力。DCS原来是一个share nothing的分布式集群,有自己的通信管理,集群管理和客户端。在云原生数据库中,DCS是作为一个组件集成到整个服务中,主要提供字符串(String)、哈希(Hash)、列表(List)、集合结构(Set、SortedSet)等数据类型的直接存取,包括代理层实现消息收发解析,KV数据的基本读写,数据分片管理和数据存储等功能。通信和集群管理使用云原生的通信和集群管理。图5 DCS方案示意图表1 DCS主要模块模块功能描述代理模块依据GaussDB消息协议实现消息解析、消息封装等功能。代理在DCS服务端集成,不存在实际的代理节点。引入代理的主要目的是屏蔽客户端对服务端实现细节的感知。数据管理实现数据分片分布和管理,保障数据可靠性。通过跳表实现过期删除和对象回收,保障租户内存复用。同时实现双云同步功能。存储模块以分片数据为细粒度实现数据的内存存储、逻辑持久化、多版本备份等能力。云原生DCS服务继承原来DCS内存KV数据的CRUD、路由管理、跨DC复制、逻辑持久化、过期删除、对象回收、数据核查等数据处理功能,需要调整新增的模块功能如下:1、代理层原来DCS客户端协议与Redis兼容,Redis客户端使用RESP(Redis序列化协议)与Redis服务器进行通信,RESP位于TCP之上,客户端和服务器是保持双工的连接。云原生客户端可同时支持SQL操作和KV操作,除了SQL操作的前后端消息协议,还需要考虑KV操作的通信协议。云原生数据库设计目标要求DCS的KV接口完全兼容,但不要求兼容redis原生客户端,所以在不和SQL操作通信协议冲突的前提下,DCS的通信协议继承原来的实现方式,对于冲突的部分,优先保证SQL的通信协议,调整DCS的通信协议实现。2、数据管理数据分片分布基于一致性hash算法,实现分片数据和计算节点的映射。数据分区还是基于经典的一致性hash算法,将(0~2^64-1)的地址空间划分为固定细粒度的分区,主键的hash值会映射到固定的分区中,数据内存存储通过DCS数据管理模块实现。计算节点通过模拟表形式将KV数据存放到存储引擎实现数据落盘。3、DCS在云原生数据库中是shared disk架构,所有节点对等,在DCS初始化时,需要通过一致性hash计算分区管理的owner,在一个节点故障通知一致性视图调整时,需要选择一个节点接管故障节点的分区,并且通过数据库的存储引擎读取数据,恢复内存数据结构。4、DCS提供GR地理复制能力,支持DCS数据进行跨DC数据备份,实现DC故障时业务的无损切换,实现DC容灾。一个源端集群对应多个备份集群,为保证集群能够跨DC通信,通过GR Link建立跨DC的链接,Link代表一个DC到另外一个DC的复制和备份关系的有向链接。用户通过配置好的GR同步备份或复制的规则,才能触发数据同步。LINK、RULE的操作接口在DCS内部实现,规则持久化到系统表或配置表。DC同步跨集群消息转发采用云原生数据库通信系统中跨集群通信服务处理。实时分析组件云原生数据库以OLTP为主,同时也支持基于OLTP数据的OLAP需求,如每日报表。在云原生数据库中,DBA可以选择为这部分表创建列存索引。创建完列存索引之后,执行器在做顺序扫描的时候,会自动选择列存索引进行数据的读取,实现快速扫描计算的能力。云原生数据库以行存为基础,数据的增删改都先以行存的形式落到数据库中。事务、xlog等机制保障了行存的ACID特性。行存采用Inplace-update引擎,一个Tuple一旦被插入到表中,位置基本不会改变。每个Tuple可以用它的物理位置(文件页号+页内偏移,称为RowID),作为唯一标识。事务的多版本在回滚段中,可以根据RowID直接访问。云原生数据库中的列存索引方案如下图所示:列存是根据行存构建的一个read-only的副本,每次对行存的更新操作会在元数据区域(In Memory Delta Unit,IMDU)增加一条RowID记录。列存扫描的时候会查看元数据区域,确定哪些Tuple已经失效,再去行存中根据RowID读相应的数据。后台线程会周期性地更新列存,回收元数据。如果列存索引和更新操作不在同一台机器上,使用batch模式,即把一个事务中产生的所有失效信息,统一打包到一个RPC请求中,发送给列存索引所在的实例上,从而减少对OLTP请求的影响。行存的block为8KB,列存需要较多的数据量才能实现更好的压缩、向量化操作等优化。所以一个IMCU对应多个行存的block,目前暂定为1024个,这样一个1024个block称为一个Super Block。图6 列存索引示意图为了支持列存大小超过内存容量的场景,列存索引支持从内存中置换到磁盘上。但是列存本身在故障情况下并不能保证自身的一致性,故障重启之后列存需要根据行存的内容重新构建。所以这里的磁盘对于列存来说,是内存的延伸,用来缓存额外的数据。因为DU容量小,且经常被修改,所以可以常驻内存。列存索引和行存完全是解耦开的。部署形态上,列存索引既可以与行存在一个实例中,节约物理资源;也可以与行存在不同的实例中,避免OLAP请求对OLTP请求产生影响。两种部署形态分别如下图所示:图7 行存列存混合部署示意图图8 行存列存分开部署示意图PageStore组件PageStore是一个分布式存储,对外提供SAL接口,SQL节点通过SAL接口进行日志和页面的持久化服务,PageStore对象间的映射关系如下图所示。Page Cluster Manager Control Server(集群管理):页面集群管理控制服务负责整个存储节点的管理,VFS和StoreSpace的管理,以及Slice的分配和调度。VFS:虚拟文件系统,每个租户可以创建一个VFS,集群管理按照VFS统计容量和IO等信息;PG(Placement Group,放置组):多个存储节点组成一个PG,PG的多个存储节点满足反亲和性。集群管理在分配Slice的时候,按照PG进行分配。Slice:数据存储的基本单元,Slice分配到具体的某个PG,分配到PG后,Slice就运行在PG下的多个节点上。每个Slice管理10G的数据量,10G的数据可能来自多个文件的一段连续页面。Slice逻辑上主要实现SQL节点页面的持久化和快速检索。Slice的元数据采用Btree管理,多个节点的Slice副本通过Raft机制提供数据的可靠性。每个Slice是数据回放的基本单元,实现独立的快照和检查点。Slice存储管理如下图所示。存储节点:每个存储节点上运行一个PageStore进程,PageStore进程会管理多个Slice。PageStore进程内的所有Slice共享BufferPool、ThreadPool、通讯组件、消息分发和PAL等模块功能。多个Slice共享PageStore进程的CPU资源和内存。文件:抽象的存储,为Slice存储数据,Slice会使用多个文件来存储数据。PAL:持久化层,用于对Slice的文件进行持久化,下面可以对接LocalFS、Plog、Lun等。图中红色虚线框为PageStore提供的本地盘持久化方案。图9 PageStore对象关系示意图图10 Slice存储管理示意图备份恢复组件备份和恢复PITR主要是为了应对人为失误、硬件故障和自然灾害等。云原生数据库默认支持一级备份,一级备份是分布式存储Page Store基于append only实现的快照功能,快照数据保存在本集群,用户可以配置开始一级备份的时间段、频率以及保留时间,由OM_Server根据集群的负载等数据生成备份计划。一级备份等于是数据页的备份,为了实现PITR,在开启一级备份后,会默认开启日志归档,通过快照数据+日志实现快速PITR。用户可以设置开启二级备份,一级备份数据保存在本集群,会占用用户生产集群的空间且全闪环境下费用较高,同时为了提高备份数据的可靠性,云原生数据库提供二级备份将备份数据及日志保存在OBS等远端存储上。当一级备份的保留时间过期时,云原生数据库会自动将其转储为二级备份,转储成功后自动删除一级备份的快照。同样用户可以设置二级备份的保留时间,二级备份保留时间过期时会自动将远端存储备份删除。在恢复时,由于云原生数据库一个页面可能涉及多个日志流,需要对多个日志流进行扫描,对日志进行合并恢复。在扫描日志阶段可以根据恢复配置文件配置的恢复点确定恢复的位置,从而在正式恢复时恢复到这个时间点即可。安全云原生数据库是一个分布式系统,各个服务之间,服务与外部应用和外部用户之间,服务与内部应用和内部用户之间主要通过通信进行交互,它们的数据流图如下图所示。图11 安全威胁分析示意图从图中可以看出,云原生主要包括三个通信平面,OM_Monitor,OM_Agent,OM_Server组成的管理平面(操作维护),GaussDB Master Server和DB Cluster Resource Schedule Server组成的控制平面。GaussDB Server,DCS Server,Memory Server,Message Server,Page Server,Page Cluster Manager Control Server组成的用户平面。云原生系统外部交互主要有三类接口:第一类是GaussDB Server,DCS Server提供的业务访问接口,这个接口是外部接口。第二类是OM_Server提供的操作维护接口,这个接口对接公有云的维护后台。第三类是Message Server提供的跨区域集群的消息通信接口,这个接口虽然是内部接口,但通信网络不在内部网络。云原生数据库是一个池化的共享资源系统,不同租户的运行环境通过进程隔离,租户的存储通过VFS进行隔离。为了保证租户数据不泄露,不发生篡改,在控制平面需要对租户身份进行签名认证,租户资源调度信息的传递需要防止仿冒和篡改。在用户平面,不同租户的数据使用不同的秘钥进行加密,对于远程内存操作的RDMA rkey进行随机化,其他安全继承原来数据库的能力,包括用户管理、权限管理和审计。在维护平面,对接入的访问进行认证,对进行的操作进行审计。- END -
  • [技术解读] GaussDB技术解读——GaussDB架构介绍(四)
     GaussDB架构介绍(三)从智能关键技术方案、驱动接口关键技术方案等方面对GaussDB架构进行了解读,本篇将从云原生关键技术架构&关键技术方案两方面对GaussDB云原生架构展开介绍。  11  GaussDB云原生架构 11.1  云原生关键技术架构  图1 云原生数据库1层逻辑模型  1. 分层原则。整体层次分为三层,分别为Application Layer,Computer Layer和Storage Layer。Application Layer应用层主要是客户端各种语言的驱动,这些驱动通过通信与计算层Computer Layer进行交互,对数据库进行操作。下面是Computer Layer计算层,计算层负责SQL处理和事务处理,数据库的备份处理,集群内和集群间的消息通信,整个集群的管理,与公有云基础服务(认证,计费,运维)的对接。最下面是Storage Layer存储层,存储层负责数据库数据的日志存储,数据存储,数据库的备份存储。  2. 分平面原则。管理面,控制面和用户面。管理面主要包括操作维护子系统,控制面主要包括资源调度子系统,用户面主要包括数据库服务子系统。  3. 适配器原则。底层存储支持本地文件系统,Dorado 存储,Ceph分布式文件系统和DFV存储。这些存储的操作接口统一封装为文件系统接口。  4. 负荷分担。所有子系统的服务节点对等,一个节点故障,其他节点可以接管。  5. 数据存储多副本存储。Dorado 支持多种Raid级别,PLOG存储支持数据存储为3副本。  11.2  关键技术方案 11.2.1 通信组件 云原生数据库采用shared disk架构,各个计算节点对等,计算节点之间通过页面交换实现缓存数据的一致性,为了提高页面传递的效率,需要利用RDMA或UB单边读写的能力;云原生数据库为了管理动态资源,需要对动态资源的owner分配进行加锁,分布式锁管理需要利用原子操作和RPC消息对资源进行加解锁;多租户资源管理服务需要下发调度信息,并从计算节点读取资源状态,需要RPC消息;集群管理组件进行故障检测、发送消息需要使用RPC消息。因此,通信组件需要能够支持原子操作、单边读写、双边RPC和RPC通信。  目前市场上有三种RDMA网络,分别是Infiniband、RoCE(RDMA over Converged Ethernet)、iWARP,如下图所示。其中,Infiniband是专为RDMA设计的网络,从硬件级别保证可靠传输 ,但是成本高昂。而RoCE 和 iWARP都是基于以太网实现的RDMA技术,在目前最广泛使用的以太网上实现了高速、超低延时、极低CPU使用率的RDMA通信。  图2 RDMA网络种类  RoCE协议有RoCEv1和RoCEv2两个版本,RoCEv1是基于以太网链路层实现的RDMA协议(交换机需要支持PFC等流控技术,在物理层保证可靠传输),允许在同一个广播域下的任意两台主机直接访问;而RoCEv2是以太网TCP/IP协议中UDP层实现,即可以实现路由功能。  表1 InfinieBand和RoCE对比  InfiniBand:设计之初就考虑了 RDMA,从硬件级别保证可靠传输,提供更高的带宽和更低的时延。但是成本高,需要IB网卡和交换机支持。  RoCE:基于Ethernet 做RDMA,消耗的资源比 iWARP 少,支持的特性比 iWARP 多。可以使用普通的以太网交换机,但是需要支持RoCE的网卡。  iWARP:基于TCP的RDMA网络,利用TCP达到可靠传输。相比RoCE,在大型组网的情况下,iWARP的大量TCP连接会占用大量的内存资源,对系统规格要求更高。可以使用普通的以太网交换机,但是需要支持iWARP的网卡。  为了支持各种网卡类型的RDMA协议和实现低时延的网络通信,云原生数据库的节点通信组件的整体架构图如下:   图3 通信组件整体架构图  节点间通信组件包括以下几个模块:RPC接口层、配置管理、通用功能、会话管理,消息处理和协议层。各模块功能描述如下:  表2 模块功能描述  根据对通信时延的计算,一次单边通信留给CPU的时间只有3.36us,为了实现低时延通信,各个模块的设计考虑如下:  1、RPC Interface  根据不同场景对通信接口的需求,RPC接口层提供消息语义、内存语义和原子操作接口,并支持同步、异步和批量调用。  RDMA内存操作需先将内存注册到网卡。论文《用户态RPC over RDMA优化技术的研究与实现》实验表明,传输的块大小越小,内存注册在一次RPC调用中占比越大,当块大小小于64KB时,内存注册开销远大于传输本身的开销。为降低内存注册的开销,通信组件统一申请大块内存并注册到网卡,业务模块需要进行远端内存操作前通过调用请求内存接口获取指定长度的已注册内存。  2、配置管理  配置管理主要是静态设置节点间通信信息,在通信初始化时使用,不在通信关键路径上。  3、通用模块  通用模块主要负责计算节点注册内存的管理和集群间通信消息的转发,在初始化时使用,不在通信关键路径上。  4、会话管理  会话管理主要包括连接管理、上下文管理和传输管理。  RDMA协议通信的基本单元是QP(Queue Pair),通信的两端都需要创建QP,不同传输模式使用的QP类型不一样,并且支持的RDMA原语也不一样,如下表。  表3 不同传输模式支持的RDMA原语及消息大小  可见,单边读写和原子操作只能使用可靠连接,即每个连接的两个节点需要各自维护一个QP,并且不能被其他目的节点的连接共享。假设有N个节点需要相互通信,则至少需要N * (N - 1)个QP,而QP本身需要占用网卡和内存,当连接数很多时,存储资源消耗将会非常大。经计算一个未经封装的RDMA QP大概占186.67KB (0.1823M) 内存。为降低内存开销,与相同节点通信可以共享QP。但在高并发下竞争QP资源可能成为性能瓶颈。连接分发设计需要考虑性能和资源利用率。连接管理根据QP是否可共享支持共享连接(share-connection)和线程独占连接(per-thread)两种选择。  双边操作可以使用不可靠报文QP,即传输为不可靠数据报文且不同目的节点可共享QP。为节省QP资源,减少过多QP造成网卡cache miss导致的性能下降,考虑双边通信场景选择使用不可靠报文,但是为保证数据的可靠性,需要进一步做可靠性设计。考虑设计滑动窗口实现保序和重传机制,作为后续开发特性。(但是据FaSST测试数据,RDMA的不可靠发送丢包率近乎为0),需要设计传输管理模块实现保序、重传等功能(优先级低))。  由于RDMA协议通信接口为异步接口,对于同步RPC请求,多线程共享通信队列需要上下文切换,不能满足时延要求。需要设计低时延的同步机制进行上下文切换或无锁设计。  对于TCP而言,协议本身已经提供了流控机制和传输的可靠性,需要额外提供消息的上下文管理,即对发送消息和接收消息进行关联。  UB是无连接的,但与RDMA一样采用发送队列、接收队列和完成队列的方式进行通信,所以会话管理与RDMA一致。  5、消息处理  根据通信接口语义,需定义不同类型的消息,包括集群内节点间RPC通信消息、远端内存访问消息、节点间原子操作消息及集群间RPC通信消息。消息处理组件根据消息类型进行封装、解析为所需的消息类型。后续根据业务需要,对不同消息类型提供序列化、反序列化能力。  6、协议层  协议层需要同时适配RDMA/TCP/UB三种通信协议栈。  对于RDMA协议层的设计需要考虑:多线程并行发送RDMA请求时,并发请求的响应到达顺序与请求顺序不一致,因此不能在发送线程中通过检查CQ来查看自己的响应是否到达(可能先查到其它线程的响应),需要单独一个线程去检查CQ状态,这样就需要在发送线程与检查线程间进行同步,但线程同步机制很难满足时延要求(高并发场景下加解锁可能需要上千至上万个cycle),所以需要考虑协程或者无锁设计。如果使用协程,在线程的协程中轮询完成队列,其他协程进行发送请求,但是需要在业务模块启用协程,通信模块无法控制管理发送线程。如发送端无法采用协程设计,为了降低调度开销,对于有锁设计,CQ检查线程应该单独绑核,通过RDMA协议请求(WR)结构体ibv_send_wr、完成响应(CQE)结构体ibv_wc及响应(WR)结构体ibv_recv_wr三者的wr_id相互关联,该信息可放于双边通信的消息头的msgId字段或单边通信的立即数字段。wr_id是由通信组件传入的参数,可设置为消息的内存地址以避免重复。对于无锁设计,考虑采用run-to-complete模型,即线程间不共享QP,在一个线程内完成消息的发送和轮询事件,但资源消耗更大,更适用于对时延要求极高的单边操作场景。  RDMA原语的轮询CQ接口采用poll实现,对于大并发场景,poll的性能不及专门用于处理有大量IO操作请求的epoll异步编程接口。考虑设计epoll接口访问系统节点,轮询CQ完成队列,取代RDMA原语接口以获取更好性能。  RDMA协议不同传输模式支持的最大传输大小如上表所示, 双边通信可使用不可靠报文以节省内存资源,提高通信效率,但是最大传输数据长度受限于网卡MTU,需要限制发送数据,或者进行拆包发送、组包接收。  11.2.2 集群管理组件 云原生数据库支持全球集群部署和区域集群部署,相应的,故障检测也分为全球集群故障检测和区域集群内故障检测,全球集群故障主要检测区域集群网络故障、区域集群脑裂故障。区域集群内检测节点网络故障、租户节点分区、集群管理节点分区、DFV存储故障。不同的故障需要不同的心跳链路来检测,具体如下图所示。   图4 集群组件心跳架构图  1. DCHA网络心跳,DCHA全称为DeCentralized High Availability,即去中心化故障快速检测方案。DCHA本质是一种邻居故障检测方法,能够更好地适应大规模集群故障检测,但是当大规模集群故障时可能导致漏报问题,需要通过其他机制,比如租约心跳机制作为补充。  2. 节点租约心跳。节点租约心跳故障检测是指节点向集群管理节点获取心跳租约,当集群管理节点检测节点长时间未申请租约,将会判断此节点故障,同时如果节点长时间无法从集群管理节点获取租约,将进行自杀重启。  3. 租户节点间网络心跳和DFV心跳。租户节点间互发网络心跳、写入DFV磁盘心跳,通过Membership Voting Disk机制判断租户脑裂和租户节点故障,并进行租户视图变更和故障重启。  4. 集群管理间心跳根据部署形态选择不同心跳机制。如果是共享存储部署,则选用Membership Voting Disk机制。如果是share nothing单机部署形态,则选择普通心跳,通过Raft协议避免分区。  5. 区域集群间网络心跳。每个区域集群通过Membership Voting Disk的一致性视图选择一个节点或者通过Raft协议选择的主节点当做本区域集群的节点代表与其他区域集群进行通信。区域集群间选择普通网络心跳,通过Raft协议避免区域集群的分区。  6. 如果集群管理服务整体失效,则租户进程不能继续提供服务。如果节点主进程失效,则租户进程也不能继续提供服务。  11.2.3 多租组件 云原生数据库支持多租户,通过多租户资源共享,一是降低租户的成本,二是通过共享资源的池化实现租户的资源弹性,提高租户业务的可用性。租户的资源弹性支持两种模式,Scale Up和Scale Out。Scale Up是在单个计算节点上对租户的分配资源进行弹性处理,Scale Out是在计算节点之间对租户的分配资源进行弹性处理。  Scale Up的弹性模式在计算节点上实现,由计算节点上的多租户资源管理模块实现。Scale Out的弹性模式由集群管理节点的调度模块实现。因此整个多租户设计主要分为两个部分,分别为节点租户资源管理(节点上)和集群资源调度管理(节点间)。  租户购买的资源类型可以是固定型和弹性型。固定型的资源类型总是始终保证的。弹性型对应到Scale Up和Scale Out两种弹性模型。弹性型的资源类型由可变的节点个数和每个节点上可变的资源大小组成,分别表述为租户节点个数最小值和租户节点个数最大值、租户节点资源最小值和租户节点资源最大值。  最小值是始终保证的,弹性是在最小值和最大值之间做弹性伸缩。节点租户资源管理处理节点上租户资源的最小值-最大值之间的弹性;集群资源调度管理处理租户资源总的节点数在租户节点最小值-租户节点最大值之间的弹性。即绝对保证固定资源分配和最小预留资源分配,最小预留到最大上限部分的弹性资源不绝对保证,根据租户的工作负载情况和优先级进行资源调度。  租户节点资源管理和集群资源调度管理的两层整体架构如下:   图5 集群资源调度和计算节点资源管理逻辑图  对于集群资源调度,多个计算节点上的资源组成一个大的资源池,集群资源调度负责整个资源池的管理和调度,比如租户数据库服务初始化部署时一次调度分配资源,以及租户数据库服务迁移的二次调度分配资源。一次调度只关注租户资源配置进行静态的资源调度分配,即根据固定资源,或者最小预留资源设置进行调度。二次调度则是根据租户数据库服务负载统计信息和计算节点负载信息进行调度。  对于节点租户资源管理,云原生数据库采用进程级的资源隔离来实现多租户资源隔离,即在一个计算节点上每个租户拥有一个数据库服务进程。每个计算节点可以看作一个单独小资源池,节点租户资源管理主要负责计算节点上租户的资源分配,资源隔离与弹性控制,以及租户数据库服务的管理,如启动,停止等。  以上内容为云原生关键技术架构&关键技术方案的相关内容,由于关键技术方案部分内容过多,下篇将接着从事务存储组件、SQL引擎组件、DCS组件、实时分析组件等方面继续分享关键技术方案的相关内容,敬请期待! 
  • [技术解读] GaussDB SQL基本语法示例-CASE表达式
    一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。二、CASE Expression(CASE表达式)介绍在GaussDB SQL中,CASE表达式(CASE Expression)是一个非常强大且常用的工具,可以用于在SQL中执行基于条件的操作。CASE表达式类似于IF-THEN-ELSE语句,但使用起来更加灵活,易于阅读和编写。CASE表达式包含两种形式,一种是简单形式,一种是搜索形式。下面将分别介绍这两种形式的写法、语法以及使用方法。三、GaussDB数据库中的简单CASE表达式1、基本概念简单CASE表达式是指在给定的表达式上执行基于等式的比较,如果表达式等于某个值,则执行某个操作。即依据input_expression与when_expression的匹配结果跳转到相应的result_expression。2、基本语法CASE input_expressionWHEN when_expression THEN result_expression[...n][ELSE else_result_expression]END;说明:其中,input_expression表示需要比较的表达式,when_expression等表示需要比较的值,result_expression等表示各个值相等时的结果,else_result_expression表示当input_expression不等于任何值时的默认结果Tip:CASE:简单CASE函数中支持子查询,但须注意input_expression与when_expression是可匹配的。 另外,如果没有取值为TRUE的input_expression = when_expression,则当指定ELSE子句时,DLI将返回else_result_expression;当没有指定ELSE子句时,返回NULL值。3、示例假设根据固定的工资定义职员级别,可按如下SQL执行:SELECT name,salary,CASE salaryWHEN 15000 THEN '初级'WHEN 20000 THEN '中级'WHEN 25000 THEN '高级'WHEN 30000 THEN '高级'WHEN 35000 THEN '高级'ELSE NULLEND AS levelFROM companyORDER BY salary;SQL语句解析:测试使用的是在GaussDB数据库中创建的一张company表。这段SQL是从“company”表中选择员工的名字(name)、薪水(salary)以及一个根据薪水等级分类的字段(level)。并使用“ORDER BY salary”语句将结果按照薪水从低到高的顺序进行排序。简单CASE表达式的工作方式:如果“salary”字段的值等于15000,那么“level”字段的值就是“初级”。如果“salary”字段的值等于20000,那么“level”字段的值就是“中级”。如果“salary”字段的值等于25000或30000或35000,那么“level”字段的值都是“高级”。如果“salary”字段的值不等于以上任何值,那么“level”字段的值就是NULL。四、GaussDB数据库中的搜索CASE表达式1、基本概念搜索CASE表达式是指在给定的表达式上执行基于不等式的比较,如果表达式满足给定的条件,则执行相应操作。即按指定顺序为每个WHEN子句的boolean_expression求值。返回第一个取值为TRUE的boolean_expression的result_expression。2、基本语法CASE WHEN boolean_expression THEN result_expression[...n][ELSE else_result_expression]END;说明:其中,boolean_expression等表示需要比较的条件,result_expression等表示满足对应条件时的操作结果,else_result_expression表示当expression不满足任何条件时的默认结果。Tip:boolean_expression:可以包含子查询,但整个boolean_expression表达式返回值只能是布尔类型。如果没有取值为TRUE的Boolean_expression,则当指定ELSE子句时,DLI将返回else_result_expression;当没有指定ELSE子句时,返回NULL值。3、示例假设根据工资的范围定义职员级别,可按如下SQL执行:SELECT name,salary,CASE WHEN salary < 15000 THEN '初级'WHEN salary BETWEEN 15000 AND 25000 THEN '中级'WHEN salary >25000 THEN '高级'ELSE NULLEND AS levelFROM companyORDER BY salary;SQL语句解析:这段SQL同上文,是从"company"表中选择员工的姓名(name)、薪水(salary)以及根据薪水等级进行分类(level)。搜索CASE表达式的工作方式:当薪水(salary)小于15000时,薪水等级被标记为"初级"。当薪水在15000和25000之间(包括15000和25000)时,薪水等级被标记为"中级"。当薪水大于25000时,薪水等级被标记为"高级"。如果以上条件都不满足,薪水等级被标记为NULL。综上,这个SQL语句的主要目的是获取员工信息,根据其薪水水平对其进行分类,并按照薪水的水平进行排序。五、小结GaussDB 中的CASE表达式是一个非常有用的工具,可以用于在SQL中执行基于条件的操作,实现条件判断和分支逻辑,进一步优化数据库查询和操作。在编写SQL代码时,可以根据具体的业务需求灵活选择简单形式或搜索形式来进行编写,这样可以大大提高编码效率和代码可读性。附:常见使用场景,如:二次定义标签、饱和度统计、计算指标、数据格式转换等。——结束
  • [技术解读] 对GaussDB数据库和数据管理的简单介绍
    一、前言数据库与数据管理有着密切的关系,两者共同构成了一个完整的、可扩展的数据库管理系统。 数据库是用于存储数据的系统,为数据提供了安全、可靠、可扩展和可管理的存储环境。随着信息技术的飞速发展,数据已经成为企业的核心资产之一。在这个数据驱动的时代,数据管理成为了企业追求卓越的关键因素之一。GaussDB数据库作为一款具有高性能、高可用性和高可靠的关系型数据库管理系统,为数据管理提供了强大的支持。二、数据质量规则体系(衡量标准)数据管理最直接的目标是提高数据质量,最终目标是数据价值。主要驱动力是使组织能够从数据资产中获取价值。随着数据类型、数据来源的不断丰富以及数据量的飞速增长,企业面临数据质量问题的概率显著增加。数据质量是一个复杂问题,往往是多种因素综合作用的结果,解决数据质量问题要从机制、制度、流程、工具、管理等多个方面着手发力。数据质量涉及的范围也很广,贯穿业务的整个生命周期,从“数据产生->数据接入->数据存储->数据处理->数据输出->数据展示”,每个阶段都需要质量管理。在数据库系统建设的各个阶段都应该根据标准进行数据质量检测和规范化,及时进行管理,减少事后的治理工作。1. 为什么要进行数据管理举个下面的例子,很多刚入门的数据人,拿到数据后会立刻开始对数据进行各种统计、分析等,企图能立即发现数据背后隐藏的数据价值。然而忙活了一阵发现,并不能立刻提炼出太多有价值的信息。比如和数据打交道,可能会出现以下的场景:场景一:统计近 7 天用户的购买情况,结果从数据库中统计完发现,很多数据存在了重复记录,甚至有些数据统计单位不统一。场景二:查看报表,发现某一天的成交量暴跌,经过排查发现,是当天的数据缺失。场景三:一线坐席人员进行电销业务,拨打客户电话,看到了客户的敏感信息,被客户投诉。场景四:比如未进行数据备份,当数据被误操作、业务系统宕机时造成的数据丢失等。……造成这些情况的一个重要因素就是忽视了对数据的管理,没有制定合理的衡量标准,没有对数据进行审计和安全等管理。导致没有发现数据已出现的问题。所以,进行科学、客观的数据质量规则体系是非常必要且十分重要的。2、数据质量规则体系完整性:指数据在创建、传递过程中无缺失和遗漏,包括实体完整、属性完整、记录完整和字段值完整四个方面。完整性是数据质量最基础的一项,例如员工工号不可为空。唯一性:指同一数据智能有位移的标识符。体现在一个数据集中,一个实体只出现一次,并且每个唯一实体有一个键值且该键值只指向该实体。例如员工有且仅有一个有效工号。有效性:指数据的值、格式和展现形式符合数据定义和业务定义的要求。例如员工的国籍必须是国家基础数据中定义的允许值。一致性:指遵循同一的数据标准记录和传递数据和信息,主要体现在数据记录是否规范、数据是否符合逻辑。例如同一工号对应的不同系统中的员工姓名需一致。准确性:指真实、准确地记录原始数据,无虚假数据集信息。数据要准确反映其所建模的“真是世界”实体。例如员工的身份信息必须与身份证件上的信息一致。及时性:指及时记录和传递相关数据,满足业务对信息获取的时间要求。数据交付要及时,抽取要及时,展现要及时。数据交付时间过长可能导致分析结论失去参考意义。三、GaussDB数据库中如何实现数据管理在GaussDB数据库中,可从如下几方面进行数据管理(包含但不限于)。1、数据质量设计从语法、语义、语用三个方面去定义和衡量数据质量,在数据产生、数据加工以及数据使用的全过程中均需要符合其制定的标准和规范。如下图示:2、数据保护技术GaussDB通过多种数据保护手段和特性,保障存储在GaussDB中的数据安全可靠。传输加密(HTTPS):支持HTTP和HTTPS两种传输协议,为保证数据传输的安全性,推荐您使用更加安全的HTTPS协议。敏感操作保护:控制台支持敏感操作保护,开启后执行删实例等敏感操作时,系统会进行身份验证,进一步保证GaussDB配置和数据的安全性。SSL数据加密:可以使用SSL来加密数据库GaussDB和客户端的连接。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。3、数据存储GaussDB支持行列数据存储模型方式。进行数据库设计时,表设计上的一些关键项将严重影响后续整库的查询性能。表设计对数据存储也有影响:好的表设计能够减少I/O操作及最小化内存使用,进而提升查询性能。表的存储模型选择是表定义的第一步。客户业务属性是表的存储模型的决定性因素,依据下面表格选择适合当前业务的存储模型。存储模型使用场景行存点查询(返回记录少,基于索引的简单查询)。增删改比较多的场景。列存统计分析类查询 (group , join多的场景)。4、数据加密模型全密态数据库使用多级加密模型,不同加密场景中密钥的功能如下:数据:密态数据库对SQL语句中属于加密列的数据进行加密,对数据库服务端返回的属于加密列的查询结果进行解密。列密钥:数据由列密钥进行加密,而列密钥由主密钥加密。列密钥密文存储在数据库服务端。主密钥:由外部密钥管理生成并存储,数据库驱动会自动访问外部密钥管理,以实现对列密钥进行加解密。5、数据备份GaussDB支持多种数据备份和恢复方式,如全量备份、增量备份和差量备份等。这些备份和恢复方式可以保证数据的一致性和可靠性,避免数据丢失和损坏。备份策略:全量备份:第一次的全量备份后,无论数据是否变化,第二次备份和第三次备份都会将所有的数据全部进行备份。增量备份:第一次的全量备份之后,第二次备份只会备份数据变化的数据,第三次备份只会备份第二次备份后数据变化的数据。差量备份:第一次的全量备份之后,第二次备份只会备份数据变化的数据,第三次备份会备份第一次全量备份后数据变化的数据。GaussDB会在数据库实例的备份时段中创建数据库实例的自动备份。系统根据您指定的备份保留期保存数据库实例的自动备份。扩容实例CN或者分片后,系统会进行一次自动备份。 用户还可以创建手动备份对数据库进行备份,手动备份是由用户启动的数据库实例的全量备份,会一直保存,直到用户手动删除。四、小结GaussDB数据库凭借其高性能、高可用性和高可靠的特点,为数据管理提供了强大的支持。企业应充分利用GaussDB数据库对数据管理的更多功能和优势,加强数据管理实践,不断提升数据质量、数据安全,为企业的发展创造更大的价值。另外,对于数据管理而言,数据库是一种其必不可少且功能强大的数据管理工具。数据管理工作除了依赖数据库外,更多的要结合企业的管理机制、制度、流程、第三方工具等。例如,建立数据管理体系、制定数据管理标准、加强数据使用者的培训、定期进行数据质量管理检查等。——结束
  • [问题求助] GaussDB for MySQL 支持哪几种数据库引擎
    GaussDB for MySQL 支持哪几种数据库引擎
  • [问题求助] gaussdb 和 openGaussDB 有啥区别
    gaussdb 和 openGaussDB 有啥区别