【HICP Gaussdb】数据库 数据库管理( sql调优 故障处理 SSL认证方式) -14
sql调优
sql语句执行计划是数据库运行sql语句而执行的操作步骤序列
sql语句引用表的顺序
sql语句中每个表的访问方法
针对sql语句中连接操作相关的表连接方法
where过滤条件 order排序以及count聚合
explain statement ===> explain命令获取sql的执行计划
explain select * from t1 ;
shardpool 共享内存缓存sql执行计划 sql无需多次执行 提升sql效率
第一次执行sql 语句时 sql语句会被执行硬解析 ,生成对应的缓存到独立的shared pool内存区,再次执行的时候 系统自动匹配sql文本 直接调用缓存的sql pool的执行计划
执行三要素
访问路径、 连接顺序、 连接方式
数据库性能瓶颈主要有三个 IO 网络 CPU 此消彼长的关系
逻辑读与物理读 : 逻辑读是指数据块已在缓存中并不需要发生实际的IO 主要消耗CPU 。而物理读需要发生实际的IO 。逻辑读是指在内存中命中数据块 他比物理读快10倍以上
多块读随机读,顺序读 : 性能调优的根本方法就是减少读取的数据块。全表扫描可以支持多块读,而索引扫描一般支持单块读,顺序IO比随机IO高,索引IO一般是随机IO
索引唯一扫描: 当根据主键或者唯一索引查询数据时,可以使用唯一扫描 这种代价非常小 因为他从索引树中查询一条数据
索引全扫描: 索引全扫描最差情况 一般避免使用
索引快速全扫描: 索引快速全扫描支持多块读 ,结果是无序的,只需要访问索引就能获得结果的情况下 代替索引全扫描
嵌套循环
嵌套循环 最重要的连接方式 ,尤其是在实时性比较高的系统中,因为这种系统的查询要求快速返回 不能访问很多的数据块 正适合嵌套循环
驱动表的结果集很小 ,选择驱动表非常重要
内表的连接列上有的索引
驱动表 和内表连接匹配的数据量小,扫描内表连接列de 索引次数少
hash连接
hash连接是非常常用的连接方式
适用于较大的数据集,并且连接条件必须是等值连接
尽量选择小的数据集作为驱动表在内存中生产的hash表
设置一个较大的temp buffer 可以加快hash 连接速度 避免使用表空间
多表连接时间同样要注意连接顺序 中间结果集尽量小 少做无用功
分区裁剪
分区表 在实际项目中 的广泛应用 ,在物理上实现了表数据的分离 而逻辑上仍然是个表 这样既提高了性能也降低了应用开发难度 ,因此分区是透明的
分区裁剪是指查询分区表时,如果查询条件含有分区列 那么优化器会根据分区列的查询条件判断哪些分区是不需要扫描的,如果可以大大提高查询的性能 为了应用分区裁剪 ,对分区表的查询一般有分区条件
优化器
优化器是数据库内置的,作用是在SQL解析的阶段生成最优的执行计划 分为RBO CBO两种
RBO基于规则 CBO基于成本
RBO :索引选择 排序消除 MIN/MAX优化、 连接顺序选择、 子查询重写、条件重写
CBO:查询转换、 代价评估、 执行计划生成 执行代价依赖统计信息:统计表 总行数 数据快 平均长度、 列统计信息:直方图 唯一值数量 空值数量 列密度
统计信息: CBO优化器 需要根据表\索引中的数据选择查询数据的方式 ,由于表中数据量很大 不可能每次执行查询时统计表中数据量以及数据分布,所以会定期分析数据 存放在字典中以便优化
如何查看统计信息: 统计信息保存在数据字典中 ,主要包含表 索引 分区 列 列的直方图。重点关注 数据量和数据块数
SQL性能定位
使用执行计划定位
执行 explain plan for dml命令 查看DML类语句执行计划 并分析 SQL执行是否使用了最优的方式 已决定是否优化sql语句
使用慢日志定位
系统会将执行时间长的 sql打印到慢日志中 ,用户可以在慢日志中查询 日志文件执行时间较长的sql 进行优化
默认路径为: %GSDB_DATA/LOG/LONGSQL/zengine.lsql
合理选择分区字段 是影响sql 变形的关键因素之一 合理选择分区可以提高sql执行性能
分区字段建议: 选择的分区字段和分区算法 能够将表数据均匀分布到各个分区
该分区字段在执行SQL 时经常被用于作为连接字段
进行数据访问时最大限度的减少 跨数据访问
选择整型字段作为分区字段
优化SQL语句
减少使用like条件 ,尽量使用where条件 有效使用分区 提高SQL性能
where条件中尽量使用AND 少使用or
减少子查询 子查询会降低性能
SQL语句中 利用分区字段作为条件 ,有利于系统直接路由到目标分区 提升处理性能
案例 :软解析
select * from test_table where id = 1000
# 每次执行该SQL语句 数据库都要硬解析,损耗性能,如果语句修改为 select * from test_table where id = :1 这种参数绑定 每次执行直接会根据hash值从 sql_pool 找到对应的语法树 不用此次进行解析
案例: 索引扫描
select * from test_table where id = ?
select * from test_table where id between xxx and xxx
推荐在字段ID 上创建索引 ,这样使用index scan ,而不会使用full table scan
排序优化:
select distincy f1,f2 from test_table
select f1,f2 from test_table group by f1,f2
select f1,f2,f3 from test_table order by f1,f2
类似这类sql语句 推荐在字段 f1,f2上面创建索引 ,sql引擎会通过index scan 优化非必要的排序步骤 提升sql性能
聚合函数优化
select max(f1) from test_table
select min(f1) from test_table
类似这类SQL语句 推荐在字段f1上面创建索引,Sql引擎会对索引 升序或降序扫描 直接命中记录 避免扫描所有符合条件的进行计算
hint
hint 是特殊的SQL语法,通常用于用户明确知道Sql最优执行计划或者用于稳定SQL执行计划,达到性能最优
类型: access_method_hint 访问数据时类型选择hint
包括 full 、index 、 no_index 、 index_asc 、index_desc 、 index_FFS 、 no_index_FFS
join_order_hint :join顺序选择hint :其中包含两个hint 分别为 ordered leading
join_method_hint : join方式选择hint 其中包含三个hint 分别为use_nl,use_merge,use_hash
parallel_hint : 并行选择hint 包括 单表全表扫描 、聚合函数并行、order by 并行、 group by 并行、 build hash table 并行、 单标扫描返回大量结果集并行
故障处理
服务器正常通讯 数据库发生故障或者业务运行异常
数据库故障、操作系统故障、硬件故障
服务器通讯不正常 无法远程连接
网络故障 ,其他硬件故障
数据库故障
语句级:执行DDL DML DCL 报错,缺少权限
用户进程级: 用户非登出的异常退出 用户会话异常
数据库实例级
数据库异常关闭或退出 数据库进程退出 黑匣子里发生core记录
操作系统故障
系统资源不足 如CPU IO过载 引起机器不响应外部链接 ,linux out of memory 导致数据库程序被kill
磁盘故障
磁盘空间不足 ,磁盘故障,其他硬件故障
网络故障
端口被占用 、网络连接故障、网卡故障、网络闪退
处理流程
故障出现一定先定界
定界后在进行下一步定位
定位后采取故障排除措施
如果故障排除则记录处理过程
如果没有排除则联系华为工作人员
故障定界
1、通过ssh远程服务器
若操作系统发生内核错误 则系统需要经过较长时间才能重启 ,建议5分钟连接一次 若20分钟仍连接失败 说明机器已经无响应或者网络连接出现问题
2、以root用户 本地登录GAUSSDB 所在服务器
3、查看服务是否启动
ps ux |grep zengine ---> 如果显示状态为 open mount nomount 则表示数据库启动成功
4、查看磁盘状态
fdisk -l 查看是否未挂载磁盘 df -h 磁盘使用情况 尝试写入 判断磁盘是否正常
信息收集
当数据库发生故障,需要及时收集日志 视图 错误码和黑匣子的信息来分析问题的产生
常见定位手段
查看错误码 信息
查看错误日志 定位故障 运行日志 run log 、 debug 日志、告警日志、 zctl日志、启动日志、 trace日志
通过视图查看信息 SQL长时间无响应 应该查看DV_LOCKED_OBJECT
通过core文件定位
操作系统定位
登录系统 收集系统信息
网络故障定位
ifconfig ping netstat lsof 命令查看网卡是否正常
如果网络有问题 优先处理网络问题
单机连接失败 查看run log 日志检查 zengine.ini 配置 , 主备机连接失败 请检查主备机配置是否正确
硬件故障定位
磁盘空间不足 文件读写错误可能是磁盘空间不足导致 ,df -h 查看磁盘使用率
磁盘损坏 可以使用磁盘块检查工具 如badblocks 检查磁盘是否有坏快
磁盘未挂载 df -h 查看 fdisk -l
电源故障: 检查电源供电
# SSL认证
认证是根状结构
CA证书
--->SUB CA证书
--->IOV CA证书
client和server 同级证书 多对多 同时向上认证