• [技术解读] 【酷哥说库|GaussDB微动画】GaussDB数据库的分区表
    videoGaussDB数据库支持数据分区。今天酷哥带大家了解一下GaussDB数据库的分区表,了解什么是数据库分区?分区有什么作用及优点?
  • [技术解读] GaussDB数据库SQL系列-层次递归查询
    一、前言层次递归查询是一种常见的SQL查询方式,特别是在一些层次化的数据存储结构中经常用到。本文主要以GaussDB数据库为实验平台,为大家讲解其使用方法。二、GuassDB数据库层次递归查询概念层次化结构可以理解为树状数据结构,由节点构成。举个简单的例子,如下图所示,由子节点向上查询根节点,或者由根节点遍历所有子节点:递归查询是指查询中需要多次调用自身的查询方式。在递归查询中,查询会反复地递归进入到一个子查询中,直到查询得到满足条件的结果或遍历完整个查询范围。递归查询在数据库领域中有着重要的应用。方便数据处理,简化开发代码。在GaussDB数据库中,递归查询可以通过使用 “select…start with…connect by…prior…” 和“WITH RECURSIVE”语法来实现。三、GaussDB数据库层次递归查询实验示例1、创建实验表--创建实验表CREATE TABLE area(a_code VARCHAR(10),a_name VARCHAR(10),p_a_code VARCHAR(10),a_level INT);--插入测试数据INSERT INTO area VALUES('610000','陕西省','0','1');INSERT INTO area VALUES('610100','西安市','610000','2');INSERT INTO area VALUES('610101','市辖区','610100','3');INSERT INTO area VALUES('610102','新城区','610100','3');INSERT INTO area VALUES('610103','碑林区','610100','3');INSERT INTO area VALUES('610104','莲湖区','610100','3');INSERT INTO area VALUES('610111','灞桥区','610100','3');INSERT INTO area VALUES('610112','未央区','610100','3');INSERT INTO area VALUES('610113','雁塔区','610100','3');INSERT INTO area VALUES('610114','阎良区','610100','3');INSERT INTO area VALUES('610115','临潼区','610100','3');INSERT INTO area VALUES('610116','长安区','610100','3');INSERT INTO area VALUES('610122','蓝田县','610100','3');INSERT INTO area VALUES('610124','周至县','610100','3');INSERT INTO area VALUES('610125','鄠邑区','610100','3');INSERT INTO area VALUES('610126','高陵区','610100','3');--查看初始化结果SELECT * FROM area;2、sys_connect_by_path(col, separator)描述:返回从根节点到当前行的连接路径。参数:col为在路径中显示的列名,支持类型为CHAR/VARCHAR/NVARCHAR2/TEXT的列,参数separator为路径节点之间的分隔符。返回值类型:text示例:--返回从根节点到当前行的连接路径SELECT *, sys_connect_by_path(a_name, '-') FROM area start with a_code ='610000' connect by prior a_code = p_a_code;3、connect_by_root(col)描述:返回当前行的根节点值。参数:col为输出列的名称。返回值类型:即为所指定列col的数据类型。示例:--返回当前行的根节点值。SELECT *, connect_by_root(a_name) FROM area start with a_code ='610000' connect by prior a_code = p_a_code;4、WITH RECURSIVE使用WITH RECURSIVE 关键字,:--使用WITH RECURSIVEWITH RECURSIVE t_area AS (SELECT a_level,a_code,p_a_code,a_name, a_name ::varchar(50) AS path FROM area WHERE p_a_code = '0'UNION ALLSELECT t2.a_level+1,t1.a_code,t1.p_a_code, t1.a_name,CONCAT(t2.path, ',', t1.a_name) ::varchar(50) AS path FROM area t1 JOIN t_area t2 ON t1.p_a_code=t2.a_code) SELECT * FROM t_area;示例说明:这个查询使用了递归表达式来遍历省级行政区域关系。表达式使用了两个 SELECT 语句:第一个 SELECT 语句选取了所有父级代码为0的行政区域信息,并将它们添加到临时表 t_area 中。它们的层级选取初始化的a_level级,并且它们的路径被设置为它们的行政区名a_name。这个 SELECT 语句是递归查询的起点。第二个 SELECT 语句连接了 area表和t_area表。它选取了area表中所有具有父级行政区,并连接到t_area表中已经存在的行政区。对于每个连接的行,它们的层级是父级的层级加1,并且它们的路径是父级的路径加上逗号和它们自己的行政区。查询结果返回t_area表中所有的行政区信息。(“::varchar(50)” 是创建实验表时的字符长度不够,需要重新定义,二是两个SELECT 语句使用 UNION ALL 连接,需要保持类型长度一致)。四、递归查询的优缺点1、优点递归查询能够简化应用程序代码,方便对数据结构的处理。在一些复杂的查询场景中,递归查询能够更快地得到结果。适用于各种类型的树形结构。2、缺点递归查询有时可能会产生很多次递归调用,导致性能下降。算法通常比其他方法更复杂,编写比较困难。不适合处理大型数据集。五、总结递归查询是一种非常实用的查询方法,在处理分层数据、树形数据等复杂查询场景中非常广泛。但是,在使用递归查询时需要注意一些问题:必须合理控制递归深度,防止过度递归。最好不要在递归查询中执行复杂的计算和组合操作,避免占用过多资源。避免在递归查询中使用ORDER BY操作,这会大大降低性能。在使用递归查询时,应该谨慎处理好死循环问题。同样的, 在使用GaussDB等数据库时,只要正确合理的应用递归查询,就可以更好地提高查询效率和应用性能。——结束
  • [问题求助] GaussDB处理并发的策略是什么?是锁行还是锁表,还是排队单线程执行
    GaussDB处理并发的策略是什么?是锁行还是锁表,还是排队单线程执行
  • [问题求助] GaussDB最大支持多少个并发
    GaussDB最大支持多少个并发
  • [问题求助] GaussDB(for MySQL)跟直接用 MySQL 有什么区别吗?性能上两者差多少
    GaussDB(for MySQL)跟直接用 MySQL 有什么区别吗?性能上两者差多少
  • [问题求助] GaussDB for mysql 能否支持将数据全量迁移至本地的mysql? 用什么工具?
    GaussDB for mysql 能否支持将数据全量迁移至本地的mysql? 用什么工具?
  • [技术解读] GaussDB数据库的备份与恢复
    GaussDB数据库的备份与恢复1.逻辑备份-gs_dumpgs_dump是一款用于导出数据库相关信息的工具,支持导出完整一致的数据库对象(数据库、模式、表、视图等)数据,同时不影响用户对数据库的正常访问。备份sql语句gs_dump是openGauss用于导出数据库相关信息的工具,用户可以自定义导出一个数据库或其中的对象(模式、表、视图等)。支持导出的数据库可以是默认数据库postgres,也可以是自定义数据库。(1)gs_dump工具由操作系统用户omm执行。(2)gs_dump工具在进行数据导出时,其他用户可以访问openGauss数据库(读或写)。(3)gs_dump工具支持导出完整一致的数据。例如,T1时刻启动gs_dump导出A数据库,那么导出数据结果将会是T1时刻A数据库的数据状态,T1时刻之后对A数据库的修改不会被导出(4)gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。纯文本格式的SQL脚本文件:包含将数据库恢复为其保存时的状态所需的SQL语句。通过gsql运行该 SQL脚本文件,可以恢复数据库。即使在其他主机和其他数据库产品上,只要对SQL脚本文件稍作修改,也可以用来重建数据库。归档格式文件:包含将数据库恢复为其保存时的状态所需的数据,可以是tar格式、目录归档格式或自定义归档格式,详见下页表格。该导出结果必须与gs_restore配合使用来恢复数据库,gs_restore工具在导入时,系统允许用户选择需要导入的内容,甚至可以在导入之前对等待导入的内容进行排序。2.逻辑备份恢复数据库gsql -p 30100 db_hr -r -f /home/omm/XXX.sql3.物理备份(分布式集群验证)集中式单节点不支持该工具。GaussRoach.py工具是GaussDB(for openGauss)提供的用于备份和恢复的实用工具。可对整个数据库中的数据、WAL归档日志和运行日志进行备份。GaussRoach.py工具是一款数据库高可用性以及容灾恢复策略的备份管理工具。使用该工具可以备份恢复数据库;不仅可以备份到物理磁盘,也可以备份到OBS、NBU和EISOO。数据库级备份包含数据库静态配置文件(cluster_static_config),数据库动态配置文件(cluster_dynamic_config),数据节点DN(Datanode)及其备实例。备份需在集群主节点执行前提:集群级备份前,需要执行如下命令开启集群归档模式脚本路径:XXX/data/cluster/tools/script/GaussRoach.py开启归档命令:python3 GaussRoach.py -t config --archive=true -p开启归档:(1):全量备份{python3 GaussRoach.py -t backup --master-port 7000 --media-destination /home/omm/media --media-type DISK --compression-type 2 --compression-level 5 --metadata-destination /home/omm/meta}-t:Roach接口支持多种功能。指定该参数为backup,表示调用备份功能。-media-type:-备份所需的介质类型。NBUDisk(磁盘)EISOOOBSNAS–compression-type:压缩类型1:zlib2:lz4默认:–compression-type 2–compression-level压缩级别。0代表快速或无压缩。9代表慢速或最大压缩。说明值越小,压缩越快。值越大,压缩越好。表级备份不支持压缩。默认:–compression-level 5–media- destination:指定介质的目的备份路径。Disk(磁盘):NBU:样例策略EISOO:roachOBS:不生效NAS:挂载的NAS共享盘路径说明:使用备份数据库到EISOO时,确保已放入正确版本的libgaussdbmml.so使用备份数据库到NAS时,确保数据库实例上所有节点的指定路径挂载的是同一个NAS共享盘对于磁盘:–media-destination /home/cam/backup对于NBU:–media-destination Samplepolicy对于EISOO:roach对于NAS:–media-destination /home/cam/backup–metadata-destination:元数据文件位置。–metadata-destination /home/username对于数据库级备份,必须提供介质类型、目标介质和主代理端口,否则Roach工具会报错。当前版本不支持表级备份功能,包括单表备份和多表逻辑备份。数据库级备份前,请执行如下命令检查数据库运行状态,cluster_state为Normal时表示数据库正常运行,可以备份数据库。全量物理备份成功:备份类型需要根据传入的变量进行判断增量备份(需要在全量备份的基础上来做) 磁盘备份:去全量备份的磁盘目录看下全量备份的名称后填写{python3 GaussRoach.py -t backup --master-port 7000 --media-destination /home/omm/media --media-type DISK --compression-type 2 --compression-level 5 --metadata-destination /home/omm/meta --prior-backup-key 20221125_102746 --validate-prior-backups force}备份成功:查看物理全量备份集:{ python3 GaussRoach.py -t show --related-backup-keys --metadata-destination /home/omm/meta/ --backup-key 20221125_102746}查看物理增量备份集:{python3 GaussRoach.py -t show --related-backup-keys --metadata-destination /home/omm/meta/ --backup-key 20221125_104547}查看所有备份集(该命令无法确定备份是否有效){python3 GaussRoach.py -t show --all-backups --metadata-destination /home/omm/meta}停止物理备份:Roach也兼容使用python3 GaussRoach.py –t stop –F命令停止备份,有-F和无-F参数的执行结果相同。如果有一个全量备份和一个增量备份同时执行,那么stop操作会一起停止这两个备份任务。命令示例{python3 $GPHOME/script/GaussRoach.py -t stop}使用物理备份集恢复数据库:1.查看备份状态:{python3 GaussRoach.py -t show --all-backups --metadata-destination /home/omm/meta}2.执行恢复脚本:{python3 GaussRoach.py -t restore --clean --master-port 7000 --media-destination /home/omm/media --media-type DISK --backup-key 20221125_102746 --metadata-destination /home/omm/meta}查看集群状态:执行恢复脚本成功后,必须执行命令启动集群,否则集群无法启动{python3 GaussRoach.py -t start}问题记录:物理备份(Roach)失败[GAUSS-53403] :Parsing the configuration file.**[GAUSS-53403]** : Cluster balance check failedbackup cannot continue when the cluster is not balanceRoach operation backup failed.正在分析配置文件。[GAUSS-53403]:群集平衡检查失败当群集不平衡时,备份无法继续漫游操作备份失败。查看集群状态:balanced显示为NO,当前集群不平衡,不平衡原因可能是发生过切换或者其他原因导致。balanced:平衡状态。显示是否有数据库实例发生过主备切换而导致主机负载不均衡。Yes:表示数据库处于负载均衡状态。No:表示数据库未处于负载均衡状态。执行命令恢复数据库初始状态(目前为测试环境,生产不使用此命令){gs_om -t switch --reset}变为yes就可以进行备份了。作者:张欣
  • [技术解读] GaussDB数据库SQL系列-行列转换
    一、前言在构建数据仓库或做数据分析时,需要对原始数据的结构进行一定的处理,有时涉及到“行转列”,有时涉及到“列转行”,那么这两个转换的方式具体是什么,有什么差异,怎么实现,今天我们将以GaussDB数据库为例,给大家做一下讲解。二、简述1、行转列概念即将多行一列数据转为一行多列显示。通常转化后将某一列分类后的值作为新的列名,将此值对应的多行数据显示成一行。2、列转行概念即将一行多列数据转成多行一列显示。通常将转化后的列名为某一行中某一列的值,来识别原先对应的数据。三、GaussDB数据库的行列转换实验示例用一张学生成绩来举例:从老师的角度,在录入成绩时,每科老师都会单独录入每个学生的本科成绩。而从学生的角度,学生只关心自己各科的成绩分别是多少。所以如果把老师录入数据作为原始表,那么学生查看自己的成绩时就要用到行转列,如果让学生上报自己各科的成绩,然后老师去查对应学科的学生考试成绩时,那就是列转行了。1、行转列示例1)创建实验表(行存表)--创建实验表(行存表)CREATE TABLE grade(name VARCHAR(10),course VARCHAR(10),score INT);--初始化测试数据INSERT INTO grade VALUES ('张三','数学',80);INSERT INTO grade VALUES ('张三','英语',88);INSERT INTO grade VALUES ('张三','语文',95);INSERT INTO grade VALUES ('李四','数学',88);INSERT INTO grade VALUES ('李四','英语',70);INSERT INTO grade VALUES ('李四','语文',93);--查看结果SELECT * FROM grade ORDER BY course;2)静态行转列使用sum、case when的方式:--静态行转列SELECT name,sum(case when course = '数学' then score else 0 end) AS "数学",sum(case when course = '英语' then score else 0 end) AS 英语,sum(case when course = '语文' then score else 0 end) AS 语文FROM gradeGROUP BY name;3)行转列(结果值:拼接式)使用listagg within group:--行转列(结果值:拼接式)SELECT name, LISTAGG(score,',') WITHIN GROUP (ORDER BY course) FROM grade GROUP BY name;4)动态行转列(拼接SQL式)通过“listagg + 创建FUNCTION + VIEW”的方式实现--动态行转列(SQL拼接式)SELECT listagg(concat('SUM(CASE WHEN course = ''', course, ''' THEN score ELSE 0 END) AS "', course,'"'),',') WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);--concat_text的结果:SUM(CASE WHEN course = '数学' THEN score ELSE 0 END) AS "数学",SUM(CASE WHEN course = '英语' THEN score ELSE 0 END) AS "英语",SUM(CASE WHEN course = '语文' THEN score ELSE 0 END) AS "语文"--创建一个函数。CREATE OR REPLACE FUNCTION fun_test()RETURNS VOIDLANGUAGE SQLAS $$ DECLAREs_sql text;rec record;BEGINs_sql := 'SELECT listagg(CONCAT(''SUM(CASE WHEN course = '''''', course, '''''' THEN score ELSE 0 END) AS "'', course, ''"'' ),'','' ) WITHIN GROUP(ORDER BY 1) AS concat_text FROM (SELECT DISTINCT course FROM grade);';EXECUTE s_sql INTO rec;s_sql := 'DROP VIEW IF EXISTS v_score; CREATE VIEW v_score AS SELECT name, ' || rec.concat_text || ' FROM grade GROUP BY name;';EXECUTE s_sql;END $$;--调用CALL fun_test();--查看执行结果select * from v_score;Tip:请注意SQL拼写时的单引号、双引号。2、列转行示例1)创建实验表(复用前面的测试数据)--创建实验表(复用前面的测试数据)CREATE TABLE grade1 ASSELECT name,sum(case when course = '数学' then score else 0 end) AS "数学",sum(case when course = '英语' then score else 0 end) AS 英语,sum(case when course = '语文' then score else 0 end) AS 语文FROM gradeGROUP BY name;--查看结果SELECT * FROM grade1;2)使用union all,将各科目(数学、英语、语文)整合为一列--使用union all,将各科目(数学、英语、语文)整合为一列SELECT * FROM(SELECT name, '数学' AS course, 数学 AS score FROM grade1union allSELECT name, '英语' AS course, 英语 AS score FROM grade1union allSELECT name, '语文' AS course, 语文 AS score FROM grade1)order by name;四、小结行列互转在一些数据库使用场景中经常用到,比如数据分析、数仓建设等。但不同的数据库软件有着不同处理方式,但是行列换的基本思路是一致的。本文主要是以GaussDB数据为平台,为大家做了简单的讲述 ,欢迎测试。——结束
  • [技术解读] GaussDB数据库SQL系列-DROP & TRUNCATE & DELETE
    一、前言在数据库中,SQL作为一种常用的数据库编程语言,扮演着至关重要的角色。SQL不仅可以用于创建、修改和查询数据库,还可以通过DROP、DELETE和TRUNCATE等语句来删除数据。这些语句是SQL语言中的最常用的命令,且它们有着不同的含义和使用场景。本文以GaussDB数据库为平台,将详细介绍SQL中DROP、TRUNCATE和DELETE等语句的含义、使用场景以及注意事项,帮助读者更好地理解和掌握这些常用的数据库操作命令。二、GaussDB的 DROP & TRUNCATE & DELETE 简述1、简述DROP语句可以删除整个表,包括表结构和数据;TRUNCATE语句则可以快速地删除表中的所有数据,但不删除表结构。DELETE语句可以删除表中的数据,不包括表结构;2、命令比对大类DROPTRUNCATEDELETESQL类型DDLDDLDML删除内容删除表的所有数据,包括表结构、索引和权限等删除表中所有数据,或指定分区的数据删除表的全部或部分(+条件)数据执行速度速度最快速度中等速度最慢Tip:在GaussDB数据库中,DROP是用于定义或修改数据库中的对象的命令之一。对象主要包括:库、模式、表空间、表、索引、视图、存储过程、函数、加密秘钥等,本次只针对其对表的操作。三、GaussDB的DROP TABLE命令及示例1、功能描述DROP TABLE的功能是用来删除已存在的Table。2、语法DROP TABLE [IF EXISTS] [db_name.]table_name;说明:SQL中加[IF EXISTS] ,可以防止因表不存在而导致执行报错。参数:db_name:Database名称。如果未指定,将选择当前database。table_name:需要删除的Table名称。3、示例以下示例演示DROP命令的使用,依次执行如下SQL语句:--删除整个表courseDROP TABLE IF EXISTS course--创建course表CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));--初始化数据INSERT INTO course VALUES('01' , '语文' , '02');INSERT INTO course VALUES('02' , '数学' , '01');INSERT INTO course VALUES('03' , '英语' , '03');--3条记录SELECT count(1) FROM course;--删除整个表DROP TABLE IF EXISTS course--查看结果,表不存在(表结构及数据不存在)SELECT count(1) FROM course;1)DROP TABLE,提示表不存在2)创建并初始化一张实验表3)DROP TABLE 执行成功4)查看执行结果四、GaussDB的TRUNCATE命令及示例1、功能描述从表或表分区中移除所有数据,TRUNCATE快速地从表中删除所有行。它和在目标表上进行无条件的DELETE有同样的效果,但由于TRUNCATE不做表扫描,因而快得多, 且使用的系统和事务日志资源少。在大表上操作效果更明显。TRUNCATE TABLE 删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。2、语法TRUNCATE [TABLE] table_name;或ALTER TABLE [IF EXISTS] table_name TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) }参数:table_name:需要删除数据的Table名称。partition_name:需要删除的分区表的分区名称。partition_value:需要删除的分区表的分区值。3、示例1以下示例演示TRUNCATE命令的使用:--创建course表DROP TABLE IF EXISTS course;CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));--初始化数据INSERT INTO course VALUES('01' , '语文' , '02');INSERT INTO course VALUES('02' , '数学' , '01');INSERT INTO course VALUES('03' , '英语' , '03');--3条记录SELECT count(1) FROM course;--清空表TRUNCATE TABLE course;--或TRUNCATE course;--0条记录SELECT count(1) FROM course;1)创建实验表并初始化数据2)TRUNCATE TABLE执行成功3)查看执行结果4、示例2以下示例演示TRUNCATE命令的删除分区表数据--创建列表分区(LIST)DROP TABLE IF EXISTS orders;CREATE TABLE orders (id INT PRIMARY KEY,customer_id INT,order_date DATE,product_id INT,quantity INT) PARTITION BY LIST (customer_id) (PARTITION p1 VALUES (100),PARTITION p2 VALUES (200),PARTITION p3 VALUES (300),PARTITION p4 VALUES (400),PARTITION p5 VALUES (500));--插入测试数据INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);--查看分区p1、p2的数据SELECT * FROM orders WHERE customer_id IN (100,200);--或--根据分区名称查询SELECT * FROM orders PARTITION(p2);--清空分区p1。ALTER TABLE orders TRUNCATE PARTITION p1;--或者--清空分区p2=200。ALTER TABLE orders TRUNCATE PARTITION for (200);--查看分区p1、p2的数据SELECT * FROM orders WHERE customer_id IN (100,200);1)创建实验表并初始化2)根据分区进行删数据五、GaussDB的DELETE命令及示例1、功能描述从指定的表里删除满足WHERE子句的行。如果WHERE子句不存在,将删除表中所有行,结果只保留表结构。2、注意事项不支持DELETE语句中使用LIMIT。应使用WHERE条件明确需要更新的目标行。不支持在单条SQL语句中,对多个表进行删除。DELETE语句中必须有WHERE子句,避免全表扫描。DELETE语句中禁止不应使用ORDER BY、GROUP BY子句,避免不必要的排序。如果需要清空一张表,建议使用TRUNCATE,而不是DELETE。TRUNCATE会创建新的物理文件,并在事务结束时将原文件物理删除,清空磁盘空间。而DELETE会将表中数据进行标记,直到VACCUUM FULL阶段才会真正清理磁盘空间。DELETE有主键或索引的表,WHERE条件应结合主键或索引,提高执行效率。DELETE 语句每次删除一行,并在事务日志中为所删除的每行记录一项。如果想保留标识计数值,请改用 DELETE3、语法DELETE FROM table_name [WHERE condition];参数:table_name:需要删除数据的Table名称。condition:用于判断哪些行需要被删除。4、示例复用前面的实验表:1)删除orders表中customer_id <200的所有数据:DELETE FROM orders WHERE customer_id <200;六、应用场景需要根据一定的业务条件删除数据时、且数据量、性能可控的情况下,可以考虑使用 DELETE。需要删除大批量数据时,同时要求速度快,效率高并且无需撤销时,可以使用 TRUNCATE。在企业级开发中,实际上都是进行逻辑删除(将数据进行“删除标识”处理)、而并不进行物理上的删除。在实际生产环境中,一般情况下删除业务处理(过渡表)中的数据。在实际企业开发、维护过程中,不管使用 DELETE、TRUNCATE还是DROP命令前,都要考虑数据的备份。七、小结在GaussDB等数据库中,DROP、TRUNCATE和DELETE均是常用的删除数据的命令。但在实际业务使用中,需要根据不同的需求进行准确的选择,但无论选择那种删数方式,都需要考虑数据安全性——重要的事情说三遍:备份!备份!备份!——结束。
  • [技术解读] GaussDB数据库SQL系列-UNION & UNION ALL
    一、前言SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用SQL语言来操作数据库中的数据。而在SQL中,UNION是一个非常强大的功能,它可以将多个SELECT语句的结果合并成一个结果集。本文将以GaussDB数据库为例,介绍一下UNION 操作符的使用。二、GaussDB UNION/UNION ALL1、GaussDB UNION 操作符GaussDB UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。2、语法定义1)UNION语法SELECT column1,column2,……FROM table1[WHERE condition]UNIONSELECT column1,column2,……FROM table2[WHERE condition]2)UNION ALL 语法SELECT column1,column2,……FROM table1[WHERE condition]UNION ALLSELECT column1,column2,……FROM table2[WHERE condition]说明:UNION在合并两个或多个集合时会执行去重操作,而UNION ALL则直接将两个或者多个结果集合并,不执行去重。 另外,执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认了两个集合不存在重重复数据时,可直接用UNION ALL 替代UNION,以便提升性能。三、GaussDB实验示例并初始化本文以GaussDB数据库为实验平台,1、创建实验表1)学生信息表student(ID、姓名、性别、城市)--创建学生信息表CREATE table student(sId VARCHAR(10) NOT NULL,sname VARCHAR(10) NOT NULL,ssex VARCHAR(10) NOT NULl,scity VARCHAR(10) NOT NULl);--初识化实验数据INSERT INTO student VALUES('s01' , '赵雷' , '男', 'XIAN');INSERT INTO student VALUES('s02' , '钱电' , '男', 'YUNNAN');INSERT INTO student VALUES('s03' , '孙风' , '男', 'NIXIA');INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');INSERT INTO student VALUES('s06' , '吴兰' , '女', 'CHENGDU');INSERT INTO student VALUES('s07' , '郑竹' , '女', 'XIAN');INSERT INTO student VALUES('s08' , '张三' , '女', 'CHENGDU');--查看结果集SELECT * FROM student;2)教师信息表teacher(ID、姓名、性别、城市)--创建教师信息表CREATE table teacher(teid VARCHAR(10) NOT NULL,tname VARCHAR(10) NOT NULL,tsex VARCHAR(10) NOT NULL,tcity VARCHAR(10) NOT NULL);--初始化实验数据INSERT INTO teacher VALUES('t01' , '张磊', '男', 'XIAN');INSERT INTO teacher VALUES('t02' , '李强', '男', 'BEIJING');INSERT INTO teacher VALUES('t03' , '王刚', '男', 'XINJIANG');--查看结果集SELECT * FROM teacher;2、合并且除重(UNION)--获取学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNIONSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,且城市数据不存在重复:3、合并不除重(UNION ALL)--获取所有学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNION ALLSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,罗列了所有城市数据:4、合并带有WHERE子句SQL结果集(UNION ALL)--获取来自'XIAN'的学生和教师的所有信息,并按学生和教师的编号升序排序。SELECT t.*FROM(SELECT Sid AS id,Sname AS name,Ssex AS sex,Scity AS cityFROM student WHERE Scity='XIAN'UNION ALLSELECT Tid AS id,Tname AS name,Tsex AS sex,Tcity AS cityFROM teacher WHERE Tcity='XIAN') tORDER BY t.id ASC;结果集如下截图,罗列了'XIAN'的学生和教师的所有信息:5、业务逻辑除重后合并(UNION ALL)在一些业务场景下,比如上游系统提供的两张表或者多张表之间互相不会存重复数据,且自身也不存在重复数据,则为了提升合并时SQL性能、减少SQL执行时间,则选择UNION ALL操作符。四、GaussDB UNION常见错误1、“each UNION query must have the same number of columns”解决思路:根据提示查看两个表的表结构,看字段数量是否一支。2、“UNION types timestamp without time zone and text cannot be matched”解决思路:根据提示查看两个表的表结构,看字段类型是否一致。五、小结在实际业务场景中,无论选择GaussDB数据库,还是其他关系型数据库,在使用UNION和UNION ALL 时,都需要注意以下几点:左右两侧的SQL字段数量和字段类型需要保持一致;业务需求是否需要考虑数据除重(合并前除重还是合并时除重);根据表中数据量的大小,需要对SQL的执行效率进行评估,从而考虑是否需要选择临时表进行过渡后再合并;需要考虑SQL编写的复杂度,不能为了写SQL而写SQL,需要结合业务需求进行选择。——结束
  • GaussDB数据库SQL系列-子查询
    GaussDB数据库SQL系列-子查询一、前言在数据库技术领域,SQL(结构化查询语言)是一种用于管理关系数据库的标准语言。它允许用户从数据库中检索、插入、更新和删除数据,以及执行各种高级的数据操作。在本文中,我们将重点介绍GaussDB SQL中的子查询功能。子查询是SQL中的一种重要技术,它允许我们在一个查询中嵌套另一个查询,从而实现更复杂的数据查询和分析。二、GaussDB SQL子查询表达式1、EXISTS/NOT EXISTSEXISTS/NOT EXISTS是SQL中的语法,SQL 会首先执行子查询,然后根据子查询的结果是否满足条件来决定是否继续执行主查询。如果子查询返回至少一行数据,则 EXISTS 条件与主查询结合使用并被视为满足。NOT EXISTS 则相反,它只会在子查询没有返回任何数据行时才会被视为满足。EXISTS的参数是一个任意的SELECT语句,或者说子查询。系统对子查询进行运算以判断它是否返回行。如果它至少返回一行,则EXISTS结果就为"真";如果子查询没有返回任何行, EXISTS的结果是"假"。这个子查询通常只是运行到能判断它是否可以生成至少一行为止,而不是等到全部结束。语法:WHERE column_name EXISTS/NOT EXISTS (subquery)2、IN/NOT ININ 和 NOT IN 是 SQL 中的子查询运算符,用于测试某个给定的比较值是否存在于某一组值里。如果外层查询里的行与子查询返回的某一个行相匹配,那么 IN 的结果为真。如果外层查询里的行与子查询返回的所有行都不匹配,那么 NOT IN 的结果为真。语法:WHERE column_name IN/NOT IN (subquery)3、ANY/SOMEANY 和 SOME 都是用于子查询中的关键字。 ANY 表示子查询中的任何值都可以与外部查询中的值匹配。 SOME 与 ANY 相同,只是在语法上的差别。右边的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较(=、<>、<、<=、>、>=),其结果必须是布尔值。如果至少获得一个真值,则ANY结果为“真”。如果全部获得假值,则结果是“假”(包括子查询没有返回任何行的情况)。语法:WHERE column_name operator ANY/SOME (subquery)4、ALL右边的子查询,它必须只返回一个字段。左边表达式使用operator对子查询结果的每一行进行一次计算和比较(=、<>、<、<=、>、>=),其结果必须是布尔值。如果全部获得真值,ALL结果为"真"(包括子查询没有返回任何行的情况)。如果至少获得一个假值,则结果是"假"。语法:WHERE column_name operator ALL (subquery)条件描述column_name > ALL(…)column_name列中的值必须大于要评估为true的集合中的最大值。column_name >= ALL(…)column_name列中的值必须大于或等于要评估为true的集合中的最大值。column_name < ALL(…)column_name列中的值必须小于要评估为true的集合中的最小值。column_name <= ALL(…)column_name列中的值必须小于或等于要评估为true的集合中的最小值。column_name <> ALL(…)column_name列中的值不得等于要评估为true的集合中的任何值。column_name = ALL(…)column_name列中的值必须等于要评估为true的集合中的任何值。三、GaussDB SQL子查询实验示例在接下来的内容中,我们将以GaussDB数据库为实验平台,通过示例来演示如何利用这些子查询。1、创建实验表--课程表:course(cid,cname,teid)--cid 课程编号,cname 课程名称,tid 教师编号--创建course表CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));--初始化INSERT INTO course VALUES('01' , '语文' , '02');INSERT INTO course VALUES('02' , '数学' , '01');INSERT INTO course VALUES('03' , '英语' , '03');--查看结果SELECT * FROM course;--教师表teacher(teid,tname)--tid 教师编号,tname 教师姓名--创建teacher表CREATE TABLE teacher(teid VARCHAR(10),tname VARCHAR(10));--初始化数据INSERT INTO teacher VALUES('01' , '张老师');INSERT INTO teacher VALUES('02' , '李老师');INSERT INTO teacher VALUES('03' , '王老师');INSERT INTO teacher VALUES('04' , '赵老师');--查看SELECT * FROM teacher;2、EXISTS/NOT EXISTS示例--查询在course表中的教师记录SELECT * FROM teacher WHERE EXISTS (SELECT * FROM course WHERE course.teid = teacher.teid);--查询没有在course表中的教师记录SELECT * FROM teacher WHERE NOT EXISTS (SELECT * FROM course WHERE course.teid = teacher.teid);3、IN/NOT IN 示例--根据教师id匹配course表SELECT * FROM course WHERE teid IN (SELECT teid FROM teacher );--取不在course表的教师信息SELECT * FROM teacher WHERE teid NOT IN (SELECT teid FROM course );4、ANY/SOME 示例--左侧主句与右侧子查询进行字段比对,获取需要的结果集SELECT * FROM course WHERE teid < ANY (SELECT teid FROM teacher where teid<>'04');--或SELECT * FROM course WHERE teid < some (SELECT teid FROM teacher where teid<>'04');Tip:此示例主要展示ANY/SOME的查询效果,实际应用请结合具体场景使用。5、ALL示例--teid列中的值必须小于要评估为true的集合中的最小值。SELECT * FROM course WHERE teid < ALL(SELECT teid FROM teacher WHERE teid<>'01');--teidc列中的值必须大于要评估为true的集合中的最大值。SELECT * FROM teacher WHERE teid > ALL(SELECT teid FROM course);Tip:此示例主要展示ALL的查询效果,实际应用请结合具体场景使用。四、注意事项及建议禁止一条SQL语句中,出现重复子查询语句。少用标量子查询(标量子查询指结果为1个值,并且条件表达式为等值的子查询)。避免在SELECT目标列中使用子查询,可能导致计划无法下推影响执行性能。子查询嵌套深度建议不超过2层。由于子查询会带来临时表开销,过于复杂的查询应考虑从业务逻辑上进行优化。五、小结子查询可以在 SELECT 语句中嵌套其他查询,从而实现更复杂的查询。子查询还可以在 WHERE 子句中使用其他查询的结果,从而更好地过滤数据。但是子查询可能会导致查询性能问题和代码难阅读和理解。 所以在GaussDB等数据库中使用SQL子查询时,请结合实际业务情况进行操作。——结束
  • [技术干货] GaussDB数据库SQL系列-UNION & UNION ALL
    一、前言SQL(结构化查询语言)是一种用于管理关系型数据库的标准语言。它允许用户通过使用SQL语言来操作数据库中的数据。而在SQL中,UNION是一个非常强大的功能,它可以将多个SELECT语句的结果合并成一个结果集。本文将以GaussDB数据库为例,介绍一下UNION 操作符的使用。二、GaussDB UNION/UNION ALL1、GaussDB UNION 操作符GaussDB UNION 操作符用于合并两个或多个 SELECT 语句的结果集。请注意,UNION 内部的每个 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每个 SELECT 语句中的列的顺序必须相同。2、语法定义1)UNION语法SELECT column1,column2,……FROM table1[WHERE condition]UNIONSELECT column1,column2,……FROM table2[WHERE condition]2)UNION ALL 语法SELECT column1,column2,……FROM table1[WHERE condition]UNION ALLSELECT column1,column2,……FROM table2[WHERE condition]说明:UNION在合并两个或多个集合时会执行去重操作,而UNION ALL则直接将两个或者多个结果集合并,不执行去重。 另外,执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认了两个集合不存在重重复数据时,可直接用UNION ALL 替代UNION,以便提升性能。三、GaussDB实验示例并初始化本文以GaussDB数据库为实验平台,1、创建实验表1)学生信息表student(ID、姓名、性别、城市)--创建学生信息表CREATE table student(sId VARCHAR(10) NOT NULL,sname VARCHAR(10) NOT NULL,ssex VARCHAR(10) NOT NULl,scity VARCHAR(10) NOT NULl);--初识化实验数据INSERT INTO student VALUES('s01' , '赵雷' , '男', 'XIAN');INSERT INTO student VALUES('s02' , '钱电' , '男', 'YUNNAN');INSERT INTO student VALUES('s03' , '孙风' , '男', 'NIXIA');INSERT INTO student VALUES('s04' , '李云' , '男', 'XIZANG');INSERT INTO student VALUES('s05' , '周梅' , '女', 'XINJIANG');INSERT INTO student VALUES('s06' , '吴兰' , '女', 'CHENGDU');INSERT INTO student VALUES('s07' , '郑竹' , '女', 'XIAN');INSERT INTO student VALUES('s08' , '张三' , '女', 'CHENGDU');--查看结果集SELECT * FROM student;2)教师信息表teacher(ID、姓名、性别、城市)--创建教师信息表CREATE table teacher(teid VARCHAR(10) NOT NULL,tname VARCHAR(10) NOT NULL,tsex VARCHAR(10) NOT NULL,tcity VARCHAR(10) NOT NULL);--初始化实验数据INSERT INTO teacher VALUES('t01' , '张磊', '男', 'XIAN');INSERT INTO teacher VALUES('t02' , '李强', '男', 'BEIJING');INSERT INTO teacher VALUES('t03' , '王刚', '男', 'XINJIANG');--查看结果集SELECT * FROM teacher;2、合并且除重(UNION)--获取学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNIONSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,且城市数据不存在重复:3、合并不除重(UNION ALL)--获取所有学生和教师所属的城市,并按城市名称首字母升序排序。SELECT t.cityFROM (SELECT scity AS cityFROM studentUNION ALLSELECT tcity AS cityFROM teacher) tORDER BY t.city ASC;结果集如下截图,罗列了所有城市数据:4、合并带有WHERE子句SQL结果集(UNION ALL)--获取来自'XIAN'的学生和教师的所有信息,并按学生和教师的编号升序排序。SELECT t.*FROM(SELECT Sid AS id,Sname AS name,Ssex AS sex,Scity AS cityFROM student WHERE Scity='XIAN'UNION ALLSELECT Tid AS id,Tname AS name,Tsex AS sex,Tcity AS cityFROM teacher WHERE Tcity='XIAN') tORDER BY t.id ASC;结果集如下截图,罗列了'XIAN'的学生和教师的所有信息:5、业务逻辑除重后合并(UNION ALL)在一些业务场景下,比如上游系统提供的两张表或者多张表之间互相不会存重复数据,且自身也不存在重复数据,则为了提升合并时SQL性能、减少SQL执行时间,则选择UNION ALL操作符。四、GaussDB UNION常见错误1、“each UNION query must have the same number of columns”解决思路:根据提示查看两个表的表结构,看字段数量是否一支。2、“UNION types timestamp without time zone and text cannot be matched”解决思路:根据提示查看两个表的表结构,看字段类型是否一致。五、小结在实际业务场景中,无论选择GaussDB数据库,还是其他关系型数据库,在使用UNION和UNION ALL 时,都需要注意以下几点:左右两侧的SQL字段数量和字段类型需要保持一致;业务需求是否需要考虑数据除重(合并前除重还是合并时除重);根据表中数据量的大小,需要对SQL的执行效率进行评估,从而考虑是否需要选择临时表进行过渡后再合并;需要考虑SQL编写的复杂度,不能为了写SQL而写SQL,需要结合业务需求进行选择。——结束
  • GaussDB数据库SQL系列-表连接(JOIN)
    一、前言SQL是用于数据分析和数据处理的最重要的编程语言之一,表连接(JOIN)是数据库中SQL的一种常见操作,在实际应用中,我们需要根据业务需求从两个或多个相关的表中获取信息。二、GaussDB JOINGaussDB是华为推出的企业级分布式关系型数据库。GaussDB JOIN 子句是基于两个或者多个表之间的共同字段把它们进行结合。在GaussDB数据库中,常用的JOIN有如下几种连接及用法:INNER JOIN、LEFT JOIN、RIGHT JOIN、 FULL JOIN、CROSS JOIN。1、LEFT JOINLEFT JOIN 一般称左连接,也写作 LEFT OUTER JOIN。左连接查询会返回左表中所有记录,且在右表中找到的关联数据列也会被一起返回。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1LEFT JOIN table2 t2ON t1.id=t2.id ;2、LEFT JOIN EXCLUDING INNER JOIN返回左表有但右表没有关联数据的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1LEFT JOIN table2 t2ON t1.id=t2.idWHERE t2.id IS NULL ;3、RIGHT JOINRIGHT JOIN 一般称右连接,也写作 RIGHT OUTER JOIN。右连接查询会返回右表中所有记录,且在左表中找到的关联数据列也会被一起返回。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1RIGHT JOIN table2 t2ON t1.id=t2.id4、LEFT JOIN EXCLUDING INNER JOIN返回右表有但左表没有关联数据的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1RIGHT JOIN table2 t2ON t1.id=t2.idWHERE t1.id IS NULL ;5、INNER JOININNER JOIN 一般被译作内连接。获取左表和右表中能关联起来的数据。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1INNER JOIN table2 t2ON t1.id=t2.id ;6、FULL OUTER JOINFULL OUTER JOIN 一般称外连接、全连接,实际查询语句中可以写作FULL JOIN。外连接查询能返回左右表里的所有记录。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1FULL OUTER JOIN table2 t2ON t1.id=t2.id ;7、FULL OUTER JOIN EXCLUDING INNER JOIN返回左表和右表里没有相互关联的记录集。--SQL示例SELECT t1.column1, …, t2.column1,…FROM table1 t1FULL OUTER JOIN table2 t2ON t1.id=t2.idWHERE t1.id IS NULLOR t2.id IS NULL ;除以上几种外,另有 CROSS JOIN(迪卡尔集),但此用法不常用,可做拓展研究。三、GaussDB 实验示例创建两张实验表:Students(学生表)和Score(学生成绩表)。1、初始化实验表1)Students(学生表):--学生表,Students(SNO, SNAME)代表 (学号,姓名)DROP TABLE students;CREATE TABLE students(sno INTEGER NOT NULL,sname varchar(32));--插入数据INSERT INTO students(sno,sname) VALUES (1001,'张三');INSERT INTO students(sno,sname) VALUES (1002,'李四');INSERT INTO students(sno,sname) VALUES (1003,'王五');INSERT INTO students(sno,sname) VALUES (1004,'赵六');INSERT INTO students(sno,sname) VALUES (1005,'韩梅');INSERT INTO students(sno,sname) VALUES (1006,'李雷');--查看表信息SELECT * FROM students;2)Score(学生成绩表):--学生成绩表,Score(SNO, SCGRADE) 代表(学号,成绩)DROP TABLE score;CREATE TABLE score(sno INTEGER NOT NULL,scgrade DECIMAL(3,1));--插入数据INSERT INTO score(sno,scgrade)values(1001,98);INSERT INTO score(sno,scgrade)values(1002,95);INSERT INTO score(sno,scgrade)values(1003,97);INSERT INTO score(sno,scgrade)values(1004,99);--查看表信息SELECT * FROM score;2、LEFT JOIN(示例)--表students为主表SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1LEFT JOIN score t2ON t1.sno=t2.sno3、RIGTH JOIN(示例)--表score 为主表SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1RIGHT JOIN score t2ON t1.sno=t2.sno4、INNER JOIN(示例)--根据字段sno获取两个表中都有的数据SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1INNER JOIN score t2ON t1.sno=t2.sno5、FULL JOIN(示例)--获取左右表里的所有记录。SELECT t1.sno,t1.sname,t2.sno,t2.scgradeFROM students t1FULL JOIN score t2ON t1.sno=t2.sno四、小结数据库表连接(Join)是将两个或多个表中的数据根据一定的条件进行组合,在实际应用中,数据库表连接可以帮助我们快速地获取所需的数据信息,提高数据处理效率。需要注意的是,不同的数据库系统对表连接的支持程度可能存在差异,需要根据具体的数据库类型选择合适的连接方式。(本文是以GaussDB云数据库为实验平台)——结束
  • [技术干货] GaussDB数据库的元数据及其管理简介
    一、前言GaussDB是一种分布式的关系型数据库,元数据(表、列、视图、索引、存储过程等对象)是其重要的一部分。元数据是指描述数据的数据,包括数据的定义、结构、属性、关系等信息。本文以GaussDB物理数据库为主,结合元数据的概念简单介绍一下相关内容。二、元数据简介1、元数据定义按照传统的定义,元数据(Metadata)是描述数据的数据。元数据主要记录数据库应用系统中模型的定义、各层级间的映射关系、监控数据库应用系统的数据状态及ETL的任务运行状态等。在数据库应用系统中,元数据可以帮助数据库管理员和开发人员非常方便地找到其所关心的数据,并用于指导其进行数据管理和开发工作,提高工作效率。2、元数据分类元数据可根据不同的维度进行分类,按用途的不同,可以分为两类:技术元数据(Technical Metadata)和业务元数据(Business Metadata)。技术元数据是存储关于数据库应用系统技术细节的数据,是用于开发和管理数据库应用系统使用的数据。技术元数据即为技术资产,显示数据库、数据表、数据量的数量及其详情。业务元数据从业务角度描述了数据库应用系统中的数据,它提供了介于使用者和实际系统之间的语义层,使得不懂计算机技术的业务人员也能够“读懂”数据库应用系统中的数据。业务元数据包含业务资产和指标资产,业务资产显示业务对象、逻辑实体、业务属性的数量及其详情,指标资产显示业务指标及其详情。3、数据库元数据管理元数据管理是对数据采集、存储、加工和展现等数据全生命周期的描述信息,帮助用户理解数据关系和相关属性。 数据库的元数据指的是关于数据库对象(如表、列、索引、视图、存储过程等)的信息,这些信息描述了这些对象的结构和属性。并且最终目标是服务于数据库应用系统的高效实施(开发、管理、维护等)。三、GaussDB数据库的元数据管理1、GaussDB数据库的元数据管理通过登录GaussDB提供的“数据管理服务(DAS)” 工具,进入“库管理(Schema列表/对象列表/元数据采集)”主页面,可进行相关元数据的基础管理(如下图)。GaussDB数据库对象列表:GaussDB数据库元数据采集(DAS工具内置功能):Tip:对象列表数据来自实时查询(最多显示10000条),对数据库有一定的性能消耗,建议开启元数据自动采集2、通过“SQL + 系统表/系统视图/系统函数”的方式管理(采集)元数据1)获取表、视图及表字段等信息(1)PG_GET_TABLEDEF(tablename)系统信息函数,获取表定义信息。SELECT * FROM PG_GET_TABLEDEF(‘test_1’)返回类型:text。说明:pg_get_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息。(2)ADM_TABLES视图存储关于数据库下的所有表信息。主要字段:表的所有者、表名、存储表的表空间名、表的估计行数、是否为临时表等SELECT * FROM ADM_TABLES;(3)DB_ALL_TABLES视图存储当前用户所能访问的表或视图。主要字段:表或视图的所有者、表或视图的名称、表或视图所在的表空间。SELECT * FROM DB_ALL_TABLES;(4)DB_TABLES视图存储当前用户可访问的所有表。主要字段:表的所有者、表名、存储表的表空间名、表的估计行数、是否为临时表等。SELECT * FROM DB_TABLES;(5)ADM_TAB_COLUMNS视图存储关于表和视图的字段信息。数据库里每个表或视图的每个字段都在ADM_TAB_COLUMNS里有一行。主要字段:表的所有者、表的名称、列名、列的数据类型、列的字节长度等。SELECT * FROM ADM_TAB_COLUMNS;(6)DB_TAB_COLUMNS视图存储了当前用户可访问的表和视图的列的描述信息。主要字段:表的所有者、表的名称、列名、列的数据类型、列的字节长度等。SELECT * FROM DB_TAB_COLUMNS;2)获取定时任务信息MY_JOBS系统视图获取其定义信息。主要字段:作业创建者、作业执行者、作业对应的数据库名称、开始执行时间、结束时间、运行状态等。--获取定时任务信息SELECT * FROM MY_JOBS;3)获取索引信息PG_INDEXES系统视图获取表中的索引信息-- 根据表名获取对应的索引信息SELECT schemaname,tablename,indexname,tablespace,indexdefFROM PG_INDEXESWHERE TABLENAME = 'sell_info_full'AND INDEXNAME IS NOT NULL;4)获取存储过程、函数、触发器等信息DB_SOURCE视图存储当前用户可访问的存储过程、函数、触发器的定义信息。该视图同时存在于PG_CATALOG和SYS schema下。 主要字段:对象的所有者、对象名字、对象类型(function, procedure, trigger)、存储对象的文本来源等。SELECT * FROM DB_SOURCE;GaussDB数据库元数据的获取/采集主要是以系统表、视图、函数等方式获取,其元数据不止包含TABLES、VIEWS、COLUMNS、SOURCE、JOB,还包括USERS、COMMENTS等。 具体可根据实际业务需要进行采集管理。四、小结元数据管理从技术角度,元数据管理着企业的数据源系统、数据平台、数据仓库、数据模型、数据库、表、字段以及字段间的数据关系等技术元数据。从业务角度,元数据管理着企业的业务术语表、业务规则、质量规则、安全策略以及表的加工策略、表的生命周期信息等业务元数据。从应用系统角度,元数据管理为数据提供了完整的加工处理全链路跟踪,方便数据的溯源和审计,这对于数据的合规使用越来越重要。通过数据血缘分析,追溯发生数据质量问题和其他错误的根本原因,并对更改后的元数据进行影响分析等。GaussDB数据库的元数据管理是数据库系统管理工作的核心之一。它可以帮助用户更好地管理和维护数据库,提高数据的安全性和可靠性,减少数据丢失和损坏的风险。同时,元数据管理还可以帮助用户更好地理解和使用数据库,提高工作效率 。——结束
  • [技术干货] GaussDB的行存表与列存表的选择
    一、前言行存表和列存表是数据库中两种常见的数据存储方式。随着信息技术的飞速发展,数据存储和管理以及如何高效地存储和处理大量的数据已经成为了我们的一大挑战。为了解决这个问题,行存表与列存表应运而生,它们以其独特的优势在各个场景得到了高效的应用。GaussDB支持行、列存储,本文将简单给大家介绍一下行列存储在GassuDB数据库中的应用。二、行列存储表的概念1、定义行存表(Row-Based Table)是一种以行为单位进行数据的存储方式,每个记录都有一个唯一的行标识符。列存表(Column-Based Table)是以列为单位进行数据的存储方式,每个记录都有一个唯一的列标识符。2、优势与劣势行存表的优势在于其结构简单,易于理解和操作。由于数据按照行进行存储,因此在查询某一行数据时,可以快速定位到目标位置。此外,行存表在进行数据的插入、删除和更新操作时,效率相对较高。然而,行存表的缺点也比较明显,那就是它不适合进行复杂的数据分析和处理,因为这种存储方式无法充分利用数据的关联性,导致查询性能较差。列存表的优势在于其强大的查询功能和高效的存储效率。由于数据按照列进行存储,因此可以很容易地对某一列的数据进行聚合、分组等操作。此外,列存表还可以通过索引等技术提高查询性能。然而,列存表的缺点在于其结构复杂,不易于理解和操作。尤其是在进行数据的插入、删除和更新操作时,需要考虑到数据的完整性和一致性问题,因此操作起来相对繁琐。三、行列存储表的逻辑介绍GaussDB支持行、列存储,默认情况下,创建的表为行存储。行存储和列存储的差异如下图示。1、行存表与行存表在硬盘上的存储方式在基于行存储的数据库中,数据是按照行数据为基础逻辑存储单元进行存储的,一行中的数据在存储介质中以连续存储形式存在。2、列存表与列存表在硬盘上的存储方式在基于列式存储的数据库中,数据是按照列数据为基础逻辑存储单元进行存储的,一列中的数据在存储介质中以连续存储形式存在。因此,行存表和列存表在硬盘上的存储方式也不同。对于行存表,每个记录都占用一个连续的空间块,而对于列存表,每个属性都有一个单独的空间块,所有属性值都存储在一个连续的空间块中。四、行列存储表的使用建议和场景一般情况下,如果表的字段比较多(大宽表),查询中涉及到的列不多的情况下,适合列存储。如果表的字段个数比较少,查询大部分字段,那么选择行存储比较好。1、行存表使用场景及GaussDB SQL示例创建行存表,默认是创建的是行存表:--创建行存表,默认是创建的是行存表CREATE TABLE test_1(EMPLOYEE__ID CHAR(4),EMPLOYEE_NAME VARCHAR2(10),EMPLOYEE_SEX CHAR(2),EMPLOYEE_AGE INT,EMPLOYEE_SALARY MONEY);--查看已创建的表结构SELECT * FROM PG_GET_TABLEDEF(‘test_1’)2、列存表使用场景及GaussDB SQL示例创建列存表,使用关键字:WITH (ORIENTATION = COLUMN)--创建列存表,使用关键字:WITH (ORIENTATION = COLUMN)CREATE TABLE test_2(EMPLOYEE__ID CHAR(4),EMPLOYEE_NAME VARCHAR2(10),EMPLOYEE_SEX CHAR(2),EMPLOYEE_AGE INT,EMPLOYEE_SALARY MONEY)WITH (ORIENTATION = COLUMN);--查看已创建的表结构SELECT * FROM PG_GET_TABLEDEF(‘test_2’)五、小结行存表和列存表各有优缺点,适用于不同的场景。GaussDB支持行列存储。行、列存储模型各有优劣,在实际应用中,我们需要根据具体的需求选择合适的存储方式,以实现高效的数据管理和分析。无论是行存表还是列存表,都是我们在探索数据世界道路上的重要工具,值得我们深入研究和掌握。——结束
总条数:1667 到第
上滑加载中