gaussDB
2024-11-18 19:13:46 0 举报
AI智能生成
GaussDB数据库认证考试知识点整理
作者其他创作
大纲/内容
第一章
介绍
介绍
全栈自研
鲲鹏生态
高性能
分布式执行框架
GTM-Lite技术
NUMA-Aware事务处理
32节点/1500万tpmc事务;3节点500G<200s,100G<500s,单集群数据量超过4PB
高可用
跨AZ/Region容灾,并行回放极致RTO
RPO=0,RTO<30秒
Recovery Time Objectives
Recovery Point Objectives
高扩展
Scale-out在线横向扩展
新增分片支持在线重分布
高安全性
访问控制、加密认证、数据库审计、动态数据脱敏、全密态
sharding nothing架构
优点:易于扩展、内部处理自动化并行、优化I/O、增加节点扩展性能
关键角色
OM
运维管理模块(Operation Manager)。提供集群日常运维、
配置管理的管理接口、工具
配置管理的管理接口、工具
CM
集群管理模块(Cluster Manager)。管理和监控分布式系
统中各个功能单元和物理资源的运行情况,确保整个系统
的稳定运行
统中各个功能单元和物理资源的运行情况,确保整个系统
的稳定运行
GTM
全局事务管理器(Global Transaction Manager),负责生
成和维护全局事务ID、事务快照、时间戳、sequence信息
等全局唯一的信息
成和维护全局事务ID、事务快照、时间戳、sequence信息
等全局唯一的信息
CN
协调节点(Coordinator Node)。负责接收来自应用的访问
请求,并向客户端返回执行结果;负责分解任务,并调度
任务分片在各DN上并行执行
请求,并向客户端返回执行结果;负责分解任务,并调度
任务分片在各DN上并行执行
DN
数据节点(Data Node)。负责存储业务数据(支持行存、
列存、混合存储)、执行数据查询任务以及向CN返回执
行结果
列存、混合存储)、执行数据查询任务以及向CN返回执
行结果
ETCD
分布式键值存储系统(Editable Text Configuration
Daemon)。用于共享配置和服务发现(服务注册和查找)
Daemon)。用于共享配置和服务发现(服务注册和查找)
Storage
服务器的存储资源
部署形态
主备部署
基于数据库日志复制的热备,单机性能可满足需求的情况下,提供高可用
全分布式部署
高扩展、高可用
数据分布策略
REPLICATION
每个数据节点都有完整的表数据
HASH
对指定的列进行Hash,通过映射,把数据分布到指定DN
RANGE
对指定列按照范围进行映射,把数据分布到对应DN
LIST
对指定列按照具体值进行映射,把数据分布到对应DN
全局强一致的分部署事务
ACID :Atomicity、Consistency、Isolation、Durability
事务隔离级别
READ UNCOMMITTED
READ COMMITTED:
REPEATABLE READ
SERIALIZABLE暂不支持
全局事务管理器GTM
GTM-Lite
分布式事务强一致性读,提高并发处理能力,降低中心节点负载
无锁、多版本、高并发事务
分布式强一致,提供全局事务快照和提交号管理,强一致性,无中心节点性能瓶颈
GTM-Free
不支持分布式强一致性读,消除GTM单点瓶颈,事务处理性能更高
高可用
硬件冗余、实例冗余、数据冗余
同城跨AZ双活
双写,RPO=0,RTO<60s
两地三中心容灾
RPO=10s,RTO<10min
在线横向扩展
1、同步DN元信息
分钟级
2、数据扩容重分布
与数据量相关,小时级
3、表切换
秒级
负载均衡
多CN提供统一入口
内网模式:JDBC Client做负载均衡,CN感知时间30秒
外网模式:ELB做负载均衡,故障感知时间默认3秒
备份与恢复
单租户OBS带宽15G
单分片备份2T约4小时,5分钟备份数据量约200M
支持增量备份和全量备份
在线平滑升级
热补丁、灰度、滚动升级
技术指标
DN分片最大256,单表最大32T*节点数,单行最大1600*1G,单字段最大1G,
单表行数/单表索引个数/单表约束个数均2的23次方,单表列数1600,对象名63字节,并发连接10w,
单表行数/单表索引个数/单表约束个数均2的23次方,单表列数1600,对象名63字节,并发连接10w,
AZ内:RPO = 0、RTO < 10s;AZ外:RPO = 0、RTO < 60s
客户端工具
gsql
运行在linux操作系统
元命令:反斜杠开头命令(不带引号)
DAS
华为云数据管理服务
数据库列表功能
SQL操作功能
库管理功能
导入功能
导出功能
Data Admin Service
DBeaver
图形化界面
第二章
应用程序开发指引
应用程序开发指引
数据库驱动
接入认证
基于主机的认证
口令认证
SSL加密
JDBC
java数据库连接
java数据库连接
JAVA标准
子主题
主要的两个包
java.sql
基本功能,生成链接、执行语句、准备语句、批处理
javax.sql
扩展功能,连接管理,分布式事务,连接池,行集
三层
JDBC API
JDBC Driver Manager
JDBC Driver
Gauss JDBC
支持SHA256加密方式登录
支持对接实现sf4j接口的第三方日志框架
支持连接级别的分布式负载均衡
支持容灾切换
支持对接实现sf4j接口的第三方日志框架
支持连接级别的分布式负载均衡
支持容灾切换
基本操作
加载驱动、连接数据库、执行SQL语句、处理结果集、关闭连接
DriverManager
管理数据库的驱动
DriverManager.getConnection
Connection接口
Connection接口表示应用程序与数据库的连接对象
Statement接口
创建Statement对象:使用JDBC连接对象的createStatement()方法返回一个Statement对象
运行查询并检索结果集对象:如果要查询数据库,使用Statement对象的executeQuery()方法,
此方法将SQL语句作为输入,并返回ResultSet对象
此方法将SQL语句作为输入,并返回ResultSet对象
Statement - 处理结果
在执行查询后,请使用ResultSet的next()方法遍历结果
ResultSet接口
ResultSet对象具有指向其当前数据行的光标
next()、previous()、beforeFirst()、afterLast()、first()、last()、absolute()、relative()
ResultSetMetaData接口
用于收集ResultSet的所有元数据信息,例如列的类型和
属性,列数,列的名称,列的数据类型等。
属性,列数,列的名称,列的数据类型等。
PreparedStatement接口
PreparedStatement接口表示预编译的 SQL 语句的对象,是Statement的子接口,它允许数据库
预编译SQL语句(这些SQL语句通常都带有参数),以后每次只改变SQL命令的参数,避免数据库
每次都需要编译SQL语句,因此性能更好
预编译SQL语句(这些SQL语句通常都带有参数),以后每次只改变SQL命令的参数,避免数据库
每次都需要编译SQL语句,因此性能更好
PreparedStatement
与Statement不同,PreparedStatement可以执行带有不同输入参数
集的语句
集的语句
批处理
addBatch()、executeBatch()
使用游标获取结果
DataSource
用于提供到此DataSource对象所表示的物理
数据源的连接
数据源的连接
JDBC负载均衡
autoBalance=[value]
false
关闭
轮询
true
balance
roundrobin
优先级
priority n
前2个的优先级
随机
autoBalance= shuffle
周期刷新可使用参数refreshCNIpListTime配置,默认10秒
读写分离与故障转移
targetServerType=[value]
读写节点
targetServerType=master
只读节点
targetServerType=slave
只读优先
targetServerType=preferSlave
任意节点
targetServerType=any
日志记录
日志级别
loggerLevel={OFF、INFO、DEBUG、TRACE}
日志目录
loggerFile=目录和文件名
日志框架
logger
slf4j-API 、JdkLogger
ODBC
开放式数据库连接
开放式数据库连接
驱动
unixODBC和iODBC
安装配置
常用接口
SQLAllocHandle
申请句柄资源
SQLFreeHandle
释放与指定环境、连接、语句或描述符相关的资源
SQLBindCol
将数据缓冲区绑定到结果集的列中
SQLBindParameter
将SQL语句中的一个参数标志和一个缓冲区绑定起来
SQLColAttribute
返回结果集中某一列的描述符信息
SQLConnect
在驱动程序和数据源之间建立连接
SQLDisconnect
关闭一个与特定连接句柄相关的连接
SQLExecDirect
使用参数的当前值,执行一条准备好的语句
SQLExecute
使用标记参数的当前值,执行一条准备好的语句
SQLFetch
从结果集中取下一行的数据,并返回所有被绑定列的数据
SQLPrepare
准备一个将要进行的SQL语句
SQLGetData
返回结果集中某一列的数据
SQLGetDiagRec
返回诊断记录中的信息
SQLSetConnectAttr
设置控制连接方面的属性
SQLSetEnvAttr
设置控制环境方面的属性
SQLSetStmtAttr
设置语句相关属性
常见问题
想要把多条语句放在一个事务中,可以关闭autocommit开关,并且在事务结束时调用SQLEndTran
连续执行两条select语句会报错the cursor is open
Psycopg
是一种用于执行SQL语句的PythonAPI
加载驱动
连接db
执行sql
处理结果集
关闭连接
connection类
处理gaussdb的连接,是线程安全的,可以在多个线程之间共享
可以作为context管理器,context包装了事务,如果context成功退出则提交事务
可以作为context管理器,context包装了事务,如果context成功退出则提交事务
connect方法,执行SQL语句,返回新的connection
Cursor类
游标对数据库的任何更改,都可以立即被其他游标看到
cursor方法
返回cursor对象
execute方法
执行给定的SQL语句,可执行被参数化的SQL语句
executemany方法
能够执行SQL命令所有参数序列或序列中的SQL映射。但是
此方法并不比execute()在循环中执行快
此方法并不比execute()在循环中执行快
fetchone方法
执行给定的SQL语句,能够提取查询结果集的下一行,并返回一个元组
fetchall方法
执行给定的SQL语句,能够获取查询结果的所有(剩余)行,并将它们作为元组
列表返回
列表返回
copy_from方法
从类文件对象文件中读取数据,并将它们附加指定的表中
copy_to方法
将指定名称的表的内容写入类文件对象file
第三章
开发设计建议
开发设计建议
数据库命名和设计建议
避免使用保留或非保留关键字命名数据库对象
避免使用双引号括起来的字符串来定义数据库对象名称,除非需要限制数据库对象名称
的大小写。数据库对象名称大小写敏感会使定位问题难度增加
的大小写。数据库对象名称大小写敏感会使定位问题难度增加
数据库对象命名风格务必统一
多个单词,下划线分隔
变量具有描述性
表对象具有表特征
临时表:tmp_+后缀
非日志:ul_+后缀
外表:f_+后缀
不能用“redis_”为前缀
使用schema进行业务隔离
Database
业务创建新的database,不使用默认库
编码使用UTF-8
兼容性
mysql
默认
字符串转整形时,输入不合法被转换成0
teradata
oracle
空字符串作为null,date被替换为timestamp(0)without time zone
postgreSQL语法
char和varchar以字符为计数单位,其他以字节为计数单位
schema
用户不具有sysadmin权限或不是owner,要访问schema下对象,需要同时给用户赋予schema的usage权限和对象的权限
要在schema下创建对象,需要授予创建create权限
owner具有schema下对象所有权限
表设计
选择合适的分布列,避免数据切斜
将表的扫描压力分散在各个dn上,避免扫描压力集中
分区表的剪枝机制,可以减少数据的扫描量
减少随机IO,通过聚簇/局部聚簇,实现热数据的连续存储,减少随机IO
避免数据shuffle(在节点传输)
字段设计
高效数据类型建议
整数>浮点数>numeric
多张表的同一含义字段使用相同数据类型
字符串,使用变长字符串类型,指定最大长度
不建议使用定长字段
约束
优先从业务层附默认值,其次使用default约束
不为null的设置not null约束
其他约束显式命名
局部聚簇 PCK
一张表只能建一个pck,可包含多列,一般不超过2列
可以通过min/max稀疏索引实现事实表快速过滤,选区分度大的列建PCK
一般形式col op const,其中col为列名,op为操作符 =、>、>=、
<=、<,const为常量值
<=、<,const为常量值
唯一约束
命名:UNI+字段
行存表、列存表均支持唯一索引
主键约束
行存、列存均支持
命名:PK+字段名
检查约束
行存支持,列存不支持
命名:CK+字段名
视图
除非强依赖,否则不建议视图嵌套
视图中避免排序操作
关联表
表之间关联字段尽量少
关联字段类型应一致
命名体现关联关系,如命名相同
表设计最佳实践
分布方式
hash
hash散列分布,适合数据量大的事实表
提升读写性能
Replication
每个DN上都有全量数据
小表、维度表
join时避免数据重分布,减少网络开销,减少了plan segment数量
缺点:数据冗余
Range
按范围分布到DN,用户自定义规则
选择灵活,有一定数据抽象能力要求
List
指定列值集映射分布到DN,用户自定义规则
选择灵活,有一定数据抽象能力要求
选择分布列
Hash
列值应离散,保证均匀分布
考虑选择查询的连接条件为分布列,join可下推到dn执行,减少DN间通讯
数据倾斜性检查
dn相差5%视为倾斜,10%以上需要调整分布列
分区表
优点:改善查询性能、增加可用性、方便维护
范围分区表
缺点:索引扫描代价高
建议:按时间或地区做Range分区
数据类型选择
高效数据类型int>浮点数>字符串
尽量使用短字段
表关联列,使用一致的数据类型
分布式事务
尽量避免分布式事务设计
SQL编写最佳实践
where
建议包含所有分布键等值查询条件
避免使用函数或表达式
索引失效
避免使用相同表字段比较
过滤条件排序,较小记录排前面
避免使用“!=”与null做比较
多用等值操作,少用非等值操作
禁止对索引字段使用“!=”
模糊匹配,%不放在前面
in不超过500
避免涉及隐式数据类型转换
如varchar转bigint
select
避免对大字段执行order by,Group By引起排序的曹组
避免使用count获取大表行数
避免select *
避免目标列使用子查询
不用select(col)替代count(*)
count(distinct col)用来计算不充分,且非NULL的数量
insert
insert on DUPLICATE KEY UPDATE不支持对主键或唯一约束列上执行update,
多条数据之间不存在主键/唯一约束冲突
禁止对存在多个唯一约束的表执行insert on DUPLICATE KEY UPDATE
多条数据之间不存在主键/唯一约束冲突
禁止对存在多个唯一约束的表执行insert on DUPLICATE KEY UPDATE
批量插入用INSERT INTO TABLE1 VALUES (),(),()
update
不支使用limit
不支持多表更新
必须有where
不支持更新多个列时,被更新列是更新源
禁止使用order by,group by
使用主键,索引做条件
delete
不支持使用limit
GMT-FREE模式下不允许跨节点事务,
删除hash分布表数据时,必须在where中指定分布列等值过滤条件
删除hash分布表数据时,必须在where中指定分布列等值过滤条件
不支持多表删除
必须有where
不使用order by 、group by
清空表用truncate
where结合主键/索引
关联查询
嵌套深度必须小于8
指定个表连接条件on,避免产生笛卡尔积
指明连表方式,避免用join,应该用inner/left/cross/right join
多表使用别名
整形高于numeric和浮点型
连表字段类型相同
少用嵌套子查询,多用表关联
过滤is not null条件
子查询
禁止出现重复子查询
少用标量子查询
结果为1个值
select目标列中不要使用子查询,计划无法下推影响性能
子查询嵌套不超过2层
事务
GTM-FREE模式下,跨节点事务会报错
大对象不支持事务
避免拼接多条sql为一条语句执行
其中包含对象操作时,如果中间对象操作失败,会重新开启新
事务执行后续语句
事务执行后续语句
第四章
GaussDB数据库迁移
GaussDB数据库迁移
UGO
数据迁移服务
Database and Application Migration UGO
数据迁移服务
Database and Application Migration UGO
专注于异构数据库对象迁移和
应用迁移的专业化工具
应用迁移的专业化工具
数据库迁移评估
创建评估项目
基础信息
数据库版本、源库采集时间、数据库连接信息、网络稳定性
预检查
用户是否有DDL权限及数据库动态视图访问权限
模式选择
默认可访问所有schema
对象类型选择
INDEX、SEQUENCE、SYNONYM、TABLE、FUNCTION、VIEW、PACKAGE、PROCEDURE、TRIGGER、TYPE_BODY
任务确认
查看任务详情
查看评估任务信息
源库基本信息、性能信息、特征分析
所有对象的详情
源库到目标库的兼容性
确认需要迁移的目标库
收集源数据库信息
源数据库分析
选择数据库
数据库对象迁移任务
创建迁移项目
目标数据库类型与版本
目标数据库连接细腻系
测试连接后创建
迁移计划
用户密码设置
迁移
迁移配置
源库与目标库之间表空间的映射配置
进行迁移
触发迁移,查询错误报告,将源SQL转换成目标SQL
对象校正
失败对象,手工校正
查询对象校正,再次验证
验证&应用
DRS
数据复制服务
Data Replication Service
数据复制服务
Data Replication Service
数据库在线迁移和数据库实时同步的云服务
流程:调研、方案制定、技术验证、迁移演练、迁移实施
业务自由回滚方案,一个正向DRS+一个反向DRS链路
技术原理
全量同步
增量同步
其他库到GuassDB同步任务
流动方向:入云
源库引擎
ORACLE
目标引擎
网络类型
同步类型:全量+增量/全量
源库和目标库的连接信息
同步对象
表级,库级
全量配置
同步类型
流模式
分片记录数
同步位点
增量配置
日志抓取并发数
回放任务并发数
回放启动策略
冲突策略
预校验
启动同步任务
查看同步进度
同步对比
对象级:数据库、索引、表、视图
数据级:表的行数和内容对比
GaussDB到其他库的同步任务
填写源库和目标库的连接信息
常见问题
源库权限
目标库权限
主键冲突、列不存在、长度超长
第五章
GaussDB数据库操作与管理
GaussDB数据库操作与管理
数据库对象基本操作
模式(schema)
创建:postgres=# CREATE SCHEMA test_sche {AUTHORIZATION test_user1};
修改:Alter schema
删除:DROP SCHEMA
用户
用户、角色、系统权限、对象权限
角色和用户之间的区别在于角色默认没有login权限
分类:初始用户/系统管理员(SYSADMIN)
三权分立:将【系统管理员】的部分权限分给【安全管理员】和【审计管理员】
开启三权分立:enableseparationofduty=on
权限管理
授权:GRANT
SELECT、INSERT、UPDATE、DELETE、TRUNCATE、
REFERENCES、CREATE、CONNECT、EXECUTE和USAGE
REFERENCES、CREATE、CONNECT、EXECUTE和USAGE
撤销授权:REVOKE
对象隔离特性:开启后,数据库默认为系统表增加行级访问控制策略
开启对象隔离特性:ALTER DATABASE database_name ENABLE PRIVATE OBJECT
表空间
是操作系统的一个目录,可以存在多个,存储的是所包含的数据库的物理文件
管理功能依赖于文件系统
管理功能依赖于文件系统
优点
可以在不同的分区上创建和使用表空间
可以设置占用的磁盘空间,防止表空间占相同分区的其他空间
可控制数据库占用的磁盘空间,90%时只读模式
自带2个表空间
pg_default
存储系统目录、用户表、用户表index、临时表、临时表index
pg_global
存放系统字典表
管理
创建
postgres=# create tablespace tbs2 relative location ‘tablespace/tbs2’ maxsize ‘100G’;
查询
select * from pg_tablespace_location((select oid from pg_tablespace where spcname='tbs2'));
修改
postgres=# alter tablespace tbs3 rename to tbs4; --修改表空间名
postgres=# alter tablespace tbs4 owner to jack; --修改表空间所有者
postgres=# alter tablespace tbs4 resize maxsize unlimited; --修改表空间上限大小
postgres=# alter tablespace tbs4 reset (random_page_cost); --修改表空间属性
postgres=# alter tablespace tbs4 owner to jack; --修改表空间所有者
postgres=# alter tablespace tbs4 resize maxsize unlimited; --修改表空间上限大小
postgres=# alter tablespace tbs4 reset (random_page_cost); --修改表空间属性
删除
drop tablespace tbs4;
数据库概述
两个模版数据库template0、template1
创建数据库默认拷贝template0
数据库管理
创建
create database mydb3 with owner=jack encoding=‘UTF-8’ LC_COLLATE=‘zh_CN.UTF-8’
LC_CTYPE=‘zh_CN.UTF-8’ DBCOMPATIBILITY=‘A’ TABLESPACE=tbs1 CONNECTION LIMIT=1000; --指定了数据库mydb
的拥有者(owner)、编码(encoding)、字符集(LC_COLLATE)、字符分类(LC_CTYPE)、兼容模式(DBCOMPATIBILITY)、默
认表空间(TABLESPACE)、并发连接限制(CONNECTION LIMIT)
LC_CTYPE=‘zh_CN.UTF-8’ DBCOMPATIBILITY=‘A’ TABLESPACE=tbs1 CONNECTION LIMIT=1000; --指定了数据库mydb
的拥有者(owner)、编码(encoding)、字符集(LC_COLLATE)、字符分类(LC_CTYPE)、兼容模式(DBCOMPATIBILITY)、默
认表空间(TABLESPACE)、并发连接限制(CONNECTION LIMIT)
修改
postgres=# alter database mydb3 rename to mydb4; --修改数据库名
postgres=# alter database mydb2 owner to user1; --修改数据库所有者
postgres=# alter database mydb2 set tablespace tbs1; --修改数据库所属表空间
postgres=# alter database mydb2 owner to user1; --修改数据库所有者
postgres=# alter database mydb2 set tablespace tbs1; --修改数据库所属表空间
删除
postgres=# drop database mydb4;
查询
postgres=# \l –使用元命令查看数据库postgres=# select * from pg_database; --通过系统表查看数据库
普通表
一行叫元组tuple
每个表有多个列,也称为属性attribute
存储模型
行存表(默认)
以行式存储,每行所有属性存储到一起
适合查询一行所有属性,insert,update效率高
列存表
以列示存储,每列多个记录存储到一起
适用于海量数据查询,减少磁盘访问数据量,但insert、update较为麻烦
OLTP场景,推荐行存储
OLAP场景,推荐列存储,存储在分区上
普通表管理
行存表创建
create table emp1 as select * from emp where sal<2000
create table emp2 as table emp;
CREATE TABLE IF NOT EXISTS warehouse_t1 -- 表不存在时才创建,使得当该表存在时该建表语句不会报错
(W_WAREHOUSE_SK INTEGER NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, -- 事务结束时检查字段是否有重复
W_STATE CHAR(2) DEFAULT ‘GA’, -- 缺省值为'GA'
) TABLESPACE
(W_WAREHOUSE_SK INTEGER NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, -- 事务结束时检查字段是否有重复
W_STATE CHAR(2) DEFAULT ‘GA’, -- 缺省值为'GA'
) TABLESPACE
CREATE UNLOGGED TABLE warehouse_t2 -- 创建非日志表,即不写入预写日志
(W_WAREHOUSE_SK INTEGER PRIMARY KEY, -- 主键约束
W_WAREHOUSE_ID CHAR(16) NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20) UNIQUE -- 唯一键约束
CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) -- 检查列约束
) WITH(fillfactor=70);
(W_WAREHOUSE_SK INTEGER PRIMARY KEY, -- 主键约束
W_WAREHOUSE_ID CHAR(16) NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20) UNIQUE -- 唯一键约束
CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) -- 检查列约束
) WITH(fillfactor=70);
列存表创建
CREATE TABLE warehouse_t3
(W_WAREHOUSE_SK INTEGER NOT NULL,
W_WAREHOUSE_ID CHAR(16) NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20),
W_GMT_OFFSET DECIMAL(5,2),
PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) -- 局部聚簇存储
) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); -- 带有压缩特性的列存储表(列存储表不支持约束)
(W_WAREHOUSE_SK INTEGER NOT NULL,
W_WAREHOUSE_ID CHAR(16) NOT NULL,
W_WAREHOUSE_NAME VARCHAR(20),
W_GMT_OFFSET DECIMAL(5,2),
PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) -- 局部聚簇存储
) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); -- 带有压缩特性的列存储表(列存储表不支持约束)
修改属性
alter table emp1 modify sal number(10,2); -- 修改列属性
rename column ename to name; -- 重命名列
add primary key (empno); -- 添加主键约束
add constraint chk_dept check (deptno is not null); -- 添加check约束
add constraint fk_dept foreign key (deptno) references dept(deptno); -- 添加外键约束
modify sal constraint chk_sal not null; -- 修改列约束条件
rename constraint chk_dept to chk_deptno; -- 重命名约束
set schema jack; -- 设置所属schema
rename to emp2; -- 重命名表
alter table emp1 modify sal number(10,2); -- 修改列属性
rename column ename to name; -- 重命名列
add primary key (empno); -- 添加主键约束
add constraint chk_dept check (deptno is not null); -- 添加check约束
add constraint fk_dept foreign key (deptno) references dept(deptno); -- 添加外键约束
modify sal constraint chk_sal not null; -- 修改列约束条件
rename constraint chk_dept to chk_deptno; -- 重命名约束
set schema jack; -- 设置所属schema
rename to emp2; -- 重命名表
删除表
drop table {table_name}
行级访问控制
alter table {table_name} enable row level security
分区表
逻辑上的一张表根据某种方案分成几张物理块进行存储
是一张逻辑表,不存储数据,数据实际是存储在分区上
是一张逻辑表,不存储数据,数据实际是存储在分区上
分区方案
范围分区
CREATE TABLE part_tbl1 (a int, b int)
PARTITION BY RANGE(a)
(PARTITION part1 VALUES LESS THAN (10),
PARTITION part2 VALUES LESS THAN (100),
PARTITION part3 VALUES LESS THAN (MAXVALUE)
);
PARTITION BY RANGE(a)
(PARTITION part1 VALUES LESS THAN (10),
PARTITION part2 VALUES LESS THAN (100),
PARTITION part3 VALUES LESS THAN (MAXVALUE)
);
CREATE TABLE part_tbl2 (a int, b int)
PARTITION BY RANGE(a)
(partition part1 START(1) END(100) EVERY(50),
partition part2 END(200),
partition part3 START(200) END(300),
partition part4 start(300));
PARTITION BY RANGE(a)
(partition part1 START(1) END(100) EVERY(50),
partition part2 END(200),
partition part3 START(200) END(300),
partition part4 start(300));
hash分区
列表分区
列存表只支持范围分区,行存表支持范围、间隔、哈希、列表
优势:查询性能,可用性,可维护性,IO均衡
管理
查询
select * from pt1 partition (p3);
select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid;
select p.relname,c.relname from pg_partition p,pg_class c where p.parentid=c.oid;
删除分区
alter table pt1 drop partition for(90);
alter table pt1 drop partition p3;
alter table pt1 drop partition p3;
增加分区
alter table pt1 add partition p3 values less than (95);
alter table pt1 add partition p4 values less than (MAXVALUE);
alter table pt1 add partition p4 values less than (MAXVALUE);
修改
alter table pt1 rename partition p4 to pmax; -- 重命名分区
alter table pt1 move partition pmax tablespace tbs1; -- 移动分区表空间
alter table pt1 split partition p3 at (90) into (partition p4,partition p5); -- 分离分区
alter table pt1 merge partitions p4,p5 into partition p3; -- 合并分区
alter table pt1 exchange partition (p3) with table t1; -- 普通表与分区表数据交换
alter table pt1 move partition pmax tablespace tbs1; -- 移动分区表空间
alter table pt1 split partition p3 at (90) into (partition p4,partition p5); -- 分离分区
alter table pt1 merge partitions p4,p5 into partition p3; -- 合并分区
alter table pt1 exchange partition (p3) with table t1; -- 普通表与分区表数据交换
注意事项
表的所有者有权限执行ALTER TABLE命令,系统管理员默认拥有此权限
不能修改分区表的tablespace,但可以修改分区的tablespace
不支持修改存储参数ORIENTATION
不支持增加自增列,或者增加DEFAULT值中包含nextval()表达式的列
不支持对外表、临时表开启行访问控制开关
通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,需手动删除NOT NULL约束
使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置
列存表只支持PARTIAL CLUSTER KEY表级约束,不支持主外键等表级约束
列存表支持的字段约束包括NULL、NOT NULL和DEFAULT常量值;对字段约束的修改当前只支持对DEFAULT值的修
改(SET DEFAULT)和删除(DROP DEFAULT),暂不支持对非空约束NULL/NOT NULL的修改
不能修改分区表的tablespace,但可以修改分区的tablespace
不支持修改存储参数ORIENTATION
不支持增加自增列,或者增加DEFAULT值中包含nextval()表达式的列
不支持对外表、临时表开启行访问控制开关
通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,需手动删除NOT NULL约束
使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置
列存表只支持PARTIAL CLUSTER KEY表级约束,不支持主外键等表级约束
列存表支持的字段约束包括NULL、NOT NULL和DEFAULT常量值;对字段约束的修改当前只支持对DEFAULT值的修
改(SET DEFAULT)和删除(DROP DEFAULT),暂不支持对非空约束NULL/NOT NULL的修改
索引
减少元组搜索的时间,提升数据访问速度,增加插入、更新、删除的时间,要更新索引信息
创建索引列:经常查询的字段,where过滤的字段、order by、Group by,distinct,连表字段
行存表
引擎索引
B-Tree
B+树来存储,适合比较及范围查询
GIN
倒排索引,可以处理多个键的值
Gist
几何和地理等多维数据类型
唯一索引,多字段索引(最多32个字段),部分索引,表达式索引
列存索引
B-Tree
Psort
GIN
稀疏索引,列存引擎每个列自带min/max稀疏索引,查询条件不在min,max范围内就不需要读取cu
聚簇索引:partial sort index
管理
创建:create unique index t1_fn_idx on t1(relfilenode); -- 创建唯一索引
create index t1_owner_tbs_idx on t1(relowner,reltablespace); -- 创建复合索引
create index t1_lttbs_idx on t1(reltablespace) where reltablespace<20; -- 创建部分索引
create index t1_upname_idx on t1(upper(relname)); -- 创建函数索引
create index pt1_id_idx on pt1(id) local; -- 创建分区表的本地索引
create index pt1_score_idx on pt1(score) global tablespace tbs1;
create index t1_owner_tbs_idx on t1(relowner,reltablespace); -- 创建复合索引
create index t1_lttbs_idx on t1(reltablespace) where reltablespace<20; -- 创建部分索引
create index t1_upname_idx on t1(upper(relname)); -- 创建函数索引
create index pt1_id_idx on pt1(id) local; -- 创建分区表的本地索引
create index pt1_score_idx on pt1(score) global tablespace tbs1;
修改:alter index t1_fn_idx rename to t1_fn_idx2;
alter index t1_fn_idx2 set tablespace tbs2;
alter index t1_lttbs_idx unusable;
alter index t1_lttbs_idx rebuild;
alter index pt1_id_idx rebuild partition p1_id_idx;
alter index pt1_id_idx modify partition p1_id_idx unusable;
alter index pt1_id_idx rename partition p1_id_idx to p1_id_idx2;
alter index pt1_id_idx move partition p1_id_idx2 tablespace tbs1;
alter index t1_fn_idx2 set tablespace tbs2;
alter index t1_lttbs_idx unusable;
alter index t1_lttbs_idx rebuild;
alter index pt1_id_idx rebuild partition p1_id_idx;
alter index pt1_id_idx modify partition p1_id_idx unusable;
alter index pt1_id_idx rename partition p1_id_idx to p1_id_idx2;
alter index pt1_id_idx move partition p1_id_idx2 tablespace tbs1;
删除:drop index t1_lttbs_idx;
重建:reindex index t1_lttbs_idx; -- 重建单个索引
reindex table t1;--重建所有索引
reindex table t1;--重建所有索引
视图
封装查询,物理上不存在
创建:create view v1 as
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default'; -- 创建视图
create materialized view mv1 tablespace tbs1 as
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default'; -- 创建物化视图
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default'; -- 创建视图
create materialized view mv1 tablespace tbs1 as
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default'; -- 创建物化视图
查询视图定义:select pg_get_viewdef('v1');
管理:alter view v1 rename to v2; -- 重命名视图
alter view v2 owner to jack; -- 修改视图属主
alter view v2 set schema jack; -- 修改视图schema
refresh materialized view mv1; -- 刷新物化视图
alter view v2 owner to jack; -- 修改视图属主
alter view v2 set schema jack; -- 修改视图schema
refresh materialized view mv1; -- 刷新物化视图
删除:drop view jack.v2; -- 删除视图
drop materialized view mv1;-- 删除物化视图
drop materialized view mv1;-- 删除物化视图
序列
产生唯一整数的数据库对象,这也是Sequence常被用作主键的原因,序列的值是按照
一定规则自增的整数,可以看作是存放等差数列的特殊表
一定规则自增的整数,可以看作是存放等差数列的特殊表
创建:create sequence seq01;
create sequence seq02 increment by 1 minvalue 1 maxvalue 99999 cache 1 nocycle;
create sequence seq02 increment by 1 minvalue 1 maxvalue 99999 cache 1 nocycle;
使用:select nextval('seq01'); -- 递增序列并返回新值
select seq01.nextval;
select currval('seq01'); -- 最近一次nextval返回的值
select seq01.currval;
select lastval(); -- 最近一次nextval返回的值
select setval('seq01',1); -- 设置序列的当前数值
select seq01.nextval;
select currval('seq01'); -- 最近一次nextval返回的值
select seq01.currval;
select lastval(); -- 最近一次nextval返回的值
select setval('seq01',1); -- 设置序列的当前数值
修改:alter sequence seq01 maxvalue 99999;
alter sequence seq01 owner to jack;
alter sequence seq01 owner to jack;
删除:drop sequence seq01;
drop sequence seq02 cascade;
drop sequence seq02 cascade;
同义词SYNONYM
创建:create synonym syn_t1 for t1; -- 创建表的同义词
create synonym syn_emp for v_emp; -- 创建视图的同义词
create synonym syn_add for func_add_sql; -- 创建函数同义词
create synonym syn_proc_emp for proc_emp; -- 创建存储过程同义词
create synonym syn_emp for v_emp; -- 创建视图的同义词
create synonym syn_add for func_add_sql; -- 创建函数同义词
create synonym syn_proc_emp for proc_emp; -- 创建存储过程同义词
使用:select * from syn_emp;
select syn_add(1,2);
call syn_proc_emp(7566,name,job,sal);
select syn_add(1,2);
call syn_proc_emp(7566,name,job,sal);
删除:drop synonym syn_add;
数据字典
系统表
系统视图
gsql常用元命令
\l:列出数据库集簇中所有数据库的名称、所有者、字符集编码以及使用权限等
\d:列出当前search_path中模式下所有的表、视图和序列
\db 列出所有可用的表空间
\dn 列出所有的模式(名称空间)
\du 列出所有数据库角色
\dt 列出数据库中的表
\d:列出当前search_path中模式下所有的表、视图和序列
\db 列出所有可用的表空间
\dn 列出所有的模式(名称空间)
\du 列出所有数据库角色
\dt 列出数据库中的表
存储过程
一些SQL语句组成的记录集合,这些SQL语句代码按照预定设计来实现一些功能,
例如对单表或多表的增删改查,可直接调用
例如对单表或多表的增删改查,可直接调用
优点:先编译后执行的,所以执行效率要比SQL语句高
网络中交互可以替代大堆的SQL语句,能降低网络的通信量,提高通信速率
存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全
网络中交互可以替代大堆的SQL语句,能降低网络的通信量,提高通信速率
存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全
缺点:对于分布式系统,存储过程内中一条语句不能下推,则存储过程不能下推,受限较多
对于复杂存储过程,调试不方便。
对于复杂存储过程,调试不方便。
匿名块
Anonymous Block,一般用于不频繁执行的脚本或不重复进行的活动,它们在一个会话
中执行,并不被存储
中执行,并不被存储
函数
在数据库内定义的子程序,可以从内置SQL语句中被调用
同时支持PG风格和O风格
同时支持PG风格和O风格
与存储过程的不同点
1、函数必须返回单个值,存储过程可以返回多个值或者没有返回值
2、函数可以放在select语句中,存储过程不行
创建:CREATE [ OR REPLACE ] FUNCTION function_name
重载:create or replace function package_func_overload(col int)
管理函数参数
管理函数属性
修改名称,所属者,函数模式
调用函数
CALL func_name()
删除函数
DROP FUNCTION [ IF EXIST ] Function_name() CASCADE
存储过程
仅支持O风格
创建:CREATE [ OR REPLACE ] PROCEDURE procedure_name
修改:ALTER PROCEDURE Procedure_name ( { [argmode] [argname] argtype } […] ) expression […] [RESTRICT];
删除:DROP PROCEDURE [ IF EXISTS ] procedure_name;
基本语句
定义变量:
DECLARE
emp_id INTEGER :=7788; --定义变量并赋值
outer_var INTEGER :=6688; --定义变量并赋值
DECLARE
emp_id INTEGER :=7788; --定义变量并赋值
outer_var INTEGER :=6688; --定义变量并赋值
动态语句
EXECUTE IMMEDIATE方法:
DECLARE
staff_count VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'select count(*) from hr.staffs' INTO staff_count;
dbe_output.print_line(staff_count);
END;
DECLARE
staff_count VARCHAR2(20);
BEGIN
EXECUTE IMMEDIATE 'select count(*) from hr.staffs' INTO staff_count;
dbe_output.print_line(staff_count);
END;
OPEN FOR 方法:
DECLARE name VARCHAR2(20);
phone_number VARCHAR2(20);
salary NUMBER(8,2);
sqlstr VARCHAR2(1024);
TYPE app_ref_cur_type IS REF CURSOR; --定义游标类型
my_cur app_ref_cur_type; --定义游标变量
BEGIN
sqlstr := 'select first_name,phone_number,salary from hr.staffs
where section_id = :1';
OPEN my_cur FOR sqlstr USING '30'; --打开游标, using是可选的
FETCH my_cur INTO name, phone_number, salary; --获取数据
WHILE my_cur%FOUND LOOP
dbe_output.print_line(name||'#'||phone_number||'#'||salary);
FETCH my_cur INTO name, phone_number, salary;
END LOOP;
CLOSE my_cur; --关闭游标
END;
DECLARE name VARCHAR2(20);
phone_number VARCHAR2(20);
salary NUMBER(8,2);
sqlstr VARCHAR2(1024);
TYPE app_ref_cur_type IS REF CURSOR; --定义游标类型
my_cur app_ref_cur_type; --定义游标变量
BEGIN
sqlstr := 'select first_name,phone_number,salary from hr.staffs
where section_id = :1';
OPEN my_cur FOR sqlstr USING '30'; --打开游标, using是可选的
FETCH my_cur INTO name, phone_number, salary; --获取数据
WHILE my_cur%FOUND LOOP
dbe_output.print_line(name||'#'||phone_number||'#'||salary);
FETCH my_cur INTO name, phone_number, salary;
END LOOP;
CLOSE my_cur; --关闭游标
END;
控制语句
返回语句
RETURN ;
RETURN NEXT ;
RETURN QUERY;
条件语句
IF_THEN
IF_THEN_ELSE
IF_THEN_ELSE IF
IF_THEN_ELSE IF
IF_THEN_ELSEIF_ELSE
循环语句
LOOP
LOOP END LOOP
WHILE_LOOP
WHILE LOOP END LOOP
FOR_LOOP
FOR LOOP END LOOP
FOR_LOOP查询语句
FORALL
分支语句
CASE_WHEN
CASE pi_result
WHEN 1 THEN
pi_return := 111;
WHEN 2 THEN
pi_return := 222;
WHEN 3 THEN
pi_return := 333;
END CASE;
WHEN 1 THEN
pi_return := 111;
WHEN 2 THEN
pi_return := 222;
WHEN 3 THEN
pi_return := 333;
END CASE;
GOTO语句
GOTO语句可以实现从GOTO位置到目标语句的无条件跳转
显示游标
静态游标
显示游标主要用于对查询语句的处理,尤其是在查询结果为多条记录的情况下。
静态游标:就是定义一个游标名,以及其相对应的SELECT语句
静态游标:就是定义一个游标名,以及其相对应的SELECT语句
动态游标
动态游标在声明时不绑定SQL语句,在打开游标时通过OPEN FOR动态绑定SQL语句
函数/存储过程设计规范
1、禁止使用存储过程、触发器实现业务逻辑,避免对数据库产生逻辑依赖
2、禁止使用存储过程实现数据库脚本升级
3、仅创建对固定入参有固定返回值的函数,函数必须设为IMMUTABLE和
SHIPPABLE类型。
SHIPPABLE类型。
4、不允许使用 C UDF (User-Deined Function)。
存储过程调试
RAISE INFO
使用未声明的变量
PL(Procedural Language,程序语言)语法错误
SQL语法错误
语义不正确
拼写错误
UDF:User Define Function,用户自定义函数
第六章
GaussDB数据库性能调优
GaussDB数据库性能调优
性能指标体系
系统级
集群或节点级别指标
集群或节点级别指标
OS
Instance Time
Memory
Session、Thread
Event、Utility
对象级
数据库对象指标
数据库对象指标
Database、Table、Index
File
Lock
应用级
应用负载性能
应用负载性能
Transation、Statement
Active session profile
slow query
Full SQL trace
系统级
OS
获取实时的CPU时间、LOAD、内存消耗信息
select id,name,value from dbe_pref.os_runtime
select id,name,value from dbe_pref.os_runtime
Instance Time
系统级的时间消耗细分。判断整个系统是否存在负载、网络、IO、CPU上的瓶颈
select * from dbe_perf.instance_time
select * from dbe_perf.instance_time
Memory
MEMORY_NODE_DETAIL
实例级内存分配、使用率
实例级内存分配、使用率
select * from dbe_pref.MEMORY_NODE_DETAIL
SHARED_MEMORY_DETAIL
共享内存上下文分配/使用率
共享内存上下文分配/使用率
select * from dbe_pref.SHARED_MEMORY_DETAIL
where level =2 order by usedsize desc limit 10
where level =2 order by usedsize desc limit 10
Session
SESSION_STAT
会话级负载强度、用于识别负载强度高,占用资源多的会话
SESSION_TIME
会话时间细分,识别不同时间维度上session的消耗
SESSION_MEMORY、SESSION_MEMORY_DETAIL
定位单个session在特性级上的内存问题
SESSION_STAT_ACTIVITY
获取实时系统活跃会话列表
Thread
THREAD_WAIT_STATUS
获取实例工作线程/辅助线程列表,判断线程的运行状态当前正阻塞在哪个事件上,
正在等待哪个锁,或被哪个会话阻塞
正在等待哪个锁,或被哪个会话阻塞
Event
WAIT_EVENTS
各功能模块中IO、LOCK、LWLOCK、STATUS四类事件的等待次数,
可以帮助定位特性级细粒度时延性能问题 。
可以帮助定位特性级细粒度时延性能问题 。
Utility
COMM_DELAY、COMM_RECV_STREAM、COMM_SEND_STREAM、COMM_STATUS:
获取通信组件时延信息,接收和发送流状态,用于诊断通信链路容量和时延故障
获取通信组件时延信息,接收和发送流状态,用于诊断通信链路容量和时延故障
REPLICATION_STAT:获取分布式部署形态下主备同步状态信息,用于诊断主备时延,复制性能
故障。
故障。
GLOBAL_GET_BGWRITER_STATUS、GLOBAL_PAGEWRITER_STATUS:
获取后台全量/增量检查点信息,buffer中待落盘脏页信息,后台刷脏工作线程的状态将影响buffer pool的效率,
磁盘IO繁忙程度,这些信息可以帮助优化缓存和IO性能。
获取后台全量/增量检查点信息,buffer中待落盘脏页信息,后台刷脏工作线程的状态将影响buffer pool的效率,
磁盘IO繁忙程度,这些信息可以帮助优化缓存和IO性能。
POOLER_STATUS:
分布式部署形态下,CN和DN之间的连接池将影响事务的执行效率和成功率,
pooler状态可以帮助诊断连接池瓶颈。
分布式部署形态下,CN和DN之间的连接池将影响事务的执行效率和成功率,
pooler状态可以帮助诊断连接池瓶颈。
对象级
Database
STAT_DATABASE:
数据库级别的活跃连接数,负载强度,块读写性能,
行活动,死锁,临时下盘文件等信息
数据库级别的活跃连接数,负载强度,块读写性能,
行活动,死锁,临时下盘文件等信息
select * from dbe_pref.STAT_DATABASE where datbane =''
Table
STAT_USER_TABLES、STAT_SYS_TABLES、
STAT_ALL_TABLES、STATIO_USER_TABLES、
STATIO_SYS_TABLES、STATIO_ALL_TABLES
STAT_ALL_TABLES、STATIO_USER_TABLES、
STATIO_SYS_TABLES、STATIO_ALL_TABLES
GLOBAL_STAT_HOTKEYS_INFO:
识别表级别热key
识别表级别热key
Index
STAT_USER_INDEXES、STAT_SYS_INDEXES、STAT_ALL_INDEXES、
STATIO_USER_INDEXES、STATIO_SYS_INDEXES、
STATIO_ALL_INDEXES
STATIO_USER_INDEXES、STATIO_SYS_INDEXES、
STATIO_ALL_INDEXES
index scan次数,index scan返回的索引项,通过
index scan返回的表行数等,索引页的缓存效率等,用以评估索引收
益和效率
index scan返回的表行数等,索引页的缓存效率等,用以评估索引收
益和效率
File
FILE_IOSTAT:数据(数据,索引)文件的IO性能统计指标(读写数
目,耗时,时延),帮助建立数据文件物理访存的模型,
识别文件级别的物理IO强度和瓶颈
目,耗时,时延),帮助建立数据文件物理访存的模型,
识别文件级别的物理IO强度和瓶颈
FILE_REDO_IOSTAT、STAT_BAD_BLOCK:
获取操作Redo文件的性能,帮助诊断Redo日志操作的性能瓶颈
获取操作Redo文件的性能,帮助诊断Redo日志操作的性能瓶颈
LOCK
LOCKS:对象锁涉及到的对象,事务,会话,锁信息,实时显示当前
系统锁等待关系,识别热点锁
系统锁等待关系,识别热点锁
Sequence
STATIO_USER_SEQUENCES、STATIO_SYS_SEQUENCES、
STATIO_ALL_SEQUENCES:
sequence的缓存效率
STATIO_ALL_SEQUENCES:
sequence的缓存效率
应用级
Statement
STATEMENT_COUNT,STATEMENT:
DDL,DML( select,insert,update,delete),DCL语句的分布比率,帮助
建立负载特征模型
DDL,DML( select,insert,update,delete),DCL语句的分布比率,帮助
建立负载特征模型
语句级别(归一化SQL,模板SQL)的响应时间,执行次数,行活动,软硬解析比,
时间模型,网络开销,排序性能(时间,内存,溢出),
执行器HASH性能(时间,内存,溢出);
可以识别热点语句,定位语句性能瓶颈,建立语句性能基线
时间模型,网络开销,排序性能(时间,内存,溢出),
执行器HASH性能(时间,内存,溢出);
可以识别热点语句,定位语句性能瓶颈,建立语句性能基线
ASP:Active Session Profile
活跃会话概要信息,通过采样实例活跃会话的状态信息,低成本复现过去一
段时间的系统活动
段时间的系统活动
最近用户session最耗资源的事件
最近比较占资源的session/SQL把资源都消耗在哪些event上
最近执行时间/执行次数最多的是哪些SQL(进而可以找出表,数据库)。
最近最耗资源的用户的信息。
最近阻塞其他session最多的session。
最近比较占资源的session/SQL把资源都消耗在哪些event上
最近执行时间/执行次数最多的是哪些SQL(进而可以找出表,数据库)。
最近最耗资源的用户的信息。
最近阻塞其他session最多的session。
LOCAL_ACTIVE_SESSION默认采样评率是1秒,内存视图
ASP的默认采样频率是10s,持久化在存储
ASP的默认采样频率是10s,持久化在存储
Full SQL trace
L0:性能影响<1%,默认常开
L1:性能影响<3%,建议常开,规划存储
L2:性能影响<30%,建议短暂开启
性能问题分析
整体性能问题分析
单语句性能分析
WDR报告
WDR报告是GaussDB提供的一种性能收集和分析工具,提供一个时间段内整个系统资源使用情况的报告
WDR snapshot
定时采集dbe.perf下性能视图,生成快照
默认关闭,通过GUC参数enable_wdr_snapshot开启
默认采集周期60分钟,通过guc参数wdr_snapshot_interval调整采集周期
默认保存8天,通过wdr_snapshot_retention_days管理
可以通过执行create_wdr_snapshot系统函数
内容:
Summary,最耗时的等待事件,最耗时等待时间种类
CPU,IO,Memory统计信息
CPU,IO,Memory统计信息
Detail:
时间模型、SQL统计信息、SQL具体信息、系统等待事件
Cache/IO统计、应用统计、对象统计
系统配置
时间模型、SQL统计信息、SQL具体信息、系统等待事件
Cache/IO统计、应用统计、对象统计
系统配置
生成WDR报告:
gsql方式连接数据库,切换至postgres库
\a
\t
\o报告路径(\data1/cluster.html)
\a
\t
\o报告路径(\data1/cluster.html)
限制
不支持生成WDR报告:
两次snapshot之间有节点重启、drop database、主备切换
重置dbe_pref.statement视图
两次snapshot之间有节点重启、drop database、主备切换
重置dbe_pref.statement视图
示例
TOP SQL
命中率:Instance Efficiency Percentages
Wait Events
Database Stat
Load Profile
Instance Efficiency Percentages
Top 10 Events by Total Wait Time
Wait Classes by Total Wait Time
Host CPU
IO Profile
Memory Statistics
Time Model
SQL Statistics
Wait Events
Cache IO Stats(Table)
Cache IO Stats(Index)
Utility status(Background writer stat)
Utility status(Replication slot)
Utility status(Replication stat)
Object Stats(User Table)
Object Stats(User Index)
Object Stats(Bad block)
Configuration settings
SQL Detail
SQL优化
执行机制
查询解析Parser
词法语法解析
语义分析
查询优化Planner
查询重写
路径&执行计划生成
执行Executor
执行计划
访问路径
扫描表数据路径
连接顺序
多表连接顺序
连接方式
多表连接方式
EXPLAIN
ANALYZE [ boolean ] -- 执行语句,并显示实际运行时
间和其他统计数据
ANALYSE [ Boolean ] -- (同上)
VERBOSE [ Boolean ] -- 显示计划额外信息
COSTS [ Boolean ] -- 显示代价
CPU [ boolean ] -- 显示cpu使用
DETAIL [ boolean ] -- 打印节点信息
NODES [ boolean ] -- 显示执行节点
NUM_NODES [ boolean ] -- 显示节点数量
BUFFERS [ boolean ] -- 显示buffer使用
TIMING [ boolean ] -- 显示耗时
PLAN [ boolean ] -- 显示计划
FORMAT { TEXT | XML | JSON | YAML }
间和其他统计数据
ANALYSE [ Boolean ] -- (同上)
VERBOSE [ Boolean ] -- 显示计划额外信息
COSTS [ Boolean ] -- 显示代价
CPU [ boolean ] -- 显示cpu使用
DETAIL [ boolean ] -- 打印节点信息
NODES [ boolean ] -- 显示执行节点
NUM_NODES [ boolean ] -- 显示节点数量
BUFFERS [ boolean ] -- 显示buffer使用
TIMING [ boolean ] -- 显示耗时
PLAN [ boolean ] -- 显示计划
FORMAT { TEXT | XML | JSON | YAML }
SQL算子
扫描算子(Scan plan Node)
SeqScan
顺序扫描行存储引擎
CstoreScan
扫描列存储引擎
DfsScan
顺序扫描HDFS存储引擎
BitmapHeapScan
BitmapIndexScan
BitmapIndexScan
利用bitmap获取元组
TidScan
通过Tid获取元组
IndexScan
索引扫描
IndexOnlyScan
直接从索引返回元组
ForeignScan
外部表扫描
WorkTableScan
扫描中间结果集
ValueScan
扫描Value列表
Stream
扫描网络算子(分布式数据库特有)
SubQueryScan
子查询扫描
CteScan
扫描CommTableExpr
FunctionScan
函数扫描
控制算子(Control Plan Node)
Result
顺序扫描行存储引擎
ModifyTable
INSERT/UPDATE/DELETE操作的算子
Append
多个关系集合的追加操作
MergeAppend
多个有序关系集合的追加操作
RecursiveUnion
执行Recursive subquery
物化算子(Materialize Plan Node)
Materialize
物化
Sort
对下层数据进行排序
Group
对下层已经排序的数据进行分组
Agg
对下层数据进行分组(无序)
Unique
对下层数据进行去重操作
Hash
对下层数据进行缓存,存储到一个hash表里
SetOp
对下层数据进行缓存,用于处理intersect等集合操作
WindowAgg
窗口函数
LockRows
处理行级锁
关联算子(Join Plan Node)
HashJoin
对下层两股数据流实现哈希连接操作
Inner、Left-Outer-Join、Right-Outer-Join、Full-Outer-Join、Semi-Join、Anti-Join
Inner、Left-Outer-Join、Right-Outer-Join、Full-Outer-Join、Semi-Join、Anti-Join
MergeJoin
对下层两股排序数据流实现归并连接操作
Inner、Left-Outer-Join、Right-Outer-Join、Full-Outer-Join、Semi-Join、Anti-Join
Inner、Left-Outer-Join、Right-Outer-Join、Full-Outer-Join、Semi-Join、Anti-Join
NestLoop
对下层两股数据流实现循环嵌套连接操作
Inner、Left-Outer、Semi-Join、Anti-Join
Inner、Left-Outer、Semi-Join、Anti-Join
连接类型分
Inner join
内连接
left join
左连接
right join
右连接
full join
全连接
semi join
半连接
Anti join
反连接
统计信息
定期分析数据,把表和索引的数据分布情况保存到数据字典里,以便优化器使用,这就是统计信息
保存在数据字典里,包含表、表分区、索引、索引分区、列、列的直方图
重点关注表和索引上的数据量和数据块数统计信息
重点关注表和索引上的数据量和数据块数统计信息
执行ANALYZE对统计信息更新
PG_STATISTICS表存储有关数据库表和索引列的统计信息。需授权访问
PG_STATS视图提供对存储在PG_STATISTICS表里面的单列统计信息的访问。
调优工具
内存参数调优
逻辑内存管理参数:max_process_memory
执行作业可用内存:max_process_memory–shared memory (包括shared_buffers) –cstore_buffers
plan_cache_mode
执行算子是否下盘参数:work_mem
可下盘算子有:Hash,Agg,Sort,Material,Setop,WindowAgg以及它们的Vec版本
算子参数调优
扫描算子控制参数:enable_**scan,
支持seqscan,bitmapscan,indexonlyscan,indexscan,tidscan
支持seqscan,bitmapscan,indexonlyscan,indexscan,tidscan
连接算子控制参数:enable_hashjoin/enable_mergejoin/enable_nestloop
控制开启或禁用某种连接方式
控制开启或禁用某种连接方式
分布式执行计划控制参数:enable_stream_operator/enable_fast_query_shipping/enable_light_proxy
用于控制分布式执行计划的生成。
用于控制分布式执行计划的生成。
Plan Hint
是特殊SQL语法,可用于手工干预SQL执行计划的选择,
在SQL中加入hint语法,可以明确指导SQL优化器选择特定执行计划
在SQL中加入hint语法,可以明确指导SQL优化器选择特定执行计划
SELECT /*+[hint](value) */ * FROM …
Scan Hint
Join Hint
Join Order Hint
Blockname Hint
Rows Hint
分布式计划
下发SQL语句的计划
各个DN根据下推语句生成计划,执行结果在CN上汇总
各DN执行无数据交互
下发SQL计划的分布式计划
CN根据语句生成计划,并将计划下发至DN执行
适用各DN执行有数据交互的复杂语句
下发部分SQL的分布式计划
CN生成计划后,下推原语句的部分语句至DN,执行后结果发回CN,CN执行剩余计划
适用不满足上述计划生成条件的极少数场景
数据分布
分布列-分布方式
Hash
Hash方式散列到DN
Replication
所有DN都有全量数据
List
List方式分布到指定DN
Range
Range方式分布到指定DN节点
Replication适合小表,Hash/List/Range适合数据量大的表
调优思路
CN轻量化
enable_light_proxy
on/off
PBE
plan_cache_mode=auto/force_generic_plan/force_custom_plan
减少分布式事务
DML指定分布键过滤条件,可以下推到DN执行,事务在本地提交,减少网络开学
减少数据重分布
选择管理字段或聚合字段做分布列,减少跨节点数据分布
当前参数化路径不支持跨节点
分布列选择原则
尽量选择聚合字段
尽量选择关联字段
保证数据均匀分布
配置SMP
SMP是通过算子并行来提升性能,是用资源换时间的方式
要求CPU、内存、网络、IO比较充足,否则引起性能劣化
步骤
1、观察系统资源充足,资源利用率<50%,否则放弃
2、执行SET query_dop=1,再执行explain打出执行计划,
观察执行计划是否成功使用SMP特性,若成功,再设置为0或其他值
观察执行计划是否成功使用SMP特性,若成功,再设置为0或其他值
query_dop
默认值为1
设置为0,自适应,系统自动选择[1,8]之间最优并行度
设置为-value,限制取值范围为[1,value]
设置为value,强制选择为1或者value
注意,语句结束后关闭。set query_dop =1.
数据倾斜调优
存储层倾斜
存储层数据切斜,通常由于分布列选择不合理,调整分布列解决
explain performance,查询性能细节,是否存在切斜迹象
select table_skewness(表名); 获取存储倾斜视图
计算层倾斜
执行过程数据重分布导致倾斜(JOIN KEY、GROUP BY KEY往往不是分布列)
解决方案
RLBT(Runtime Load Balance Technology)
非倾斜数据,按原HASH分布处理,
切斜数据,通过轮询(RoundRobin)均匀分配到各节点
特性开关:skew_option
切斜数据,通过轮询(RoundRobin)均匀分配到各节点
特性开关:skew_option
RLBT配置方法
简单方法
运行ANALYZE收集
复杂查询
通过HINT手动指定
单表:/*+ skew(table (column) [(value)]) */
中间结果:/*+ skew((join_rel) (column) [(value)]) */
单表:/*+ skew(table (column) [(value)]) */
中间结果:/*+ skew((join_rel) (column) [(value)]) */
触发后,计划中出现skew join Optimized by Statistic
第七章
GaussDB数据库日常运维
GaussDB数据库日常运维
连接管理
DAS(data admin service)
无需使用IP,默认开通,华为云数据管理服务
内网连接
同一vpc下,可连接
相同安全组下,默认互通,不同安全组下,需要设置安全组规则
公网连接
建议单独绑定弹性公网IP连接弹性云服务器
需要设置安全组规则,分为普通连接和ssl连接
导入导出
数据库元数据导入\导出(数据库对象)
gs_dump/gs_restore
小批量数据导入导出
copy
SQL文本格式建表定义
gsql元命令/copy
分布式大批量数据导出/导入
GDS
gs_dump
gs_dump postgres -U u1 -W Huawei@123 -p 16000 -s -t t1 -f /data/t1.sql –F c
-U 数据库用户名
-W 数据库用户密码
-p 数据库CN连接端口号
-s 只导出对象定义,不导出对象数据
-t 只导出指定的该表
-f 将输出发送至指定文件
-F 导出文件的格式,取值有四种:p 纯文本、c 自定义归档、d 目录归档和t tar归档格式
-W 数据库用户密码
-p 数据库CN连接端口号
-s 只导出对象定义,不导出对象数据
-t 只导出指定的该表
-f 将输出发送至指定文件
-F 导出文件的格式,取值有四种:p 纯文本、c 自定义归档、d 目录归档和t tar归档格式
gs_restore
导出
gs_dump postgres -p 16000 -s -f /data/all.sql -F c
恢复
gs_restore -d db1 -p 16000 /data/all.sql
copy
导入
copy t1 from '/data/input/t1.txt' delimiter '^';
导出
copy t1 to '/data/input/t1_output.txt' delimiter '^';
查询导出
copy (select * from t1 where a2=1) to '/data/input/t1_output.txt' delimiter '^';
可在编程中使用
gsql
文本格式对象定义的创建
gsql -d db1 -p 16000 -U u1 -W Huawei@123 -f /data/table.sql
-d 指定数据库名
-p 数据库CN连接端口号
-U 数据库用户名
-W 数据库用户密码
-f sql脚本文件
\o 把所有的查询结果发送到文件里
\i 从文件FILE中读取内容,并将其当作键盘输入,执行查询
\copy 进行数据的导入导出,数据来源支持STDIN(标准输入)和文件
-d 指定数据库名
-p 数据库CN连接端口号
-U 数据库用户名
-W 数据库用户密码
-f sql脚本文件
\o 把所有的查询结果发送到文件里
\i 从文件FILE中读取内容,并将其当作键盘输入,执行查询
\copy 进行数据的导入导出,数据来源支持STDIN(标准输入)和文件
GDS
Gauss Data Service
通过DN并行导入导出,解决CN在分布式场景下性能瓶颈问题
原理:
1、CN只负责任务的规划和下发,导入交给DN节点,释放CN资源
2、GDS负责文件的切分,然后分发给DN
3、DN收到数据分片后,解析并计算属于哪个DN
4、使用多DN并发,GDS多线程并行导入、多个GDS并行
1、CN只负责任务的规划和下发,导入交给DN节点,释放CN资源
2、GDS负责文件的切分,然后分发给DN
3、DN收到数据分片后,解析并计算属于哪个DN
4、使用多DN并发,GDS多线程并行导入、多个GDS并行
导入
分析错误表
error_ftr_sbtest2
Nodeid datanode编号
Begintime 错误数据写入错误表的时间
Filename 错误数据行所在文本名
Rownum 错误数据行在文本的行数
Rawrecord 错误原始数据行
Detail 错误原因说明
Begintime 错误数据写入错误表的时间
Filename 错误数据行所在文本名
Rownum 错误数据行在文本的行数
Rawrecord 错误原始数据行
Detail 错误原因说明
常见错误
invalid byte sequence for encoding “”UTF8“”: 0x00:文本数据中含有对UTF8来说非法字符的编码0x00
missing data for column “a2”:错误数据行缺失列
value too long for type character varying(10):错误数据行的字段值超过表定义字段长度
启动GDS服务
创建外表
执行导入
insert into t1_foreign_output select * from t1;
导出的文本命名格式为t1_foreign_output.dat.0
导出的文本命名格式为t1_foreign_output.dat.0
导出
启动GDS服务
创建外表
执行导入
最佳实践
数据倾斜校验,先导入一部分验证
拆分并行,使用多GDS并行导入
资源充足
网络畅通
万兆网
部署个数
一个raid只部署1-2个GDS
GDS和DN的数据比例在1:3到1:6之间
备份恢复
好处
防止误操作
高可靠,华为OBS可靠性12个9
分类
物理备份
保留在数据库中,性能更高,空间利用率低
逻辑备份
通用格式(CSV),支持跨库或跨平台恢复
备份范围
集群级,单对象/单表,多对象/多表,库级
恢复范围
集群级、实例级、库级、表级
备份完整性
全量备份、增量备份、日志归档
恢复完整性
全量恢复、增量恢复、PITR恢复
存储介质
本地磁盘,远端磁盘,NBU备份、OBS备份、SAN备份
全量备份
备份全量数据,耗时长,可恢复完整数据库
增量备份
差分备份,指定时间点后的增量修改数据,耗时短,无法单独恢复出数据库
默认每30分钟自动备份
默认每30分钟自动备份
执行
自动备份
创建的备份时段自动备份
指定的备份保留期自动备份
用户指定的任意备份时刻
扩容或者大版本升级自动备份
手动备份
是由用户启动的数据库实例的全量备份,
会一直保存,直到用户手动删除
会一直保存,直到用户手动删除
全量备份原理
全量数据文件
截止一致性barrier点的增量日志
增量备份原理
增量数据页面
截止一致性barrier点的增量日志
恢复原理
1、恢复全量数据
2、恢复增量备份1的增量页面
3、恢复增量备份2的增量页面
4、恢复增量备份2的日志
5、启动集群
2、恢复增量备份1的增量页面
3、恢复增量备份2的增量页面
4、恢复增量备份2的日志
5、启动集群
自动备份
按照用户设置的自动备份策略对数据库实例进行备份
以压缩包的形式存储在对象存储服务上
建议业务低峰时间段启动
以压缩包的形式存储在对象存储服务上
建议业务低峰时间段启动
默认策略
保留7天
全量备份时间段:间隔1小时的随机时间段
全量备份,一周的每一天
增量备份,默认每30分钟一次
手动备份
“实例管理”页面,选择指定的实例;
在左侧导航栏,选择“备份恢复”;
在操作页签选择“创建备份”。
在左侧导航栏,选择“备份恢复”;
在操作页签选择“创建备份”。
恢复实例
故障定位
备份恢复日志查找顺序
1、登录console页面,获取备份下发的节点实例号
2、登录节点,目录/home/Ruby/log/request_agent.log
找到对应时间段的日志和备份转发的节点ip,关键词:Send backup request
找到对应时间段的日志和备份转发的节点ip,关键词:Send backup request
3、登录(第2步)备份转发节点,
目录$GAUSSLOG/roach/controller,如无报错,
查找目录/home/Ruby/log/om_agent/agent.log
目录$GAUSSLOG/roach/controller,如无报错,
查找目录/home/Ruby/log/om_agent/agent.log
4、如果是gs_roach程序执行失败,
打开主节点目录$GAUSSLOG/roach/agent
打开主节点目录$GAUSSLOG/roach/agent
5、登录第4步中获取的xxx节点,打开目录$GAUSSLOG/roach/agent
下对应时间点的日志文件,排查原因
下对应时间点的日志文件,排查原因
常见问题
1、集群状态unavailable导致
2、备份过程中,发生进程重启、主备切换
3、大版本升级中,全备和增备会失败
4、备份过程中,集群扩缩容并发,导致失败
PITR
Point-in-time Recovery,按时间点恢复
SAN
Storage Area Network,计算机系统与存储单元之间以及存储
单元与存储单元之间数据传输的网络
单元与存储单元之间数据传输的网络
补充题目
参数调优程序X-Tuner包含三种运行模式
recommend
通过用户指定的用户名等信息登录到数据库环境中,获取当前正在运行的workload特征信息,根据上述特征信息生成参数推荐报告。报告当前数据库中不合理的参数配置和潜在风险等;输出根据当前正在运行的workload行为和特征;输出推荐的参数配置。该模式是秒级的,不涉及数据库的重启操作,其他模式可能需要反复重启数据库
train
通过用户提供的benchmark信息,不断地进行参数修改和benchmark的执行。通过反复的迭代过程,训练强化学习模型,以便用户在后面通过tune模式加载该模型进行调优
tune
使用优化算法进行数据库参数的调优,当前支持两大类算法,一种是深度强化学习,另一种是全局搜索算法(全局优化算法)。深度强化学习模式要求先运行train模式,生成训练后的调优模型,而使用全局搜索算法则不需要提前进行训练,可以直接进行搜索调优
SQLdiag
慢SQL发现工具,openGauss中SQL语句执行时长预测工具
最大存储容量为32T的指标是
单表大小
分区表中,单个分区的大小
SQL语句分类
DDL (Data Definition Language) 数据定义语言,用来定义数据库对象(数据库,表, 字段)
DML (Data Manipulation Languag) 数据操作语言,用来对数据库表中的数据进行增删改
DQL (Data Query Language) 数据查询语言,用来查询数据库中表的记录
DCL (Data Control Language) 数据控制语言,用来创建数据库用户、控制数据库的访问权限
DML (Data Manipulation Languag) 数据操作语言,用来对数据库表中的数据进行增删改
DQL (Data Query Language) 数据查询语言,用来查询数据库中表的记录
DCL (Data Control Language) 数据控制语言,用来创建数据库用户、控制数据库的访问权限
ACID
分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)
opengauss分布式解决方案,最多支持256个节点;16节点支持1000万tpmc;32节点支持1500万tpmc
时间类型,默认精度为小数点后面6位
管理员修改opengauss配置文件“postgresql.conf”/pg_hba_conf中的参数,使用gs_guc命令
主备切换工具 gs_ctl
zsql或JDBC一次最多可监听8个ip地址
index-advistor
索引推荐功能,
虚拟索引、单索引推荐、workload级别索引推荐
虚拟索引、单索引推荐、workload级别索引推荐
CTS(Cloud Trace Service):用于支撑安全分析、合规审计、资源跟踪和问题定位的
PG_AM 存储了有关索引访问方法的信息
gs_om工具可以启停数据库
逻辑操作符的优先级是 NOT>AND>OR
列存表不支持RETURNING子句
gaussDB100默认审计级别是3,0表示未开启审计模式
0 条评论
下一页