• 第03篇_Gauss

    第01章_Gauss概述

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/AboutopenGauss/%E5%85%B3%E4%BA%8EopenGauss.html

    第一节 Gauss简介

    1. openGauss和GaussDB

    openGauss是华为基于PostgreSQL代码研发的分布式关系型数据库,采用木兰宽松许可证V2完全开源 ,而GaussDB在OpenGauss基础上添加了额外的专有功能和技术支持,包括更加强大的性能优化、更高的安全性和可靠性等,适用于要求更高的企业级应用场景。

     

     

    第二节 安装部署

    1. 安装须知

    1) 运行环境
    2) 硬件要求
    3) 技术指标

     

    2. 部署方案

     

    3. 安装步骤

    1) 单机服务器安装

    详细安装步骤可查阅官方文档,摘选单节点服务器安装重要步骤如下:

    注:

    1. 数据库安装完成后,默认生成名称为postgres的数据库。

    2. 通过脚本安装方式,在单台物理机只允许部署一个数据库系统,如需在单台物理机部署多个(不推荐),则需要通过命令行安装。

    3. 商业部署环境可联系华为工程师安装!

     

    2) 其它安装

     

    3) 卸载

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%8D%B8%E8%BD%BDopenGauss.html

     

     

    4. 数据库启停

     

    5. 例行维护

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DatabaseOMGuide/例行维护.html

     

     

    第三节 客户端

    1. 命令行客户端-gsql

    1) Linux用户连接

    数据库主节点机器上,可以直接使用Linux用户连接:

    注意:

    1. 管理员用户omm登录连接时,命令提示符显示DBNAME=#,如果为普通用户则显示DBNAME=>

    2. 客户端连接数据库后,如果空闲时间超过session_timeout,则会自动断开连接,可设置session_timeout为0来关闭超时设置。

     

    2) 数据库用户连接

    在其它机器上,可通过数据库用户进行连接,首先需安装gsql工具:

    安装好gsql工具后,远程连接命令如下:

    注意:

    1. 客户端机器与openGauss不在同一网段时,-h指定的IP地址应为Manager界面上所设的coo.cooListenIp2(应用访问IP)的取值。

    2. 禁止使用omm用户进行远程连接数据库。

     

    3) 常用操作

     

    2. 图形界面客户端-TPDSS

    OLTP Development Assistant(简称TPDSS)是OLTP数据库开发助手,帮助数据库开发人员便捷地构建应用程序,以图形化界面形式提供数据库关键特性,展示数据库的主要功能,简化数据库开发和应用构建任务。

    image-20231223144657942

     

    3. 应用程序客户端

    1) ODBC

    详情见:

    提示:

    1. openGauss也提供了专门的C应用程序接口libpq

     

    2) JDBC

    注意:

    1. 需在pg_hba.conf文件(安装目录datanode文件夹中)中添加客户端地址,如:host all all 127.0.0.1/32 sha256

    2. 若使用数据库连接池,则必须在归还连接前重置GUC参数删除临时表,否则可能会产生因为历史会话信息导致的对象冲突。

    3. 更多JDBC示例请参考:https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/Java.html

     

    3) Psycopg

    Psycopg是一种用于执行SQL语句的PythonAPI,可以为PostgreSQL、openGauss数据库提供统一访问接口,应用程序可基于它进行数据操作。Psycopg2对libpq进行封装,部分代码使用C语言实现,既高效又安全。

    详细使用步骤请参考:https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/GettingStarted/Python.html

     

     

    第四节 体系结构

    1. 软件架构

    img

    2. 分片架构

    单体架构->RAC架构->Shared-Nothing架构对比如下:

    image-20231226100848516

    Shared-Nothing架构优点:

     

    3. 核心组件

    image-20231226101638380

     

    3. 逻辑架构

    openGauss的数据节点负责存储数据,包含数据库、表空间、数据文件、表、数据块等。

    img

    注意:

    1. 数据库和表空间是交叉的关系,一个数据库的对象可分布在多个表空间,一个表空间可存放多个数据库的对象。

    2. 数据库和模式是从属的关系,一个数据库可以创建多个模式,多个模式之间对象可以同名。

    3. 表空间是物理存储和逻辑存储之间的一层抽象,向下依赖物理文件,向上抽象为逻辑结构。

     

    4. 内存结构

    img

     

     

     

     

     

     

    第02章_实例管理

    第一节 数据库

    1. 创建数据库

    注意:

    1. 一个openGauss实例包括多个数据库,但任何与服务器连接的用户都只能访问连接请求里声明的那个数据库。

     

    2. 查看和修改数据库

     

    3. 数据库参数配置

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DatabaseAdministrationGuide/设置参数.html

     

     

    第二节 用户

    1. 查询用户信息

     

    2. 创建或删除用户

    一个openGauss实例包括多个用户和用户组,这些用户和用户组在实例范围内是共享的。创建用户的语句如下:

     

    3. 修改或锁定用户

    注意:

    1. 如果用户输入密码次数超过一定次数(failed_login_attempts,默认10次),系统将自动锁定该帐户,默认1天后解锁。

     

     

    第三节 表空间

    表空间一般用于隔离磁盘IO,openGauss自带了两个表空间:

     

    1. 创建表空间

     

    2. 使用表空间

     

     

    第四节 模式

    1. 模式简介

    模式(schema)允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组。

     

    2. 创建或删除模式

     

    3. 使用模式

     

    4. 修改模式

     

     

    第五节 角色

    1. 查询和使用角色

    注意:

    1. 默认情况下,所有创建的用户和角色默认拥有PUBLIC所拥有的权限。

    2. openGauss提供了一组默认角色,以gs_role_开头命名,如gs_role_copy_files、gs_role_tablespace等。

     

    2. 创建或删除角色

    注意:

    1. 角色是拥有数据库对象和权限的实体。在不同的环境中角色可以认为是一个用户,一个组或者兼顾两者。

     

    3. 修改角色

     

     

    第六节 权限

    1. 权限简介

    数据对象创建后,创建用户即对象所有者,默认情况下(未开启三权分立),只有管理员和该用户才能访问该对象。

    管理员包括初始用户(安装用户)、具有SYSADMIN/OPRADMIN等属性的帐户,设置用户为管理员的语句如下:

    其它用户则可以按需授权,支持的授权类别有:SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、CREATE、CONNECT、EXECUTE、ALTER、DROP、COMMENT、INDEX、VACUUM和USAGE等。

    注意:

    1. 为了限制SYSADMIN的权限,在openGauss中,可以禁止其CREATEROLE属性(创建角色和用户的权限)和AUDITADMIN属性(查看和维护数据库审计日志的权限),请参考三权分立

     

    2. 系统权限

     

    3. 对象权限

    注意:

    1. 在授予对象权限时,需一并授予该对象所属模式的USAGE权限,否则只能看到对象名称,而不能实际访问对象

     

    4. 权限传递

     

     

    第七节 事务

    1. 事务控制命令

    注意:

    1. GaussDB Kernel 采用了多版本并发控制(MVCC)结合两阶段锁的方式来管理事务, 其特点是事务之间不阻塞。

    2. GaussDB Kernel 没有回滚段的概念,采用 VACUUM 线程定期清除历史版本数据。

     

     

    第八节 锁

    1. 查询锁

    注意:

    1. 可以通过 ps ux 查找正在运行的系统进程,然后使用 kill -9 pid 命令结束此进程。

     

    2. 表级锁

    1) 自动加锁
     申请该锁的语句
    ACCESS SHARESELECT
    ROW SHARESELECT FOR SHARE、SELECT FOR UPDATE
    ROW EXCLUSIVEUPDATEINSERTDELETE
    SHARE UPDATE EXCLUSIVEVACUUM、ANALYZE、CREATE INDEX CONCURRENTLY
    SHARECREATE INDEX
    SHARE ROW EXCLUSIVE任何SQL语句都不会自动请求这个锁模式(注意:该锁是独占锁,一个会话中只能获取一次)。
    EXCLUSIVE任何SQL语句都不会在用户表上自动请求这个锁模式,但可能在某些操作的时候,在系统表上请求
    ACCESS EXCLUSIVEALTER TABLEDROP TABLETRUNCATE,REINDEX。保证其加锁事务是可以访问该表的唯一事务

     

    当表级锁相互兼容时,才可以加锁成功

     ASRSRXSUESSRXXAX
    AS-------X
    RS------XX
    RX----XXXX
    SUE---XXXXX
    S--XX-XXX
    SRX--XXXXXX
    X-XXXXXXX
    AXXXXXXXXX

     

    2) 手动加锁

    注意:

    1. LOCK语句必须在事务中执行,否则会报错。没有UNLOCK TABLE命令,锁总是在事务结束时释放。

    2. 以ACCESS SHARE模式加锁需要表的SELECT权限,其他形式的LOCK需要UPDATE和/或DELETE权限。

     

     

    第九节 备份恢复

    1. 逻辑备份与恢复

    参考:

    1. 概述:逻辑备份与恢复

    2. 备份:使用gs Dump和gs Dumpall命令导出数据

    3. 恢复:使用gs Restore命令导入数据

     

     

    2. 物理备份与恢复

     

     

    3. 闪回恢复

     

    4. 数据导入导出

     

     

    第十节 数据字典

    1. 查询对象信息

     

    2. 查询分布式对象信息

     

    3. 查询统计信息

     

    4. 系统视图

    image-20231226133350820

     

     

    第03章_数据对象

    第一节 数据类型

    1. 字符型

    数据类型说明
    CHAR(size)定长字符串,不足补空格,最大为10MB
    VARCHAR(size)/VARCHAR2(size)变长字符串,可存储10MB字节或字符

    注意:

    1. PG兼容性下,CHAR和VARCHAR以字符为计数单位,其它兼容性以字节为计数单位,即CHAR(3)只能存放一个UTF-8编码字符。

    2. ORA兼容性下,数据库将空字符串作为NULL处理。

     

    2. 数值型

    数据类型说明
    NUMBER(p,s)/DECIMAL(p,s)/NUMERIC(p,s)精确数值类型。p为总位数,s为小数位数。
    TINYINT/SMALLINT/INTEGER/BIGINT分别占1/2/4/8个字节,取值范围随之增加。
    FLOAT/Double浮点数,不精确小数,不推荐使用

    注意:

    1. 将字符串转换成整数类型时,如果输入不合法,MYSQL兼容性会将输入转换为0,而其它兼容性则会报错。

     

    3. 日期/时间

    数据类型说明
    Date日期时间类型
    TIMESTAMP[(p)]日期和时间。p表示小数点后的精度,取值范围为0~6。

    注意:

    1. ORA兼容性下,数据类型DATE会被替换为TIMESTAMP(0) WITHOUT TIME ZONE。

     

    4. 其它数据类型

    数据类型说明
    SMALLSERIAL/SERIAL/BIGSERIAL序列整型,分别占用2/4/8字节,会在后台自动创建一个对应的Sequence,用来实现自增。
    BOOLEAN布尔类型,取值有 true-真 false-假 null-未知 三种

    注意:

    1. 高斯开发规范中不建议使用序列整型。

     

    第二节 数据表

    1. 查询表信息

     

    2. 创建表

    注意:

    1. 目前仅支持对数据库定义字符集,不支持对表、字段等其他对象定义字符集

     

    3. 修改表

     

     

    第三节 约束

    1. 添加约束

     

    2. 修改约束

     

     

    第四节 索引

    1. 创建索引

     

    2. 查询和使用索引

     

     

    第五节 视图

    1. 创建视图

    注意:

    1. OR REPLACE不能改变原有视图的列名、列类型或列顺序等,只可在列表末尾添加其他的列。

     

    2. 物化视图

    物化视图是相对普通视图而言的,普通视图是虚拟表,而物化视图实际上就是存储SQL执行语句的结果,可以直接使用数据而不用重复执行查询语句,从而提升性能。按照刷新方式物化视图分为两种:

    注意:

    1. 目前物化视图创建语句仅支持基表扫描语句或者UNION ALL语句。

     

     

    第六节 序列

    1. 创建序列

     

    2. 查看和使用序列

     

    3. 修改序列

     

     

    第七节 MOT(内存表)

    1. MOT简介

    MOT(Memory-Optimized Table)是一种将数据和索引存储在内存中,将事务日志持久化的内存表,可以同时做到高性能和ACID。

     

    2. MOT的基本使用

     

     

    第八节 本地分区表

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/SQLReference/分区表.html

     

    1. 范围分区

    指定一个或多个列划分为多个范围,每个范围创建一个分区,用来存储相应的数据。

     

    2. 列表分区

    直接按照一个列或者多个列上的值来划分出分区。

     

    3. 间隔分区

    是一种特殊的范围分区,新增了间隔值定义。当插入记录找不到匹配的分区时可以根据间隔值自动创建分区。

     

    4. 哈希分区

    根据表的一列,为每个分区指定模数和余数,将要插入表的记录划分到对应的分区中。

     

    5. 查询和修改分区

     

     

    第九节 分片表(数据分布)

    1. 哈希分片

    对指定的列进行Hash,通过映射,把数据分布到指定DN。

     

    2. 列表分片

    对指定列按照具体值进行映射,把数据分布到对应 DN。

     

    3. 范围分片

    对指定列按照范围进行映射,把数据分布到对应 DN。

     

    4. 复制表/广播表

    表的每一行存在所有数据节点(DN)中,即每个数据节点都有完整的表数据,主要适用于记录集较小的表。

     

    第04章_数据操作

    第一节 数据修改

    1. 数据插入

     

    2. 数据合并

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DatabaseOMGuide/使用合并方式更新和插入数据.html

     

    3. 表复制

     

     

    第二节 数据查询

     

     

    第三节 内置函数

    1. 数值函数

     

    2. 字符串函数

     

    3. 日期时间函数

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/BriefTutorial/时间-日期函数和操作符.html

     

    4. 类型转换函数

     

    5. 滤空函数

    第05章_性能优化

    第一节 优化思路概述

    1. 影响性能因素

    一般影响数据库性能的因素有以下几类:

     

    2. 性能瓶颈分类

    性能问题通常是由某种特定资源的过度使用导致的,而这种过度使用的资源就是这个系统的瓶颈。数据库服务器常见的性能瓶颈问题主要是由CPU内存I/O网络资源使用情况造成的。

     

    3. 性能调优流程

    image-20231226135905210

     

    4. 性能优化方法论

    image-20231226135945465

     

     

    5. 整体信息问题分析概览

    image-20231226140042999

     

    6. 单语句性能问题概览

    image-20231226140116173

     

     

    第二节 统计信息

    1. 会话信息

     

    2. 连接信息

     

    3. 表统计信息

     

    4. 慢SQL信息

     

    5. 分片倾斜信息

     

     

    第三节 执行计划

    1. SQL执行流程

    img

    步骤说明
    语法&词法解析按照约定的SQL语句规则,把输入的SQL语句从字符串转化为格式化结构(Stmt)。
    语义解析将“语法&词法解析”输出的格式化结构转化为数据库可以识别的对象。
    查询重写根据规则把“语义解析”的输出等价转化为执行上更为优化的结构。
    查询优化根据“查询重写”的输出和数据库内部的统计信息规划SQL语句具体的执行方式,也就是执行计划。
    查询执行根据“查询优化”规划的执行路径执行SQL查询语句。底层存储方式的选择合理性,将影响查询执行效率。

     

    2. 获取执行计划

     

    3. 执行计划详解

    1) 简单示例

    以如下SQL语句为例:

    执行EXPLAIN的输出为:

    img

    表扫描算子,用Seq Scan的方式扫描表t2。这一层的作用是把表t2的数据从buffer或者磁盘上读上来输送给上层节点参与计算。

    Hash算子,作用是把下层计算输送上来的算子计算hash值,为后续hash join操作做数据准备。

    表扫描算子,用Seq Scan的方式扫描表t1。这一层的作用是把表t1的数据从buffer或者磁盘上读上来输送给上层节点参与hash join计算。

    join算子,主要作用是将t1表和t2表的数据通过hash join的方式连接,并输出结果数据。

     

    2) 表访问方式

     

    3) 表连接方式

     

    4) 运算符

     

     

    4. 执行信息简介

    以如下SQL语句为例:

    执行EXPLAIN PERFORMANCE输出为:

    img

     

     

    第四节 调优方法

    1. 更新统计信息

     

    2. 关键参数调整

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/操作系统参数调优.html

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/SQL调优关键参数调整.html

     

    3. SQL编写建议

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/DeveloperGuide/SQL编写.html

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/经验总结-SQL语句改写规则.html

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/典型SQL调优点.html

    注意:

    1. concat()now()等函数生成的执行计划无法下推,会导致查询性能严重劣化。

     

    4. 实际调优案例

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/实际调优案例.html

     

     

    第五节 Plan Hint

    https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/PerformanceTuningGuide/使用Plan-Hint进行调优.html

     

    1. Plan Hint简介

     

    4. 简单示例

     

     

    第六节 分布式优化

    1. 分布式执行流程

    image-20231226141603387

     

    2. 分布式优化思路

     

    3. 分布式执行计划

    1) REMOTE_FQS_QUERY

    image-20231226141933131

     

    2) STREAM GATHER

    image-20231226142038160

     

    3) PGXC

    image-20231226142306429

     

    第06章_过程操作

    第一节 存储过程

    1. 存储过程简介

     

     

    第二节 存储函数

    1. 存储函数简介

     

     

    第三节 触发器

    1. 事件触发器(DDL触发器)

    事件触发器会在指定的ddl事件发生时自动执行函数,目前仅在PG兼容模式下可用。

     

    2. 数据变更触发器(DML触发器)

     

     

    附录

    一、Gauss与Oracle差异对比

    注:本对比中Gauss采用 V500R002C10 版本,Oracle采用 Oracle11.2.0.4 版本。

     

    1. 基本特性差异

     

    2. 字段类型差异

     

    3. 常用函数差异

     

    4. GaussDB分布式功能限制

     

    二、应用开发简介

    1. 安装驱动

    安装Jar包

    mvn install:install-file -Dfile=./postgresql.jar -DgroupId=org.opengauss -DartifactId=opengauss-jdbc -Dversion=2.0.0 -Dpackaging=jar

     

    导入Jar包

     

    2. mybatis-config.xml