-
高斯数据库接入项目快速入门安装与启动首先,访问高斯数据库的官方网站 https://www.gaussdb.com/ ,下载对应的安装包。将下载的压缩包解压到一个目录,如/opt/gaussdb。然后,进入解压后的目录,执行启动命令:./bin/gs_ctl start -D . 这里需要注意的是,高斯数据库不能以root用户运行,需要切换到非root用户进行操作。同时,高斯数据库默认的系统数据库是postgres,而非gauss。数据库与表的管理使用psql命令行工具连接到高斯数据库psql -h localhost -p 5432 -U postgres 接下来,可以创建数据库和表。例如,创建一个名为testdb的数据库:CREATE DATABASE testdb; 切换到testdb数据库后,创建一个名为users的表:CREATE TABLE users( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, age INTEGER NOT NULL );数据操作向users表中插入一条数据:INSERT INTO users(name, age) VALUES('张三', 25); 查询users表中的所有数据:SELECT * FROM users; Java项目中使用高斯数据库在Java项目中,可以通过添加高斯数据库的JDBC驱动依赖来使用高斯数据库。在项目的pom.xml文件中添加以下依赖:<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.23</version> </dependency> 然后,编写Java代码连接高斯数据库并执行查询。例如:import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class GaussDBDemo { public static void main(String[] args) { String url = "jdbc:postgresql://localhost:5432/testdb"; String user = "postgres"; String password = "your_password"; try { Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(url, user, password); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM users"); while (resultSet.next()) { System.out.println("ID: " + resultSet.getInt("id") + ", Name: " + resultSet.getString("name") + ", Age: " + resultSet.getInt("age")); } resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } SQL语法与兼容性高斯数据库在SQL语句语法上与Oracle和MySQL有许多相似之处,但也存在一些差异。例如,在数据类型上,高斯数据库支持大多数Oracle的数据类型,但在某些特定的数据类型上可能会有细微的差别。此外,高斯数据库兼容了大部分Oracle的函数和操作符,但在某些特定的函数和操作符上可能需要使用不同的语法或者替代方案。值得注意的是,高斯数据库支持PL/SQL语法,允许用户创建UDF函数、存储过程或执行程序块。但在某些复杂的PL/SQL特性上可能需要进行调整。同时,可以通过设置数据库的兼容性模式来模拟Oracle的行为。与MySQL相比,高斯数据库在数据类型和字符类型支持上也有所不同。例如,高斯数据库没有像MySQL一样的text类型的文本格式,但当字符超过8000时,高斯数据库提供了clob类型来存储大文本数据。
-
虚拟机中轻量化部署GaussDB安装TPOPS平台最后阶段,SFTP 安装失败,如下图所示:查看install.log日志报错部署手册上未给出高错误的解决方法,求助各位技术大佬支支招
-
优化在进行MySQL的优化之前,必须要了解的就是MySQL的查询过程,很多查询优化工作实际上就是遵循一些原则,让MySQL的优化器能够按照预想的合理方式运行而已。注:优化有风险,涉足需谨慎 优化可能带来的问题?优化不总是对一个单纯的环境进行,还很可能是一个复杂的已投产的系统;优化手段本来就有很大的风险,只不过你没能力意识到和预见到;任何的技术可以解决一个问题,但必然存在带来一个问题的风险;对于优化来说解决问题而带来的问题,控制在可接受的范围内才是有成果;保持现状或出现更差的情况都是失败!优化的需求?稳定性和业务可持续性,通常比性能更重要;优化不可避免涉及到变更,变更就有风险;优化使性能变好,维持和变差是等概率事件;切记优化,应该是各部门协同,共同参与的工作,任何单一部门都不能对数据库进行优化!所以优化工作,是由业务需要驱使的! 优化什么?在数据库优化上有两个主要方面:即安全与性能。安全->数据可持续性;性能->数据的高性能访问。 优化的范围有哪些?存储、主机和操作系统方面:主机架构稳定性;I/O规划及配置;Swap交换分区;OS内核参数和网络问题。应用程序方面:应用程序稳定性;SQL语句性能;串行访问资源;性能欠佳会话管理;这个应用适不适合用MySQL。数据库优化方面:内存;数据库结构(物理&逻辑);实例配置。不管是设计系统、定位问题还是优化,都可以按照这个顺序执行。 优化维度数据库优化维度有四个:硬件、系统配置、数据库表结构、SQL及索引。 优化选择:优化成本:硬件>系统配置>数据库表结构>SQL及索引。优化效果:硬件<系统配置<数据库表结构<SQL及索引。 优化思路定位问题点吮吸:硬件-->系统-->应用-->数据库-->架构(高可用、读写分离、分库分表)。处理方向:明确优化目标、性能和安全的折中、防患未然。 硬件优化主机方面:根据数据库类型,主机CPU选择、内存容量选择、磁盘选择:平衡内存和磁盘资源;随机的I/O和顺序的I/O;主机 RAID卡的BBU(Battery Backup Unit)关闭。 CPU的选择:CPU的两个关键因素:核数、主频根据不同的业务类型进行选择:CPU密集型:计算比较多,OLTP - 主频很高的cpu、核数还要多IO密集型:查询比较,OLAP - 核数要多,主频不一定高的 内存的选择:OLAP类型数据库,需要更多内存,和数据获取量级有关。OLTP类型数据一般内存是Cpu核心数量的2倍到4倍,没有最佳实践。 存储方面:根据存储数据种类的不同,选择不同的存储设备;配置合理的RAID级别(raid5、raid10、热备盘);对与操作系统来讲,不需要太特殊的选择,最好做好冗余(raid1)(ssd、sas、sata)。raid卡:主机raid卡选择:实现操作系统磁盘的冗余(raid1);平衡内存和磁盘资源;随机的I/O和顺序的I/O;主机raid卡的BBU(Battery Backup Unit)要关闭。 网络设备方面使用流量支持更高的网络设备(交换机、路由器、网线、网卡、HBA卡)注意:以上这些规划应该在初始设计系统时就应该考虑好。 服务器硬件优化自带管理设备:远程控制卡(FENCE设备:ipmi ilo idarc)、开关机、硬件监控。第三方的监控软件、设备(snmp、agent)对物理设施进行监控。存储设备:自带的监控平台。EMC2(hp收购了)、 日立(hds)、IBM低端OEM hds、高端存储是自己技术,华为存储。系统优化CPU:基本不需要调整,在硬件选择方面下功夫即可。 内存:基本不需要调整,在硬件选择方面下功夫即可。 SWAP:MySQL尽量避免使用swap。阿里云的服务器中默认swap为0。 IO :raid、no lvm、ext4或xfs、ssd、IO调度策略。 Swap调整(不使用swap分区)/proc/sys/vm/swappiness的内容改成0(临时),/etc/sysctl. conf上添加vm.swappiness=0(永久)这个参数决定了Linux是倾向于使用swap,还是倾向于释放文件系统cache。在内存紧张的情况下,数值越低越倾向于释放文件系统cache。当然,这个参数只能减少使用swap的概率,并不能避免Linux使用swap。 数据库优化按方向分类:SQL优化方向:执行计划、索引、SQL改写。架构优化方向:高可用架构、高性能架构、分库分表。按照分类设计:存储引擎,字段类型,范式与逆范式功能:索引,缓存,分区分表。架构:主从复制,读写分离,负载均衡。合理SQL:测试,经验。 数据库参数优化调整实例整体(高级优化,扩展):thread_concurrency:# 并发线程数量个数sort_buffer_size:# 排序缓存read_buffer_size:# 顺序读取缓存read_rnd_buffer_size:# 随机读取缓存key_buffer_size:# 索引缓存thread_cache_size:# (1G—>8, 2G—>16, 3G—>32, >3G—>64) 连接层(基础优化)设置合理的连接客户和连接方式:max_connections # 最大连接数,看交易笔数设置 max_connect_errors # 最大错误连接数,能大则大connect_timeout # 连接超时max_user_connections # 最大用户连接数skip-name-resolve # 跳过域名解析wait_timeout # 等待超时back_log # 可以在堆栈中的连接数量 SQL层(基础优化)query_cache_size:查询缓存 >>> OLAP类型数据库,需要重点加大此内存缓存,但是一般不会超过GB。对于经常被修改的数据,缓存会立马失效。我们可以实用内存数据库(redis、memecache),替代他的功能。 存储引擎层(innodb基础优化参数)default-storage-engineinnodb_buffer_pool_size # 没有固定大小,50%测试值,看看情况再微调。但是尽量设置不要超过物理内存70%innodb_file_per_table=(1,0)innodb_flush_log_at_trx_commit=(0,1,2) # 1是最安全的,0是性能最高,2折中binlog_syncInnodb_flush_method=(O_DIRECT, fdatasync)innodb_log_buffer_size # 100M以下innodb_log_file_size # 100M 以下innodb_log_files_in_group # 5个成员以下,一般2-3个够用(iblogfile0-N)innodb_max_dirty_pages_pct # 达到百分之75的时候刷写 内存脏页到磁盘。log_binmax_binlog_cache_size # 可以不设置max_binlog_size # 可以不设置innodb_additional_mem_pool_size #小于2G内存的机器,推荐值是20M。32G内存以上100M SQL优化1. 选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在将来执行查询的时候,数据库不用去比较NULL值。对于某些文本字段,例如“省份”或者“性别”,我们可以将它们定义为ENUM类型。因为在MySQL中,ENUM类型被当作数值型数据来处理,而数值型数据被处理起来的速度要比文本类型快得多。这样,我们又可以提高数据库的性能。2. 使用连接(JOIN)来代替子查询(Sub-Queries)MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT customerid FROM salesinfo)使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN)..替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成: SELECT * FROM customerinfo WHERE customerid NOT IN (SELECT customerid FROM salesinfo)如果使用连接(JOIN)..来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下: SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.customerid = salesinfo.customerid WHERE salesinfo.customerid IS NULL连接(JOIN)..之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。3. 使用联合(UNION)来代替手动创建的临时表MySQL从4.0的版本开始支持union查询,它可以把需要使用临时表的两条或更多的select查询合并的一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库整齐、高效。使用union来创建查询的时候,我们只需要用UNION作为关键字把多个select语句连接起来就可以了,要注意的是所有select语句中的字段数目要想同。下面的例子就演示了一个使用UNION的查询。 SELECT name,phone FROM client UNIONSELECT name,birthdate FROM author UNIONSELECT name,supplier FROM product4. 事务尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。BEGIN; INSERT INTO salesinfo SET customerid=14; UPDATE inventory SET quantity =11 WHERE item='book';COMMIT;事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。5. 锁定表尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独占性,有时会影响数据库的性能,尤其是在很大的应用系统中。由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,例如访问一个电子商务网站,就会产生比较严重的响应延迟。其实,有些情况下我们可以通过锁定表的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。 LOCK TABLE inventory WRITE SELECT quantity FROM inventory WHERE Item='book';...UPDATE inventory SET Quantity=11 WHERE Item='book';UNLOCKTABLES这里,我们用一个select语句取出初始数据,通过一些计算,用update语句将新值更新到表中。包含有WRITE关键字的LOCKTABLE语句可以保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对inventory进行插入、更新或者删除的操作。6. 使用外键锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候我们就可以使用外键。例如,外键可以保证每一条销售记录都指向某一个存在的客户。在这里,外键可以把customerinfo表中的customerid映射到salesinfo表中customerid,任何一条没有合法customerid的记录都不会被更新或插入到salesinfo中。CREATE TABLE customerinfo( customerid int primary key) engine = innodb;CREATE TABLE salesinfo( salesid int not null,customerid int not null, primary key(customerid,salesid),foreign key(customerid) references customerinfo(customerid) on delete cascade)engine = innodb;注意例子中的参数 「on delete cascade」。该参数保证当customerinfo表中的一条客户记录被删除的时候,salesinfo表中所有与该客户相关的记录也会被自动删除。如果要在MySQL中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表InnoDB类型。该类型不是MySQL表的默认类型。定义的方法是在CREATE TABLE语句中加上engine=INNODB。如例中所示。7. 使用索引索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。那该对哪些字段建立索引呢?一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况例如customerinfo中的“province”..字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTERTABLE或CREATEINDEX在以后创建索引。此外,MySQL从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引,但仅能用于MyISAM类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。8. 优化的查询语句绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。下面是应该注意的几个方面。首先,最好是在相同类型的字段间进行比较的操作在MySQL3.23版之前,这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较;但是作为特殊的情况,在CHAR类型的字段和VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。其次,在建有索引的字段上尽量不要使用函数进行操作例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的例如下面的查询将会比较表中的每一条记录。SELECT * FROM books WHERE name like "MySQL%"但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:SELECT * FROM books WHERE name >= "MySQL" and name <"MySQM"最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。
-
分布式数据库具备水平扩展、分布式存储提升性能、多节点复制保障高可用性等优势。然而,其性能优化面临数据倾斜、查询协调成本及索引分区策略权衡等挑战。通过合理设计分布策略和优化查询计划,可有效平衡一致性与性能。PawSQL将对分布式数据库性能优化与SQL审核进行重点支持,本文将从分布策略的获取展开讨论。1. 高斯表的分布策略 分布式高斯数据库(GaussDB)支持以下分布方式:HASH 分布: 基于某些列的哈希值进行分布。RANGE 分布: 按范围分布数据。REPLICATED 分布: 数据在每个节点上复制。RANDOM 分布: 数据随机分布。在高斯数据库(GaussDB)的分布式架构中,可以通过查询pgxc_class和其他相关系统表来查看表的分布信息。pgxc_class是一个系统表,用于存储表的分布相关信息。这是数据库分布策略的核心元数据表之一,定义了每个表在集群中的分布方式和相关属性。 2. pgxc_class 表定义以下是pgxc_class表的定义及其字段解释:\d pgxc_class输出以下内容:字段名数据类型pcrelidoidpclocatortypecharpcattnumint2[]nodeoidsoid[]字段解释pcrelid表示表的 OID(对象标识符),对应于pg_class.oid。用于连接pg_class获取表名(relname)等信息。pclocatortype,定义了表的分布策略'H'(HASH):基于分布列的哈希值分布到不同的节点。'R'(RANGE):按范围将数据分布到不同的节点。'C'(REPLICATED):数据完全复制到所有节点。'N'(RANDOM):数据随机分布到节点。pcattnum存储分布列的列号数组,每个列号对应pg_attribute.attnum。如果pclocatortype是 HASH 或 RANGE 分布,则此字段指示哪些列被用作分布键。nodeoids表存储的节点 OID 数组。每个 OID 对应一个节点,可以通过查询其他系统表(如pgxc_node)来解析节点信息。3. 查看分布式表的分布策略以下是查询表 `t` 的分布方式的 SQL:SELECT c.relname AS table_name, CASE WHEN x.pclocatortype = 'H' THEN 'HASH' WHEN x.pclocatortype = 'R' THEN 'RANGE' WHEN x.pclocatortype = 'C' THEN 'REPLICATED' WHEN x.pclocatortype = 'N' THEN 'RANDOM' ELSE 'UNKNOWN' END AS distribution_typeFROM pg_class cJOIN pgxc_class xON c.oid = x.pcrelidWHERE c.relname = 't';字段解释`pg_class`: 存储表和视图的基本信息,`relname` 是表名。`pgxc_class` : 存储表的分布相关信息。`pclocatortype`: 定义了表的分布策略, 取值如下'H'(HASH):基于分布列的哈希值分布到不同的节点。'R'(RANGE):按范围将数据分布到不同的节点。'C'(REPLICATED):数据完全复制到所有节点。'N'(RANDOM):数据随机分布到节点。4. 查询分布列如果表是 HASH 或 RANGE 分布,可以进一步查询具体的分布列:SELECT c.relname AS table_name, a.attname AS distribution_columnFROM pg_class cJOIN pgxc_class xON c.oid = x.pcrelidJOIN pg_attribute aON a.attrelid = c.oid AND a.attnum = ANY(x.pcattnum)WHERE c.relname = 't';字段解释`pg_attribute`: 存储列的信息,`attname` 是列名。`pcattnum`: 存储分布列的列号。5. 应用场景通过查询pgxc_class可以确定表的分布类型和分布列。在高斯数据库中,分布类型和列是分布式存储和性能优化的重要因素,尤其是 HASH 和 RANGE 分布,需要根据业务场景选择合适的分布方式。分布策略分析:通过查询pgxc_class,可以了解表的分布类型(如 HASH 或 RANGE)以及分布列是否合理,辅助优化数据分布。节点定位:结合nodeoids字段和pgxc_node,可以定位表数据所在的物理节点。分布调整:如果分布策略不合理,可以使用ALTER TABLE或重新建表的方式调整分布策略。🌟关于PawSQL PawSQL专注于数据库性能优化自动化和智能化,提供的解决方案覆盖SQL开发、测试、运维的整个流程,广泛支持MySQL、PostgreSQL、OpenGauss、Oracle等主流商用和开源数据库,以及openGauss,人大金仓、达梦等国产数据库,为开发者和企业提供一站式的创新SQL优化解决方案;有效解决了数据库SQL性能及质量问题,提升了数据库系统的稳定性、应用性能和基础设施利用率,为企业节省了大量的运维成本和时间投入。转载来源:PawSQL公众号
-
一、引言事务管理是数据库系统中至关重要的一部分,它确保了数据库的一致性和可靠性。在GaussDB数据库中,事务管理不仅遵循传统的ACID特性,还提供了一些高级功能。本文将深入探讨GaussDB数据库事务管理的各个方面。 二、事务的基本概念2.1 事务的定义事务是数据库操作的基本单元,它是一系列数据库操作组成的逻辑工作单元。事务要么完全执行,要么完全不执行,不会出现部分执行的情况。 2.2 事务的四个特性(ACID) 原子性(Atomicity):事务是一个不可分割的工作单元,要么全部执行成功,要么全部失败回滚,不存在部分执行的情况。 一致性(Consistency):事务执行前后,数据库从一个一致的状态转移到另一个一致的状态,保持数据的完整性。 隔离性(Isolation):并发执行的事务之间相互隔离,一个事务的执行不受其他事务的影响。 持久性(Durability):一旦事务提交,其对数据库的修改就是永久性的,即使系统崩溃也能够恢复。 三、GaussDB中的事务管理3.1 事务的开始与结束在GaussDB数据库中,使用BEGIN命令开始一个事务,使用COMMIT命令提交事务。如果出现错误或需要回滚事务,可以使用ROLLBACK命令。 3.2 事务的隔离级别 GaussDB支持多种事务隔离级别,包括READ COMMITTED、REPEATABLE READ和SERIALIZABLE。不同隔离级别提供不同的并发控制方式,开发人员可以根据具体业务需求进行选择。 -- 设置事务隔离级别为REPEATABLE READSET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 以下是三种常见的事务隔离级别及其示例: 1. READ COMMITTED(读取已提交)在READ COMMITTED隔离级别下,事务只能读取已经提交的其他事务的数据,避免了脏读(读取到未提交的数据),但可能出现不可重复读和幻读的情况。 -- 设置事务隔离级别为READ COMMITTED SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 示例:事务A和事务B-- 事务A执行BEGIN;-- 事务B执行BEGIN;-- 事务A查询数据SELECT * FROM employees WHERE department = 'IT';-- 事务B修改数据UPDATE employees SET salary = salary + 1000 WHERE department = 'IT';-- 事务A再次查询数据,可能发生不可重复读SELECT * FROM employees WHERE department = 'IT';-- 事务A提交COMMIT;-- 事务B提交COMMIT; 2. REPEATABLE READ(可重复读)在REPEATABLE READ隔离级别下,事务在同一事务中多次读取相同数据时,将得到一致的结果。防止了脏读和不可重复读,但可能出现幻读。 -- 设置事务隔离级别为REPEATABLE READSET TRANSACTION ISOLATION LEVEL REPEATABLE READ;-- 示例:事务A和事务B-- 事务A执行BEGIN;-- 事务B执行BEGIN;-- 事务A查询数据SELECT * FROM products WHERE category = 'Electronics';-- 事务B插入新数据INSERT INTO products VALUES (101, 'Laptop', 'Electronics', 1500);-- 事务A再次查询数据,不会发生不可重复读SELECT * FROM products WHERE category = 'Electronics';-- 事务A提交COMMIT;-- 事务B提交COMMIT; 3. SERIALIZABLE(可串行化)在SERIALIZABLE隔离级别下,事务彼此之间完全隔离,不会出现脏读、不可重复读和幻读,但可能导致性能下降。 -- 设置事务隔离级别为SERIALIZABLESET TRANSACTION ISOLATION LEVEL SERIALIZABLE; -- 示例:事务A和事务B-- 事务A执行BEGIN;-- 事务B执行BEGIN; -- 事务A查询数据SELECT * FROM orders WHERE status = 'Pending'; -- 事务B修改数据UPDATE orders SET status = 'Shipped' WHERE order_id = 1001; -- 事务A再次查询数据,不会发生不可重复读SELECT * FROM orders WHERE status = 'Pending'; -- 事务A提交COMMIT; -- 事务B提交COMMIT; 3.3 事务的回滚与提交在事务中,通过ROLLBACK可以撤销当前事务的所有修改,而COMMIT则提交当前事务的所有修改。四、事务的高级应用4.1 保存点(Savepoints)保存点是事务中的一个标记,可以在事务执行的过程中创建。如果事务中的某一部分出现错误,可以回滚到保存点,而不必回滚整个事务。 -- 创建保存点SAVEPOINT my_savepoint;-- 回滚到保存点ROLLBACK TO SAVEPOINT my_savepoint; 4.2 事务嵌套 GaussDB允许事务嵌套,一个事务可以包含另一个事务。嵌套事务可以独立于外部事务进行提交或回滚。 -- 开始外部事务BEGIN;-- 开始嵌套事务SAVEPOINT nested_savepoint;-- 提交嵌套事务COMMIT;-- 提交外部事务COMMIT; 示例:-- 开始外部事务BEGIN;-- 插入一条数据INSERT INTO employees (employee_id, employee_name, salary, department)VALUES (101, 'Alice', 5000, 'HR');-- 开始嵌套事务SAVEPOINT nested_savepoint;-- 尝试插入一条数据,如果失败则回滚到保存点SAVEPOINT nested_savepoint;INSERT INTO employees (employee_id, employee_name, salary, department)VALUES (102, 'Bob', 6000, 'IT');-- 提交嵌套事务COMMIT TO SAVEPOINT nested_savepoint;-- 提交外部事务COMMIT;在上述示例中,我们首先开始了一个外部事务,插入了一条数据。然后,在事务中使用了SAVEPOINT创建了一个保存点(nested_savepoint),尝试插入另一条数据。如果在嵌套事务中出现错误,我们可以选择回滚到保存点,而不是回滚整个外部事务。最后,通过COMMIT提交外部事务。 4.3 并发控制与锁 并发控制与锁是数据库系统中重要的概念,用于管理多个事务对数据库同时进行读写的情况,以确保数据的一致性和事务的隔离性。在GaussDB中,常见的锁类型包括共享锁(Shared Lock)和排他锁(Exclusive Lock)。共享锁用于读取操作,多个事务可以同时持有共享锁而不会互相干扰。排他锁用于写入操作,一个事务持有排他锁时,其他事务不能同时持有共享或排他锁。 示例:并发读写操作-- 事务A开始BEGIN; -- 事务A获取共享锁,用于读取操作SELECT * FROM products WHERE category = 'Electronics' FOR SHARE; -- 事务B开始BEGIN; -- 事务B尝试获取共享锁,可以成功SELECT * FROM products WHERE category = 'Electronics' FOR SHARE; -- 事务A继续执行读取操作-- 事务B也可以继续执行读取操作,因为都持有共享锁 -- 事务A提交COMMIT; -- 事务B提交COMMIT; 在上述示例中,事务A和事务B都可以同时持有共享锁,因为它们执行的是读取操作,不会互相干扰。 示例:并发写入操作:-- 事务C开始BEGIN; -- 事务C获取排他锁,用于写入操作UPDATE products SET price = price + 100 WHERE category = 'Electronics' FOR UPDATE; -- 事务D开始BEGIN; -- 事务D尝试获取共享锁,但会被阻塞,因为事务C持有排他锁 -- 事务C继续执行写入操作-- 事务D会等待直到事务C释放排他锁 -- 事务C提交COMMIT; -- 事务D获取共享锁,继续执行读取操作-- 事务D提交COMMIT; 在上述示例中,事务C获取了排他锁用于写入操作,导致事务D在尝试获取共享锁时被阻塞。直到事务C提交并释放了排他锁后,事务D才能获取共享锁并继续执行读取操作。这些示例突显了并发控制与锁的作用,以及不同类型的锁在多事务操作时的影响。在实际应用中,需要根据业务场景合理选择锁的类型,以平衡并发性能和数据一致性。 五、实践方法总结在实际应用中,开发人员需要根据业务场景选择适当的事务管理策略。在并发较高的情况下,合理使用事务隔离级别和锁机制可以提高系统性能。总的来说,GaussDB数据库提供了丰富而强大的事务管理功能,为开发人员提供了灵活的选择和高效的并发控制机制。深入理解这些特性,并根据具体业务需求进行合理的配置,将有助于构建稳定可靠的数据库应用系统。
-
一、引言GaussDB数据库作为一种先进的关系型数据库系统,索引的设计和管理对于提高查询性能至关重要。下面将通过实际例子深入研究GaussDB数据库的索引管理。 二、GaussDB数据库中的索引基本概念2.1 什么是GaussDB索引?GaussDB索引是一种数据结构,用于加速对表中数据的检索和查询。比如,在一个巨大的客户订单表中,可以通过对订单号列创建索引,加速根据订单号查询订单信息的速度。 2.2 GaussDB索引的作用GaussDB索引的主要作用是优化查询性能,减少数据检索的开销。通过使用不同类型的索引,GaussDB能够在各种查询场景下提供高效的数据定位和访问。三、GaussDB支持的索引类型3.1 B-Tree索引 B-Tree索引是一种平衡树,由根节点、内部节点和叶子节点组成。根节点和内部节点存储键值和指向子节点的指针,叶子节点存储实际的数据。适用场景: 适用于单一值的列,例如整数、字符串等。结构: B-Tree(平衡树)是一种有序树,每个节点包含多个键,并且子节点的键值范围是确定的。优势: 高效支持范围查询、等值查询和排序操作。示例: 在用户表中,通过用户ID列创建B-Tree索引,可以加速按用户ID查询的速度。 3.2 GIN索引 GIN索引是一种倒排索引,适用于存储和查找由多个键值组成的复合值的数据。它由一个元数据根节点、一个初始条目列表(entry list)和多个从属数据区(pending data pages)组成适用场景: 适用于包含多个数值或文本值的列,例如标签、数组等。结构: Generalized Inverted Index(广义反向索引),可用于加速包含多个项的列的查询。优势: 高效支持包含和排除多个值的查询。示例: 在文章表中,通过对标签列创建GIN索引,可以加速检索包含特定标签的文章。 3.3 GiST索引 GiST索引是一种平衡树索引,类似于B-Tree索引,但它支持各种各样的数据类型和查询方式。GiST索引由根节点、内部节点和叶子节点组成。每个节点包含一个或多个条目,每个条目由一个键和一些属性组成。适用场景: 适用于各种数据类型,尤其是用于高维数据和非标量数据类型的查询。结构: Generalized Search Tree(广义搜索树),适用于支持多种查询操作。优势: 高效支持范围查询、相似度查询和一些特殊数据类型的查询。示例: 在地理信息系统中,通过GiST索引加速空间数据的查询,例如查询地理位置范围内的数据。 3.4 SP-GiST索引 SP-GiST索引是GiST索引的一个变体,增加了"空间分区"的特性。SP-GiST索引同样由根节点、内部节点和叶子节点组成。每个内部节点都包含子节点范围的元组描述,叶节点存储实际数据。SP-GiST适用于二维空间数据等。适用场景: 专门用于处理空间数据,提供对复杂空间数据的高效查询支持。结构: Space-Partitioned Generalized Search Tree(空间划分广义搜索树)。优势: 高效支持空间数据的范围查询、相交查询等。示例: 在包含城市坐标的表中,通过创建SP-GiST索引可以加速根据地理位置范围查询城市的速度。 四、创建和管理GaussDB索引4.1 创建索引在GaussDB中,可以使用以下SQL语句创建索引: -- 创建B-Tree索引CREATE INDEX btree_index ON user_table(user_id);-- 创建GIN索引CREATE INDEX gin_index ON article_table USING GIN(tags);-- 创建GiST索引CREATE INDEX gist_index ON spatial_data_table USING GiST(geometry_column);-- 创建SP-GiST索引CREATE INDEX sp_gist_index ON city_table USING SP-GiST(geo_location); 4.2 删除索引 通过以下SQL语句可以在GaussDB中删除索引:-- 删除索引DROP INDEX btree_index; 4.3 索引的优化和性能考虑在创建索引时,需要考虑查询的模式、数据分布和表的大小。例如,对于一个日志表,可能只在时间戳列上创建定期维护的B-Tree索引,以加速按时间范围查询的性能。示例:场景描述假设有一个订单管理系统,其中有一个庞大的订单表(order_table),记录了每个订单的详细信息,包括订单号、客户ID、商品ID、订单金额等。在这个场景下,我们希望优化订单表的查询性能,特别是按照客户ID查询该客户的所有订单记录。 创建初始索引首先,我们为订单表的客户ID列创建一个初始的B-Tree索引:-- 创建初始B-Tree索引CREATE INDEX idx_customer_id ON order_table(customer_id); 查询性能分析通过常规查询分析,我们发现在按照客户ID查询订单时,查询性能不如预期。这可能是因为订单表的数据分布较广,B-Tree索引在这种情况下的性能有限。 优化索引为了优化索引性能,我们决定尝试使用GIN索引,以适应多值的情况。我们将客户ID列的值转化为数组,然后使用GIN索引:-- 创建GIN索引CREATE INDEX idx_customer_id_gin ON order_table USING GIN(ARRAY[customer_id]); 再次查询性能分析通过再次进行客户ID查询,我们发现使用GIN索引后的性能有了明显提升。GIN索引更适用于包含多个客户ID的情况,通过将值存储在数组中,可以更有效地支持这种查询模式。 优化结果通过优化索引,我们成功提高了按照客户ID查询订单的性能。然而,需要注意的是,索引的优化是一个动态过程,需要根据实际查询模式和数据分布进行调整。定期监测和评估索引的性能是数据库维护的一部分,以确保系统保持高性能状态。 五、GaussDB索引的使用注意事项5.1 维护成本在GaussDB中,索引的维护成本是需要考虑的因素之一。频繁的插入、更新和删除操作可能导致索引的重新构建,影响系统性能。5.2 索引选择和优化过多或不必要的索引可能导致性能下降,因此在设计数据库时,需要仔细选择哪些列需要索引,并根据查询需求进行优化。 六、GaussDB索引实践在实际应用中,理解业务需求、数据分布和查询模式是制定索引最佳实践的关键。通过合理配置索引,可以在GaussDB数据库中实现高效、稳定的查询性能。总体而言,深入理解GaussDB数据库索引的原理和使用方法,结合实际业务需求进行灵活配置,将有助于建立高性能、可维护的数据库系统。作者:hhh1218
-
1.创建小时分区表预创建分区720个,分区保留策略为最近720小时CREATE table day_part(id int,d_time timestamp) DISTRIBUTE BY HASH (id)PARTITION BY RANGE (d_time)(PARTITION p1 START('2025-01-06 11:17:00 ') END('2025-02-06 12:17:00') EVERY(interval '1 hours'));ALTER TABLE day_part ADD PARTITION pmax VALUES LESS THAN (maxvalue);2.确认最近1个月的小时分区预创建成功select pg_get_tabledef('day_part');3.更改表分区策略为最近2小时4.检查分区自动删除到最近2小时 请问第3,4步骤怎么实现
-
物化自动定时刷新怎么使用的?实验过程如下,物化视图没有自动刷新
-
9月和10月在华师的数据库课堂指导学生利用CodeArt Req进行领域建模,画出系统的类图,42名同学利用工具,12名同学能够在较短的时间自己摸索工具的使用,完成作业。详细资料见链接。通过网盘分享的文件:Code Art链接: https://pan.baidu.com/s/1sji84eyf0MSuru4FtTIy-Q?pwd=7ik5 提取码: 7ik5
-
JJ银行的标杆项目——合规法务平台项目的战略制定之后,合规副行长蔡行提了个问题:发展路线如何制定?当时咨询项目,数据库选型选了GaussDB来替O,它的考虑点是什么? 发展路线是组织为了达成战略目标,需要有分步走的计划,也就是回答 How的问题,而战略是回答What的问题。既然是信息化诉求,就有信息化方案来解决。根据H厂做的财政咨询项目方法论,把How的问题分解为两个子问题:业务流程全景图和IT架构。一个是BA,一个是TA。 由于他对P厂的业务流程已烂熟于心,看到JJ银行的合规法务业务流程,搭建IT架构,大致分了三层:上层应用、中间平台和下层基础底座。数据库架构处于中间平台层里的数据平台。 数据平台的设计难点在于选型,选用哪种数据产品来满足业务数据存储需求。 首先,解读一下金融政策,会有一个明确的指引——金融机构数据平台必须在2027年以前完成GCH改造,替O。这意味着选型的范围只能在GaussDB、达梦、人大金仓、TDSQL等国内产品中选择,JJ银行员工不多,但结构化数据量非常大,很多合同都带有表格附件,法务业务流程中需要快速读写数据,未来3年员工规模要扩展一倍,意味着数据量增长速度非常快..... GaussDB的结构化和非结构化数据支持,比较适合JJ银行未来3年的数字化转型目标,同时咨询项目选择了高斯数据库的容量,3+3,3个云节点,3个管理节点,容量支持50T。
-
磐维数据库主备搭建指南简介磐维数据库(PanWeiDB),作为中国移动信息技术中心基于华为openGauss开源软件打造的自研数据库产品,以其高稳定性和强大的系统内核能力,成为ICT基础设施的理想选择系统架构磐维数据库的主备架构具备以下优势:主集群在彻底不可用前无需手动切换。跨集群复制链路占用网络带宽少,组网灵活。支持灾备集群failover和主备集群计划内switchover。部署双中心集群首先,根据磐维2.0集中式安装的两种方式,在两个中心搭建两套集群,确保两个集群安装用户一致。主中心集群和从中心集群部署后的初始状态应分别如下所示。补丁加固由于系统兼容性问题,部署双中心容灾需要在主从中心集群各节点打补丁。具体流程包括获取补丁文件并上传至各节点,执行相关命令获取路径,并应用补丁。创建容灾用户在主从集群都创建容灾用户,使用如下命令:create user sdr_test with replication password 'Secret';创建容灾关系启动主中心(主中心主节点)和从中心(从中心主节点),使用gs_sdr工具创建容灾关系。主中心在创建容灾关系过程中会等待从中心启动,因此在启动主中心后,不需要等待主中心启动完毕即可启动从中心。容灾状态监控主中心和从中心都可以查看容灾状态,监控流式容灾中数据库实例状态,状态值含义如下。配置要点操作系统环境配置在安装磐维数据库前,需要进行操作系统环境配置,包括配置/etc/hosts、关闭透明大页、防火墙设置等。数据库安装上传安装介质,解压安装,并编写XML配置文件。同一节点多个实例必须区分端口和目录,因此需要为每个实例编写独立的XML配置文件。安全设置设置默认认证插件、打开文件限制、安全日志位置等安全相关配置。监控和维护使用gs_om -t status --detail命令检查安装后的数据库状态,确保磐维数据库安装成功。总结磐维数据库的主备搭建是一个涉及多个步骤的过程,包括系统架构设计、集群部署、补丁加固、用户创建、容灾关系建立以及状态监控。通过遵循上述步骤,可以确保磐维数据库的主备架构稳定运行,为企业数据安全提供强有力的保障。
-
GaussDB算子级调优算子级调优介绍一个查询语句要经过多个算子步骤才会输出最终的结果。由于个别算子耗时过长导致整体查询性能下降的情况比较常见。这些算子是整个查询的瓶颈算子。通用的优化手段是EXPLAIN ANALYZE/PERFORMANCE命令查看执行过程的瓶颈算子,然后进行针对性优化。如下面的执行过程信息中,Hashagg算子的执行时间占总时间的:(51016-13535)/ 56476 ≈66%,此处Hashagg算子就是这个查询的瓶颈算子,在进行性能优化时应当优先考虑此算子的优化。算子级调优示例示例1:基表扫描时,对于点查或者范围扫描等过滤大量数据的查询,如果使用SeqScan全表扫描会比较耗时,可以在条件列上建立索引选择IndexScan进行索引扫描提升扫描效率。gaussdb=# explain (analyze on,costs off) select * from t1 where c2=10004; id | operation | A-time | A-rows | Peak Memory | A-width ----+------------------------------+-----------------+--------+-------------+--------- 1 | -> Streaming (type: GATHER) | 20.040 | 5 | 85KB | 2 | -> Seq Scan on t1 | [17.239,17.376] | 5 | [18KB,18KB] | (2 rows) Predicate Information (identified by plan id) ----------------------------------------------- 2 --Seq Scan on t1 Filter: (c2 = 10004) Rows Removed by Filter: 90002 (3 rows) gaussdb=# create index idx on t1(c2); CREATE INDEX gaussdb=# explain (analyze on,costs off) select * from t1 where c2=10004; id | operation | A-time | A-rows | Peak Memory | A-width ----+-----------------------------------+---------------+--------+-------------+--------- 1 | -> Streaming (type: GATHER) | 3.206 | 5 | 85KB | 2 | -> Index Scan using idx on t1 | [0.122,0.146] | 5 | [73KB,73KB] | (2 rows) Predicate Information (identified by plan id) ----------------------------------------------- 2 --Index Scan using idx on t1 Index Cond: (c2 = 10004) (2 rows)上述例子中,全表扫描返回5条数据,过滤掉大量数据,在c2列上建立索引后,使用IndexScan扫描效率显著提高,从20毫秒降低到3毫秒。示例2:如果从执行计划中看,两表join选择了NestLoop,而实际行数比较大时,NestLoop Join可能执行比较慢。如下的例子中NestLoop耗时5秒,如果设置参数enable_mergejoin=off关掉Merge Join,同时设置参数enable_nestloop=off关掉NestLoop,让优化器选择HashJoin,则Join耗时降低至86毫秒。gaussdb=# explain analyze select count(*) from t2,t1 where t1.c1=t2.c2; id | operation | A-time | A-rows | E-rows | Peak Memory | A-width | E-width | E-costs ----+--------------------------------------------------+---------------------+----------+--------+-------------+---------+---------+--------- 1 | -> Aggregate | 5070.296 | 1 | 1 | 14KB | | 8 | 2148.49 2 | -> Streaming (type: GATHER) | 5070.219 | 2 | 2 | 81KB | | 8 | 2148.49 3 | -> Aggregate | [4828.705,5062.289] | 2 | 2 | [11KB,11KB] | | 8 | 2148.40 4 | -> Nested Loop (5,6) | [4828.565,5062.142] | 996 | 40 | [4KB,4KB] | | 0 | 2148.34 5 | -> Seq Scan on t1 | [13.574,14.508] | 90007 | 20000 | [15KB,15KB] | | 4 | 184.00 6 | -> Materialize | [1508.956,1579.488] | 22413670 | 20 | [35KB,36KB] | | 4 | 14.37 7 | -> Streaming(type: REDISTRIBUTE) | [55.825,56.842] | 498 | 20 | [44KB,44KB] | | 4 | 14.31 8 | -> Seq Scan on t2 | [0.105,0.132] | 498 | 20 | [13KB,13KB] | | 4 | 13.13 (8 rows) Predicate Information (identified by plan id) ----------------------------------------------- 4 --Nested Loop (5,6) Join Filter: (t2.c2 = t1.c1) Rows Removed by Join Filter: 22412672 (3 rows)设置参数后:gaussdb=# set enable_mergejoin=off; SET gaussdb=# set enable_nestloop=off; SET gaussdb=# explain analyze select count(*) from t2,t1 where t1.c1=t2.c2; id | operation | A-time | A-rows | E-rows | Peak Memory | A-width | E-width | E-costs ----+--------------------------------------------------+-----------------+--------+--------+---------------+---------+---------+--------- 1 | -> Aggregate | 92.911 | 1 | 1 | 14KB | | 8 | 224.45 2 | -> Streaming (type: GATHER) | 92.855 | 2 | 2 | 81KB | | 8 | 224.45 3 | -> Aggregate | [84.295,87.102] | 2 | 2 | [11KB,11KB] | | 8 | 224.36 4 | -> Hash Join (5,6) | [84.171,86.966] | 996 | 40 | [6KB,6KB] | | 0 | 224.30 5 | -> Seq Scan on t1 | [11.885,13.103] | 90007 | 20000 | [15KB,15KB] | | 4 | 184.00 6 | -> Hash | [55.895,56.072] | 498 | 21 | [292KB,292KB] | [20,20] | 4 | 14.31 7 | -> Streaming(type: REDISTRIBUTE) | [55.601,55.771] | 498 | 20 | [44KB,44KB] | | 4 | 14.31 8 | -> Seq Scan on t2 | [0.118,0.143] | 498 | 20 | [13KB,13KB] | | 4 | 13.13 (8 rows) Predicate Information (identified by plan id) ----------------------------------------------- 4 --Hash Join (5,6) Hash Cond: (t1.c1 = t2.c2) (2 rows)示例3:通常情况下Agg选择HashAgg性能较好,如果大结果集选择了Sort+GroupAgg,则需要设置enable_sort=off,HashAgg耗时优于Sort+GroupAgg。gaussdb=# explain analyze select count(*) from t1 group by c2; id | operation | A-time | A-rows | E-rows | Peak Memory | E-memory | A-width | E-width | E-costs ----+------------------------------------+-----------------+--------+--------+-------------+----------+-----------------+---------+--------- 1 | -> GroupAggregate | 244.817 | 40000 | 5000 | 15KB | | | 12 | 2131.52 2 | -> Sort | 156.344 | 40000 | 10000 | 5603KB | | | 12 | 2131.52 3 | -> Streaming (type: GATHER) | 91.595 | 40000 | 10000 | 82KB | | | 12 | 1442.14 4 | -> GroupAggregate | [90.317,96.852] | 40000 | 10000 | [12KB,12KB] | 16MB | | 12 | 973.39 5 | -> Sort | [59.775,64.724] | 90007 | 20000 | [5MB,5MB] | 16MB | [896220,903920] | 4 | 873.39 6 | -> Seq Scan on t1 | [18.092,21.033] | 90007 | 20000 | [12KB,12KB] | 1MB | | 4 | 184.00 (6 rows)设置参数后:gaussdb=# set enable_sort=off; SET gaussdb=# explain analyze select count(*) from t1 group by c2; id | operation | A-time | A-rows | E-rows | Peak Memory | E-memory | A-width | E-width | E-costs ----+---------------------------------+-----------------+--------+--------+-------------+----------+---------+---------+--------- 1 | -> HashAggregate | 228.260 | 40000 | 5000 | 6663KB | | | 12 | 752.75 2 | -> Streaming (type: GATHER) | 95.506 | 40000 | 10000 | 82KB | | | 12 | 752.75 3 | -> HashAggregate | [63.974,71.290] | 40000 | 10000 | [3MB,3MB] | 16MB | [20,20] | 12 | 284.00 4 | -> Seq Scan on t1 | [17.578,21.204] | 90007 | 20000 | [12KB,12KB] | 1MB | | 4 | 184.00 (4 rows)
-
GaussDB Join方式的Hint功能描述 指明Join使用的方法,可以为Nested Loop,Hash Join和Merge Join。语法格式 [no] nestloop|hashjoin|mergejoin([@queryblock] table_list)参数说明 @queryblock 见指定Hint所处的查询块Queryblock章节,可省略,表示在当前查询块生效。 no表示hint的join方式不使用。 table_list为表示hint表集合的字符串,该字符串中的表与join_table_list相同,只是中间不允许出现括号指定join的优先级。 例如:no nestloop(t1 t2 t3)表示:生成t1,t2,t3三表连接计划时,不使用nestloop。三表连接计划可能是t2 t3先join,再跟t1 join,或t1 t2先join,再跟t3 join。此hint只hint最后一次join的join方式,对于两表连接的方法不hint。如果需要,可以单独指定,例如:任意表均不允许nestloop连接,且希望t2 t3先join,则增加hint:no nestloop(t2 t3)。示例 对示例中原语句使用如下hint:explain select /*+ nestloop(store_sales store_returns item) */ i_product_name product_name ...该hint表示:生成store_sales,store_returns和item三表的结果集时,最后的两表关联使用nestloop。
-
GaussDB 子链接块名的hint功能描述指明子链接块的名称。语法格式blockname ( [@queryblock] table)参数说明@queryblock 见指定Hint所处的查询块Queryblock章节,可省略,表示在当前查询块生效。 table表示为该子链接块hint的别名的名称。 说明: blockname hint仅在对应的子链接块没有提升时才会被上层查询使用。目前支持的子链接提升包括IN子链接提升、EXISTS子链接提升和包含Agg等值相关子链接提升。该hint通常会和前面章节提到的hint联合使用。 对于FROM关键字后的子查询,则需要使用子查询的别名进行hint,blockname hint不会被用到。 如果子链接中含有多个表,则提升后这些表可与外层表以任意优化顺序连接,hint也不会被用到。 示例 explain select /+nestloop(store_sales tt) / * from store_sales where ss_item_sk in (select /+blockname(tt)/ i_item_sk from item group by 1);该hint表示:子链接的别名为tt,提升后与上层的store_sales表关联时使用nestloop。注意:当blockname的hint使用@queryblock进行指定,而不是在当前查询块直接生效时,比如blockname(@sel$2 new_qb_name)。 其他Hint无法通过@new_qb_name进行指定。此时new_qb_name只作为子链接的名字,可以使用Hint进行运算指定。 通过blockname(@sel$2 bn2)以@sel$2的方式进行块名bn2的指定,此时TableScan(@bn2 t2)无法通过@bn2找到该queryblock,而得通过@sel$2的方式进行指定。bn3使用Hint blockname(bn3)在当前查询块直接生效,改变默认查询块的名字,因此tablescan(@bn3 t3@bn3)可以通过@bn3进行指定。gaussdb=# explain select /*+ blockname(@sel$2 bn2) tablescan(@bn2 t2) tablescan(@sel$2 t2@bn2) indexscan(@sel$2 t2@sel$2) tablescan(@bn3 t3@bn3)*/ c2 from t1 where c1 in ( select /*+ */t2.c1 from t2 where t2.c2 = 1 group by 1) and c3 in ( select /*+ blockname(bn3)*/t3.c3 from t3 where t3.c2 = 1 group by 1); WARNING: hint: TableScan(@bn2 t2) does not match any query block WARNING: Error hint: TableScan(@"sel$2" t2@bn2), relation name "t2@bn2" is not found.通过blockname(@sel$2 bn2)以@sel$2的方式进行子链接块名bn2的指定。当该子链接被提升时,可以通过hashjoin(t1 bn2)对提升后的子链接的运算进行指定。gaussdb=# explain select /*+ blockname(@sel$2 bn2) hashjoin(t1 bn2) nestloop(t1 bn3) nestloop(t1 sel$3)*/ c2 from t1 where c1 in ( select /*+ */t2.c1 from t2 where t2.c2 = 1 group by 1) and c3 in ( select /*+ blockname(bn3)*/t3.c3 from t3 where t3.c2 = 1 group by 1); WARNING: Duplicated or conflict hint: NestLoop(t1 "sel$3"), will be discarded.
-
操作场景 通过华为云数据管理服务(Data Admin Service,简称DAS)这款可视化的专业数据库管理工具,可获得执行SQL、高级数据库管理、智能化运维等功能,做到易用、安全、智能的管理数据库。操作步骤登录管理控制台。 单击管理控制台左上角的,选择区域和项目。在页面左上角单击,选择“数据库 > 云数据库 GaussDB”,进入云数据库 GaussDB信息页面。 在“实例管理”页面,选择需要登录的目标数据库,单击操作列表中的“登录”,进入数据管理服务实例登录界面。可以在“实例管理”页面,单击目标实例名称,进入实例的“基本信息”页面,在页面右上角,单击“登录”,进入数据管理服务实例登录界面。在“自定义登录”页签,选择需要登录的节点,正确输入数据库用户名和密码,单击“测试连接”。测试连接通过后,单击“登录”,即可登录到数据库。
上滑加载中
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签