-
一、前言GaussDB是一个高度可靠、可扩展、高性能的数据库管理系统,用于支持企业级应用、数据仓库、数据科学和实时分析等场景。它提供了丰富的功能和工具,以帮助开发和管理员有效地管理数据。在GaussDB中,触发器是一种重要的数据库对象,用于在满足特定条件时自动触发预定义的操作。通过使用触发器,您可以实现数据的实时监控、验证、日志记录和其他自动化任务。本篇文章将介绍GaussDB数据库中触发器的基本概念、创建以及示例,并简要总结触发器的优缺点。二、触发器概念触发器是GaussDB数据库中的一种数据库对象,它是一种自动触发的SQL代码块,用于在满足特定条件时执行预定义的操作。触发器可以用于监控数据库中的数据变化、实施业务规则、日志记录等。与存储过程不同,触发器是自动触发的,无需显式调用。三、GaussDB数据库中的触发器创建一个触发器。 触发器将与指定的表或视图关联,并在特定条件下执行指定的函数。1、语法格式CREATE [ CONSTRAINT ] TRIGGER trigger_name{ BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] } ON table_name[ FROM referenced_table_name ]{ NOT DEFERRABLE | [ DEFERRABLE ] { INITIALLY IMMEDIATE | INITIALLY DEFERRED } }[ FOR [ EACH ] { ROW | STATEMENT } ][ WHEN ( condition ) ]EXECUTE PROCEDURE function_name ( arguments );主要参数说明:CONSTRAINT:可选项,指定此参数将创建约束触发器,即触发器作为约束来使用。除了可以使用SET CONSTRAINTS调整触发器触发的时间之外,这与常规触发器相同。 约束触发器必须是AFTER ROW触发器。trigger_name:触发器名称,该名称不能限定模式,因为触发器自动继承其所在表的模式,且同一个表的触发器不能重名。 对于约束触发器,使用SET CONSTRAINTS修改触发器行为时也使用此名称。命名规范:符合标识符命名规范的字符串,且最大长度不超过63个字符。BEFORE:触发器函数是在触发事件发生前执行。AFTER:触发器函数是在触发事件发生后执行,约束触发器只能指定为AFTER。INSTEAD OF:触发器函数直接替代触发事件。event:启动触发器的事件,取值范围包括:INSERT、UPDATE、DELETE或TRUNCATE,也可以通过OR同时指定多个触发事件。table_name:需要创建触发器的表名称。取值范围:数据库中已经存在的表名称。referenced_table_name:约束引用的另一个表的名称。 只能为约束触发器指定,常见于外键约束。由于当前不支持外键,因此不建议使用。取值范围:数据库中已经存在的表名称。DEFERRABLE | NOT DEFERRABLE:约束触发器的启动时机,仅作用于约束触发器。这两个关键字设置该约束是否可推迟。INITIALLY IMMEDIATE | INITIALLY DEFERRED:如果约束是可推迟的,则这个子句声明检查约束的缺省时间,仅作用于约束触发器。FOR EACH ROW | FOR EACH STATEMENT:触发器的触发频率。FOR EACH ROW是指该触发器是受触发事件影响的每一行触发一次。FOR EACH STATEMENT是指该触发器是每个SQL语句只触发一次。未指定时默认值为FOR EACH STATEMENT。约束触发器只能指定为FOR EACH ROW。condition:决定是否实际执行触发器函数的条件表达式。当指定WHEN时,只有在条件返回true时才会调用该函数。function_name:用户定义的函数,必须声明为不带参数并返回类型为触发器,在触发器触发时执行。arguments:执行触发器时要提供给函数的可选的以逗号分隔的参数列表。参数是文字字符串常量,简单的名称和数字常量也可以写在这里,但它们都将被转换为字符串。 请检查触发器函数的实现语言的描述,以了解如何在函数内访问这些参数。2、创建步骤1)确定触发器的目的和条件:首先,您需要确定触发器的目的和条件。这包括确定您希望在什么情况下触发触发器(例如,在插入、更新或删除数据时)以及触发器的具体条件(例如,仅在特定时间或特定用户执行操作时触发)。2)编写触发器的代码:根据您的需求,编写触发器的SQL代码。这可以包括SELECT、INSERT、UPDATE、DELETE等语句以及逻辑控制语句(例如IF语句)。3)定义触发器的参数:定义触发器的参数,例如要监控的表、触发时机(BEFORE/AFTER)、触发事件(INSERT/UPDATE/DELETE)等。4)创建触发器:使用CREATE TRIGGER语句创建触发器,并指定上述定义好的参数和代码。3、注意事项当前仅支持在普通行存表上创建触发器,不支持在列存表、临时表、unlogged表等类型表上创建触发器。如果为同一事件定义了多个相同类型的触发器,则按触发器的名称字母顺序触发它们。执行触发器语句时是用触发器创建者的身份进行权限判断的。执行创建触发器操作的用户需要拥有指定表的TRIGGER权限或被授予了CREATE ANY TRIGGER权限。触发器常用于多表间数据关联同步场景,对SQL执行性能影响较大,不建议在大数据量同步及对性能要求高的场景中使用。4、附:表和视图上支持的触发器种类触发时机触发事件行级语句级BEFOREINSERT/UPDATE/DELETE表表和视图TRUNCATE不支持表AFTERINSERT/UPDATE/DELETE表表和视图TRUNCATE不支持表INSTEAD OFINSERT/UPDATE/DELETE视图不支持TRUNCATE不支持不支持四、GaussDB数据库中的示例示例一、在GaussDB数据库中创建一个触发器,以便在插入新记录时自动将记录的创建时间设置为当前时间。以下是一个简单的示例,演示了如何在GaussDB数据库中创建一个触发器,以便在插入新记录时自动将记录的创建时间设置为当前时间。--定义一个触发器函数,用于设置创建时间字段的值:CREATE OR REPLACE FUNCTION set_created_at()RETURNS TRIGGERAS $$BEGINNEW.date = NOW();RETURN NEW;END$$LANGUAGE plpgsql;--创建一个INSERT触发器CREATE TRIGGER set_created_at_triggerBEFORE INSERT ON test_1FOR EACH ROWEXECUTE PROCEDURE set_created_at();--执行INSERT触发事件并检查触发结果INSERT INTO test_1 VALUES(6,'');SELECT * FROM test_1;说明:1、其中test_1为测试表,date为测试表的字段名。2、NEW是一个特殊的关键字,代表正在插入的新记录。当一个触发器被触发时,例如在INSERT操作发生时,NEW可以用来引用正在被插入的新记录。这样,你就可以在触发器中使用NEW来引用正在进行操作的数据。3、参数“BEFORE”、“FOR EACH ROW”等可参见上文语法参数说明。示例二、在GaussDB数据库中创建一个触发器,当向测试表test_1中INSERT 数据的时候,同时向测试表test_2中插入相同的数据。以下是在GaussDB数据库中创建一个触发器,当向测试表test_1中INSERT 数据的时候,触发器被触发,并向测试表test_2中插入相同的数据。--创建触发器函数CREATE OR REPLACE FUNCTION tri_insert_func()RETURNS TRIGGERAS $$DECLAREBEGININSERT INTO test_2 VALUES(NEW.id, NEW.date);RETURN NEW;END$$LANGUAGE PLPGSQL;--创建INSERT触发器CREATE TRIGGER insert_triggerBEFORE INSERT ON test_1FOR EACH ROWEXECUTE PROCEDURE tri_insert_func();--执行INSERT触发事件并检查触发结果INSERT INTO test_1(id,date) VALUES(1,current_timestamp);SELECT *, 'test_1' as table_n FROM test_1UNION ALLSELECT *, 'test_2' as table_n FROM test_2;说明:同示例一。更多示例可参见官方文档。五、小结GaussDB数据库中的触发器是一种强大的工具,可用于自动化数据处理、数据验证、日志记录等任务。通过使用触发器,您可以提高数据一致性、减少数据冗余、实施业务规则并增强数据安全性。本文介绍了GaussDB数据库中触发器的基本概念、创建步骤和示例。希望能够帮助您更好地了解和使用GaussDB中的触发器功能。——结束
-
最近在开发工具脚本时,想要获取已建表的字段信息,比如类型,长度问题。现在通过 information_schema.columns 获取字段元数据。发现查询这个系统视图时发现时慢时快,快的时候25秒左右,慢的时候在3-4分钟。后来通过查看产品文档,通过关联几个系统表,整理一份sql,发现字段定义的长度和建表时的ddl存在差异。发现varchar类型的定义长度是atttypmod -4 其他是date ,timestamp,numeric 等类型更是看不懂了。sql:select t1.*from pg_attribute t1inner join pg_class t2on t1.attrelid = t2.oidinner join pg_namespace t3on t2.relnamespace = t3.oidinner join pg_type t4on t1.atttypid=t4.oidwhere t1.attnum>=0 and t2.relname = 'tablename' and t3.nspname='schemaname'order by t1.attnum;有没有熟悉的大神、老师,帮忙解释一下。或者告知其他的方法。
-
我们以清华大学李国良老师的书《数据库管理系统——从基本原理到系统构建》作为教材,自底而上讲述元组存储、磁盘块、文件存储方式。最后以GaussDB为例,讲述了商用数据库中元组、磁盘块、文件存储方式。讲座面向2024数据库管理系统设计赛的同学。课件和视频链接: https://pan.baidu.com/s/121W3KFQ9apljdA_8AbXeVg?pwd=dr8h 提取码: dr8h
-
我们以清华大学李国良老师的书《数据库管理系统——从基本原理到系统构建》作为教材,讲述 GaussDB 数据库中 SQL 查询执行的算法。包含一元运算符:投影、选择。二元运算符:关系交、并、连接。算法的趟数:一趟算法、两趟算法。以 GaussDB为实践环节,利用 Explain 命令查看执行计划,了解这些算法。链接: https://pan.baidu.com/s/1Ni87TEWX8Hy8Hm6piyGVWw?pwd=s8ez 提取码: s8ez
-
以 GaussDB 为实践环境,以社交网络为应用背景,设计了 26 道 SQL 供学生练习。题目分为简单、思考和挑战。同学们尝试利用结对编程解决一些难度较大的 SQL。其次利用 IDEA,开发相应的应用,实现数据库的连接、动态 SQL 的绑定。学生掌握利用Navicat连接数据库的方法,SQL 中大写字母的处理。发现arm 版的驱动支持 MAC M1 芯片。详细内容见链接: https://pan.baidu.com/s/1EHIZDJ7BJcH8hr42lXt7KQ?pwd=tkmp 提取码: tkmp。
-
CMU数据库的第1讲介绍了数据库中的连接算法,本次讲座详细讲述数据库中块连接算法、排序归并连接、Hash连接。以 GaussDB 为实践环节,编写了随机生成字符串、时间戳的函数,向 Wechat 数据库中 Userinfo 表中插入100 条记录,10000 条记录,分析 SQL 语句的查询计划。创建单字段索引,组合索引,分析不同的 SQL 语句的查询计划。同一个 SQL 不同的条件,查询计划也不相同。详细的课件见链接: https://pan.baidu.com/s/1XnBDAyQibIrjppoHo0hLOQ?pwd=va2b 提取码: va2b。
-
gsql中是否能设置查询表的字段宽度? 类似与Oracle中的 col的方式
-
GaussDB支持自定义聚合函数能在分布式版本运行吗
-
序号标题1GaussDB技术解读——GaussDB架构介绍(一)2GaussDB技术解读——GaussDB架构介绍(二)3GaussDB技术解读——GaussDB架构介绍(三)4GaussDB技术解读——GaussDB架构介绍(四)5GaussDB技术解读——GaussDB架构介绍(五)6GaussDB关键技术原理:高性能(一)7 GaussDB关键技术原理:高性能(二)8GaussDB关键技术原理:高性能(三)9GaussDB关键技术原理:高性能(四)10GaussDB关键技术原理:高性能(五)11GaussDB关键技术原理|高可用:DCF&双集群容灾12GaussDB关键技术原理|高可用:逻辑复制13GaussDB关键技术原理|高可用:两地三中心跨Region容灾14GaussDB关键技术原理:高弹性(一)15GaussDB关键技术原理:高弹性(二)16GaussDB关键技术原理:高弹性(三)17GaussDB关键技术原理:高弹性(四)18GaussDB关键技术原理:高弹性(五)19GaussDB关键技术原理:高弹性(六)20GaussDB高智能--数据库智能化发展史&自治运维技术21GaussDB高智能--自治运维技术(中)
Gauss松鼠会小助手2
发表于2024-07-01 17:01:33
2024-07-01 17:01:33
最后回复
yd_271020326
2025-05-28 15:57:07
1869 7 -
GaussDB关键技术原理:高性能(二)从查询处理综述对GaussDB的高性能技术进行了解读,本篇将从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行分享。3 高性能关键技术 内容概要:本章节介绍GaussDB中实现的高性能关键技术,内容涉及优化器、执行器、分布式数据库、存储引擎等多个方面。 目的:通过对GaussDB数据库关键高性能技术的学习,能够让读者更加清晰的理解数据库内核哪些优化是性能关键点同时也为类似的应用系统实现提供方法论和最佳实践。 3.1 查询重写RBO 在数据库里RBO基于规则的优化一般指查询重写技术,按照一系列关系代数表达式的等价规则,对查询的关系代数表达式进行等价转换,从逻辑上减少执行的总量从而提高查询执行效率,例如,通过条件的推导得出非必要的表扫描、避免非必要的计算表示等。 查询重写RBO优化是非常重要的一种逻辑优化手段,通常应用和实施在查询优化过程的前端,将一些肯定能够优化的场景进行优化,RBO优化结束后进行物理优化,以下以常用的几种重写优化进行介绍: Example 1:谓词化简优化Predicate Simplification 使用谓词查询条件的可满足性Satisfiability (SAT)&可传递性Transitive Closure(TC)对查询进行化简,a.w.k SAT-TC,假设有t1,t2表,他们的定义分别为:T1(c1 int, c2 int);,T2(c1 int, c2 int check (c2 < 30));,则原查询: SELECT t1.c1,t1.c2, t2.c1, t2.c2FROM t1 JOIN t2 ON t1.c2 = t2.c2WHERE t1.c2 > 20可优化为:SELECT dt1.c1,dt1.c2, dt2.c1, dt2.c2FROM (select c1,c2 from t1 where t1.c2 between 20 and 30) as dt1,(select c1,c2 from t2 where t2.c2 between 20 and 30) as dt2WHERE dt1.c2 = dt2.c2;说明:通过谓词逻辑可以发现当前查询中可以一次实施TC->SAT->TC优化策略。 step1: TC优化:内连接关联条件t1.c2 = t2.c2 && t1.c2 > 20可以得出t2.c2 > 20 step2: SAT优化:t2.c2列上创建有check-constraint可以得出t2.c2 BETWEEN 20 AND 30 step3: TC优化:同理得出t1.c2 BETWEEN 20 AND 30 到此t1,t2在关联之前就可以最大限度减小处理的元组数,达到提升性能的目的,以下是其他SATTC例子: ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 说明:通过谓词逻辑可以发现当前查询中可以一次实施TC->SAT->TC优化策略。 step1: TC优化:内连接关联条件t1.c2 = t2.c2 && t1.c2 > 20可以得出t2.c2 > 20 step2: SAT优化:t2.c2列上创建有check-constraint可以得出t2.c2 BETWEEN 20 AND 30 step3: TC优化:同理得出t1.c2 BETWEEN 20 AND 30 到此t1,t2在关联之前就可以最大限度减小处理的元组数,达到提升性能的目的,以下是其他SATTC例子: ———————————————— 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 说明:通过谓词逻辑可以发现当前查询中可以一次实施TC->SAT->TC优化策略。 step1: TC优化:内连接关联条件t1.c2 = t2.c2 && t1.c2 > 20可以得出t2.c2 > 20 step2: SAT优化:t2.c2列上创建有check-constraint可以得出t2.c2 BETWEEN 20 AND 30 step3: TC优化:同理得出t1.c2 BETWEEN 20 AND 30 说明:通过谓词逻辑可以发现当前查询中可以一次实施TC->SAT->TC优化策略。 step1: TC优化:内连接关联条件t1.c2 = t2.c2 && t1.c2 > 20可以得出t2.c2 > 20 step2: SAT优化:t2.c2列上创建有check-constraint可以得出t2.c2 BETWEEN 20 AND 30 step3: TC优化:同理得出t1.c2 BETWEEN 20 AND 30 到此t1,t2在关联之前就可以最大限度减小处理的元组数,达到提升性能的目的,以下是其他SATTC例子: A=B AND A=C --> B=CA=5 AND A=B --> B=5A=5 AND A IS NULL --> FALSEA=5 AND A IS NOT NULL --> A=5X > 1 AND Y > X --> Y >= 3X IN (1,2,3) AND Y=X --> Y IN (1,2,3)Example 2:谓词下推优化Predicate Push Down将谓词查询条件下沉到中间结果集的最底层提前过滤,可以有效减少读入到内存中数据的数量,减少计算层的代价优化前:SELECT MAX(total)FROM (SELECT product_key, product_name,SUM(quantity*amount) AS totalFROM Sales, ProductWHERE sales_product_key=product_keyGROUP BY product_key, product_name) AS vWHERE product_key IN (10, 20, 30);优化后:SELECT MAX(total)FROM (SELECT product_key, product_name,SUM(quantity*amount) AS totalFROM Sales, ProductWHERE sales_product_key=product_key AND product_key IN (10, 20, 30)GROUP BY product_key, product_name) AS vWHERE product_key IN (10, 20, 30);说明: 查询在优化前需要事先将中间结果集v计算出。 在计算的过程中需要对sales、product两张表的全量数据进行读取进行,然后对结果集进行Group分组、Aggregation聚合操作,但是最终的结果集只要求输出product_key的值为10,20,30的结果集。 利用谓词下推规则可以让product_key in(10,20,30)过滤操作在Join之前完成,如果查询条件product_key in(10,20,30)的选择率较低则可以减少Join、Aggregation、Group三个操作处理的数据量,从而提升性能。 Example 3:谓词上移优化Predicate Pullup 将谓词查询条件中比较繁重的函数计算放到最后,期望减小繁重计算的次数达到提升性能的目的。 优化前: SELECT *FROM t1,(SELECT * FROM t2WHERE complex_func(t2.c2) = 3) AS dt(c1,c2,c3)WHERE t1.c1 = t2.c1 AND t1.c2 > 30优化后:SELECT *FROM t1,(SELECT * FROM t2) AS dt(c1,c2,c3)WHERE t1.c1 = t2.c1 AND t1.c2 > 30 AND complex_func(t2.c2) = 3说明: 原查询“complex_func(t2.c2) = 3”查询条件在子查询中,如果该条件在子查询DT中被计算则会导致t2表中的全量数据被计算开销较大。 通过谓词pullup上移到最外层让t2先和t1做关联和过滤,则能够有效减少complex_func被调用的次数,从而达到性能提升的目的。 查询重写是查询优化器阶主要分类之一,通常可以快速将处理的数据进行成倍数缩减,下图是常见的查询重写分类 3.2 物理优化CBO 在优化器处理完RBO的优化以后,路径的选择往往不能通过实现制定好的规则进行变换,而是需要根据数据的分布(统计信息)情况来对查询执行路径进行评估,从可选的路径中选择一个执行代价最小的路劲进行执行,例如是否选择索引SeqScan vs. IndexScan、选择哪个索引,两表关联选择什么样的连接顺序,选择怎样的具体算法等,因此,可以将物理优化总结为对多个可行的物理执行代价进行评估,选择最优的计划输出到执行器进行执行,例如有以下查询: select * from t1 join t2 on t1.a=t2.b;可选择的计划有:如上图所示,根据T1、T2可访问的执行路径:IndexScan vs. SeqScan,关联算法:HashJoin、MergeJoin、NestLoop;关联内表外表等多个维度的选择,就会生成多达数十种不同的执行计划,由于考虑到T1、T2的表大小,谓词的选择率、是否有索引等因素很难从一个固定的规则里选出一个合理的执行计划,此时需要对T1、T2表的数据特征进行建模,构建代价模型从而选出最优的计划,这个过程按照处理的顺序大体上可以分为:统计信息、行数估算、代价估算、路径搜索、计划生成五个处理步骤: (1)统计信息,物理优化的依据来源于表信息的统计, 描述基表数据的特征包括唯一值、MCV值等,用于行数估算。 (2)行数估算,代价估算的基础,来源于基表统计信息的推算,估算基表baserel、Join中间结果集joinrel、Aggregation中结果集大小,为代价估算做准备。 (3)代价估算,根据关系的行数,推算出当前算子的执行代价,根据数据量估算不同算子执行代价,各算子代价之和即为计划总代价。 (4)路径搜索,依据若干算子的执行代价对最优路径进行路径搜索,通过求解路径最优算法(e.g. 动态规划、遗传算法)处理连接路径搜索过程,以最小搜索空间找到最优连接路径。 (5)计划生成,将查询的执行路径转换成PlanTree能够输出给执行器做查询执行,在分布式场景下根据数据分布的属性决定Data-Shuffling数据迁移总体方案。 3.3 分布式优化器 分布式数据库场景下表分布在各个节点上,数据的本地性Data Locality是分布式优化器中生成执行计划时重点考虑的因素,基于Share Nothing的分布式数据库中有一个很关键概念就是“移动数据不如移动计算”,之所以有数据本地性就是因为数据在网络中传输会有不小的I/O消耗,网络的overhead通常情况下会大于本地的计算,因此分布式数据库优化的一个重要的原则就是尽量减少这个网络I/O消耗就能够提升效率。例如有以下例子一个聚集查询的例子: 表信息:- T1: distribute By HASH(c1)执行查询:- select sum(c1), c2 from t1 group by c2由于表T1的分布列为c1但实际上要按照c2为键值进行聚集,对聚集列进行重分布是不可避免的一步操作,因此先做聚集还是先做数据迁移重分布就成为分布式优化器的一个选项,针对这一情况可以有以下两种分布式执行计划选择:说明: (1)执行计划A未考虑Data Locality的优化按照聚集的逻辑直接从扫描输出的100m元组进行重分布操作,造成大量的数据传输和网络资源消耗。 (2)执行计划B考虑Data Locality的优化,把AGG算子分解成2次AGG,其中第一次AGG在本地执行对原始数据进行缩减然后再通过网络重分布进入第二次AGG,虽说执行计划B相比A多了1个AGG算子,尽管计算的总量未发生变化但是节省了大量的网络IO操作,端到端提升了查询性能。 表关联也是类似的原理,如果当join列与分布列不一致时,需要网络stream节点算子对数据进行重分布或者复制确保查询执行的语义正确。 3.4 分布式执行框架 由于GaussDB采用的是无共享Shared-nothing的架构,由众多独立且互不共享CPU、内存、存储等系统资源的逻辑节点组成。在这样的系统架构中,业务数据被分散存储在多个物理节点上,数据分析任务会被推送到数据所在位置就近执行,通过控制模块的协调,并行地完成大规模的数据处理工作,实现对数据处理的快速响应。DN是基于本节点存储的数据执行具体的执行计划;DN之间可能会有数据交互,这个数据交互就通过分布式执行框架来完成。分布式框架主要靠网络通信算子Steram完成,Stream算子是分布式执行框架的核心元素,Stream算子主要有2个职责:(1)数据重分布(Data Shuffling):负责将单节点DataNode进程串联成为分布式集群的能力也就是通常理解的数据重分布,其他友商如GreemPlum的Motion节点,VectorWise的DXchg节点也具备类似的功能;(2)分布式流水线(Distribute Pipeline):将原有的分布式执行计划进行并行切分,即以Stream节点作为处理流水线分界由不同的工作线程完成,线程间以PV生产者消费者模式工作, 数据重分布(Data Shuffling) 针对当前GaussDB所支持的数据重分布机制上有3种工作模式: (1)Gather Stream(N:1)每个源节点都将其数据发送给目标节点,一般用于汇总DN节点到CN节点的过程。 (2)Redistribute Stream(M:N):M个DN节点将其数据根据关联条件、聚集分组表达式算出Hash值,根据重新计算的Hash值进行分布,发送数据到对应的目标节点。一般用于Join、Agg、NodeGroup中的重分布场景。(3)Broadcast Stream(1:N):有一个源节点将其数据发给N个目标节点。例如下图的分布式执行计划,由于不同的表分布属性不同,因此通过分布式执行框架Stream节点进行数据串联并执行,最后在CN节点进行结果集汇总。说明: (1)执行的过程中对T1、T2的扫描都在DN节点上并行完成。 (2)优化器生成的执行计划选择了前一节中描述的方案3,即T1保持不动复制T2到所有节点,并完成分布式HASHJOIN。 (3)HashJoin节点在所有节点上执行完成以后通过Gather节点在CN上进行结果集汇总。 分布式执行流水线(Distribution Pipeline) 在分布式执行过程中如果存在数据搬移,Stream算子的数据发送端、数据接收端有不同的线程完成,他们在时间分片上重叠以并行的方式执行,因此全局执行计划被网络通信算子Stream切分成多个计划片段,分别有不同的线程来完成执行,不同的线程之间采用PC生产者消费者进行交互通信,全局上达到并行执行的效果。如下图,实际的计划执行在DN这一层以Stream算子为界,被切分成多个线程并行处理。 3.5 轻量全局事务管理GTM-lite GTM,全称Global Transaction Manager,即全局事务管理器,负责全局事务号的分发,事务提交时间戳的分发以及全局事务运行状态的登记,作为事务管理中的重要模块,为支持事务一致性提供必要的保证。事务开始和提交时与GTM进行交互获取必要的全局事务信息,包括事务ID,全局时间戳,全局快照等等。与其他模块一个很重要的不同点就是,为了保证一致性和事务标识全局唯一,集群中只要一个主GTM,即只有一个GTM真正参与事务(不过GTM和DN一样是高可用的,支持一主多备或主备从)。使用GTM来进行事务管理,一个很重要的问题就是会出现单点瓶颈,因为所有需要获取事务唯一标识的事务都需要连接GTM,获取全局快照的时候也都需要连接GTM,在大并发的情况下频繁的交互导致大量的网络通信和锁等待,从而限制了集群性能。 在老的GTM模式下,虽然通过将活跃事务链表替换为CSN来减少了通信量,但是由于仍采用全局事务id的策略,所以每个活跃事务仍要在GTM注册槽位,GTM负责管理和分发全局事务id,这导致当并发量大的时候,GTM容易成为单点瓶颈,主要体现在以下两个方面: (1)在一个事务的执行流程中,CN会与GTM进行多次交互,如事务开始时在GTM注册槽位、获取快照时从GTM获取全局事务id、事务结束时向GTM提交并移除槽位等,这些频繁的交互会带来大量的网络通信和等待; (2)当并发量超过槽位数限制时,会由于槽位不够影响业务正常进行。 由此可见,其影响性能的主要原因在于GTM的协调太强,通过对全局事务id的管控,虽然保证了事务的一致性,但是也限制了事务处理的效率。与GTM模式相反,GTM-FREE模式下CN/DN不与GTM交互,通过CN/DN分别维护本地事务id来保证事务系统的正常运行。这种模式下由于缺少全局事务id以及GTM的其他协调(CSN),事务的一致性会受到影响,从而限制了这种模式的适用范围。综上,现有的两种模式在效率和一致性要求上并没有达到一个很好的平衡,而影响这种平衡的主要因素在与“协调”,协调带来更多一致性的保障,但是却降低了性能。由此,一个好的模式应该是在尽可能少的协调的情况下,达到尽可能高的性能,这也是本章介绍的GTM-LITE模式 GTM-LITE的主要目标就是在消除GTM瓶颈影响的同时,尽可能通过更少的信息交互,利用它来协调好事务的并发,从而保证事务一致性的同时提升性能。为此,GTM-LITE的主要设计思路包含以下4点: (1)本地事务id取代全局事务id。GTM不再分配全局唯一的事务id,每个CN/DN节点用本地产生的事务id,保证节点内事务id不会重复;对于跨节点的事务,由全局唯一的gid标识符前缀来保证写一致性,由全局唯一的csn号来保证事务读的一致性。 (2)GTM不再维护槽位信息,仅在事务提交时下发全局唯一的csn序列号。GTM下发的全局csn是一个递增的uint64值。这一设计消除了BEGIN, GetNewTransactionId同GTM的交互。进一步,如果事务在GTM提交时失败,可以retry重新获取最新的csn,减少网络故障对系统造成的影响。 (3)本地维护多版本过期脏元组的回收,并引入Snapshot Invalid机制,保证全局事务的一致性。由于舍弃全局事务id,无法直接根据RecentGlobalXmin确定需要清理的脏元组,所以需要利用全局csn来计算RecentGlobalXmin,从而实现GTM架构代码的有效复用。 (4)引入prepared array链表对单节点事务可见性判断进行优化。对于单节点的读事务,不再向GTM申请快照,而是使用本地的快照+prepared array链表来进行可见性判断,这种方式在保证读外部一致性的前提下,尽可能的减少同GTM的交互。基本判断方法为:对于csn<本地快照csn的事务以及本地prepared(在prepared array中)且最终提交的事务,均可见。 以上内容从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术的进行了分享,下篇将从USTORE存储引擎、计划缓存计划技术、数据分区与分区剪枝、列式存储和向量化引擎、SMP并行执行等方面继续解读高性能关键技术,敬请期待!
-
序号网址标题1https://bbs.huaweicloud.com/forum/thread-0235152777783711058-1-1.htmlGaussDB数据库如何创建修改数据库和数据表2https://bbs.huaweicloud.com/forum/thread-0235152777783711058-1-1.htmlGaussDB数据库如何创建修改数据库和数据表3https://bbs.huaweicloud.com/forum/thread-0272151812820406012-1-1.htmlGaussDB数据库的元数据及其管理简介4https://bbs.huaweicloud.com/forum/thread-02109151812652385008-1-1.htmlGaussDB的行存表与列存表的选择5https://bbs.huaweicloud.com/forum/thread-0299151812618135019-1-1.htmlGaussDB云数据库配套工具UGO6https://bbs.huaweicloud.com/forum/thread-02120151812519215014-1-1.htmlGaussDB OLTP 云数据库配套工具DAS7https://bbs.huaweicloud.com/forum/thread-02109151812463028007-1-1.htmlGaussDB OLTP云数据库配套工具DRS8https://bbs.huaweicloud.com/forum/thread-02119151812405488013-1-1.htmlGaussDB OLTP云数据库配套工具DDM9https://bbs.huaweicloud.com/forum/thread-0236151812356015011-1-1.html数据库模型设计案例分享(GaussDB版)10https://bbs.huaweicloud.com/forum/thread-02106149253127739038-1-1.htmlGaussDB 常用语法总结【操作指导集合】11https://bbs.huaweicloud.com/forum/thread-02107149218966585035-1-1.htmlGaussDB数据库SQL系列-聚合函数12https://bbs.huaweicloud.com/forum/thread-02106149217197091032-1-1.html由数据插入超长引起的问题——了解GaussDB和openGauss的字符集13https://bbs.huaweicloud.com/forum/thread-0235152777783711058-1-1.htmlGaussDB数据库如何创建修改数据库和数据表14https://bbs.huaweicloud.com/forum/thread-0272151812820406012-1-1.htmlGaussDB数据库的元数据及其管理简介15https://bbs.huaweicloud.com/forum/thread-02109151812652385008-1-1.htmlGaussDB的行存表与列存表的选择16https://bbs.huaweicloud.com/forum/thread-0299151812618135019-1-1.htmlGaussDB云数据库配套工具UGO17https://bbs.huaweicloud.com/forum/thread-02120151812519215014-1-1.htmlGaussDB OLTP 云数据库配套工具DAS18https://bbs.huaweicloud.com/forum/thread-02109151812463028007-1-1.htmlGaussDB OLTP云数据库配套工具DRS19https://bbs.huaweicloud.com/forum/thread-02119151812405488013-1-1.htmlGaussDB OLTP云数据库配套工具DDM20https://bbs.huaweicloud.com/forum/thread-0236151812356015011-1-1.html数据库模型设计案例分享(GaussDB版)21https://bbs.huaweicloud.com/forum/thread-02106149253127739038-1-1.htmlGaussDB 常用语法总结【操作指导集合】22https://bbs.huaweicloud.com/forum/thread-02107149218966585035-1-1.htmlGaussDB数据库SQL系列-聚合函数23https://bbs.huaweicloud.com/forum/thread-02106149217197091032-1-1.html由数据插入超长引起的问题——了解GaussDB和openGauss的字符集24https://bbs.huaweicloud.com/forum/thread-0297146799368478025-1-1.htmlGaussDB WDR分析之集群报告篇25https://bbs.huaweicloud.com/forum/thread-0231145158414495004-1-1.html利用GaussDB的可观测性能力构建故障模型26https://bbs.huaweicloud.com/forum/thread-0235152777783711058-1-1.htmlGaussDB数据库如何创建修改数据库和数据表27https://bbs.huaweicloud.com/forum/thread-0272151812820406012-1-1.htmlGaussDB数据库的元数据及其管理简介28https://bbs.huaweicloud.com/forum/thread-02109151812652385008-1-1.htmlGaussDB的行存表与列存表的选择29https://bbs.huaweicloud.com/forum/thread-0299151812618135019-1-1.htmlGaussDB云数据库配套工具UGO30https://bbs.huaweicloud.com/forum/thread-02120151812519215014-1-1.htmlGaussDB OLTP 云数据库配套工具DAS31https://bbs.huaweicloud.com/forum/thread-02109151812463028007-1-1.htmlGaussDB OLTP云数据库配套工具DRS32https://bbs.huaweicloud.com/forum/thread-02119151812405488013-1-1.htmlGaussDB OLTP云数据库配套工具DDM33https://bbs.huaweicloud.com/forum/thread-0236151812356015011-1-1.html数据库模型设计案例分享(GaussDB版)34https://bbs.huaweicloud.com/forum/thread-02106149253127739038-1-1.htmlGaussDB 常用语法总结【操作指导集合】35https://bbs.huaweicloud.com/forum/thread-02107149218966585035-1-1.htmlGaussDB数据库SQL系列-聚合函数36https://bbs.huaweicloud.com/forum/thread-02106149217197091032-1-1.html由数据插入超长引起的问题——了解GaussDB和openGauss的字符集37https://bbs.huaweicloud.com/forum/thread-0297146799368478025-1-1.htmlGaussDB WDR分析之集群报告篇38https://bbs.huaweicloud.com/forum/thread-0231145158414495004-1-1.html利用GaussDB的可观测性能力构建故障模型39https://bbs.huaweicloud.com/forum/thread-0284144599249246009-1-1.htmlGaussDBAPI概览40https://bbs.huaweicloud.com/forum/thread-0202142095354960004-1-1.htmlGaussDB数据库:创建高性能索引
-
数据库结构:两者都支持SQL语言和ACID事务,具有相似的数据库结构,包括表、视图、存储过程、触发器等。 开源:两者都是开源软件,均可以免费使用和修改。 数据库安全:两者都提供了安全控制机制,包括用户权限控制、数据加密等。 数据备份和恢复:两者都支持数据备份和恢复,可以保证数据的可靠性和完整性。 但是,GaussDB和Postgres也存在一些不同之处: 数据库架构:GaussDB采用分布式架构,可以支持海量数据存储和高并发访问,而Postgres采用单机架构。 数据库性能:GaussDB具有更高的性能和扩展性,可以支持更大规模的数据处理和更高的并发访问。 数据库功能:GaussDB具有更多的高级功能,如在线数据迁移、在线扩容等,而Postgres则更加注重数据完整性和数据安全性。 总之,GaussDB和Postgres都是优秀的数据库管理系统,可以根据实际需求选择使用。如果需要处理海量数据和高并发访问,可以考虑使用GaussDB
-
GaussDB分布式和主备的区别主要在于数据的存储和管理方式以及系统的可用性。 数据存储和管理方式:在主备模式下,数据只存储在主节点上,备节点只是主节点的备份,主节点负责处理所有的数据读写请求,备节点只有在主节点出现故障时才会接管主节点的工作。而在分布式模式下,数据被分成多个分片,存储在不同的节点上,每个节点都可以处理部分数据的读写请求,数据的管理更为分散和灵活。 系统可用性:在主备模式下,当主节点出现故障时,备节点需要接管主节点的工作,但是这个过程需要一定的时间,系统在这段时间内是不可用的。而在分布式模式下,即使某个节点出现故障,其他节点仍然可以处理数据的读写请求,系统的可用性更高。 总的来说,主备模式更适合对数据一致性要求较高、对系统可用性要求相对较低的场景,而分布式模式更适合对系统可用性和数据处理能力要求较高的场景。
-
一、前言SQL是用于访问和处理数据库的标准计算机语言。GaussDB支持SQL标准(默认支持SQL2、SQL3和SQL4的主要特性)。本系列将以《云数据库GaussDB—SQL参考》在线文档为主线进行介绍。GOTO 语句是直观基本的控制流语句,会导致控制流发生无条件更改。它用于分流至使用 SQL 过程中定义的标签的特定用户定义位置。使用 GOTO 语句通常被视为缺乏编程技巧,并且不推荐这样做。大量使用 GOTO 会导致代码可读性不好,特别是在过程变长时。此外,因为有更好的语句可用于控制执行路径,所以 GOTO 并非必需。没有需要使用 GOTO 的特定情况;使用它通常只是为了方便。二、在GaussDB数据库中的概念及语法1、基本概念GOTO语句是一种控制语句,它用于无条件地将程序的执行跳转到指定的位置。在GaussDB数据库的SQL实现中,GOTO语句通常被用于存储过程和触发器等数据库对象中,以实现复杂的逻辑控制。GOTO语句可以实现从GOTO位置到目标语句的无条件跳转。GOTO语句会改变原本的执行逻辑,因此应该慎重使用。当执行GOTO语句时,目标Label必须是唯一的。2、语法BEGIN--some code hereIF condition THENGOTO label;END IF;-- some code hereGOTO label;<<label>>-- code to jump toEND;/三、在GaussDB数据库中的基础示例和限制场景说明1、基础示例创建一个函数,在满足一定条件时,通过GOTO语句进行跳转。CREATE OR REPLACE FUNCTION proc_goto(i in integer,j in integer)RETURNS TEXTLANGUAGE plpgsqlAS $$BEGINLOOPINSERT INTO test_1(id,date) VALUES(i,current_date) ;i := i+1;IF i=j THENGOTO label;END IF;END LOOP;<<label>>INSERT INTO test_1(id,date) VALUES(i,'3000-12-31') ;RETURN 'succeed';END $$;CALL proc_goto(1,5);select * from test_1;2、限制场景说明GOTO使用有以下限制场景:1、不支持有多个相同的GOTO labels目标场景,无论是否在同一个block中。BEGINGOTO label 1;<< label 1>>SELECT * FROM ...<< label 1>>UPDATE t1 SET ...END;2、不支持GOTO跳转到IF语句,CASE语句,LOOP语句中。BEGINGOTO label 1;IF valid THEN<< label 1>>SELECT * FROM ...END IF;END;3、不支持GOTO语句从一个IF子句跳转到另一个IF子句,或从一个CASE语句的WHEN子句跳转到另一个WHEN子句。BEGINIF valid THENGOTO label 1;SELECT * FROM ...ELSE<< label 1>>UPDATE t1 SET ...END IF;END;4、不支持从外部块跳转到内部的BEGIN-END块,即禁止从外层跳转到内层。BEGINGOTO label 1;BEGIN<< label 1>>UPDATE t1 SET ...END;END;5、不支持从异常处理部分跳转到当前的BEGIN-END块。但可以跳转到上层BEGIN-END块。BEGIN<< label 1>>UPDATE t1 SET ...EXCEPTIONWHEN condition THENGOTO label 1;END;6、如果从GOTO到一个不包含执行语句的位置,需要添加NULL语句。DECLAREdone BOOLEAN;BEGINFOR i IN 1..50 LOOPIF done THENGOTO end_loop;END IF;<<end_loop>>NULL;END LOOP;END;/四、小结在本文中,我们介绍了GOTO语句在云数据库GaussDB SQL中的使用特点,通过一系列的示例,可以更好地组织代码,避免一些不必要的计算和操作,从而提高SQL语句的执行效率。 但同时需要注意的是,GOTO语句虽然可以用于实现复杂的逻辑控制,但也容易导致代码的可读性降低和维护困难。因此,在实际开发中,应该根据具体情况慎重使用GOTO语句。——结束
-
为什么需要每次执行source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile命令启动环境变量。直接写到.bashrc文件里面不行吗?有什么影响和弊端?
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第三期2026/08/21 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;念擎-华为云AI开发者运营案例开发专家
本期直播内容:AI六层能力首次详细解读 + 新一代华为云开发者空间亮相 + 校园案例直播带练
回顾中 -
华为云开发者AI素养直播课·第四期2026/08/28 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;吴松明-华为云AI开发者案例开发专家
EduSwarm 是一个基于多智能体框架构建的 AI 教师团队协作平台:把备课、上课、作业、批改、学情等教学环节,交给多位专职 AI Agent(课件师、出题官、批改师、学情分析师等)协作完成。教师从「亲力亲为」变成「做决策」,学生只需凭课堂码加入即可实时跟课。
正在直播
热门标签