kingbaseES sql 优化技巧汇总
1、整体思路
针对业务系统的出现的慢sql 我们的优化步骤大概分为以下几步
1、识别高负载语句
2、收集性能相关的数据
3、确定性能问题产生的原因
4、实施优化手段
下面我们针对这几个步骤展开进行讲解
1、识别高负载语句
金仓数据库 kingbase ES针对满语句识别有以下几个工具
• sys_stat_statements
需要闯将sys_stat_statements 扩展 ,默认金仓数据库已经创建对应扩展
通过sys_stat_statements 查看数据库sql语句执行情况,发现有问题语句并进行优化
该视图可以查询内容包括
1、语句内容
2、语句执行次数
3、语句解析次数和时间
3、shared_buffer 使用情况是否用到了磁盘read 还是用到了 shared _buffer hit
4、temp_buffer ,work_me,maintance_men 命中情况 通过local字段排查
• kbbadger
kbbadger 是金仓提供的一款日志分析工具,通过该工具可以胜场html格式的sql执行情况分析报告。
生成要求和指令如下:
相关参数要求
log_min_duration_statement = 0 --需要reload
不要开启 log_statement 参数 --默认关闭
lc_messages='en_US.UTF-8' -必须是英文,否则无法解析
常见使用语句
kbbadger /var/log/kingbase.log
kbbadger /var/log/kingbase.log.2.gz /var/log/kingbase.log.1.gz /var/log/kingbase.log kbbadger
/var/log/kingbase/kingbase-2012-05-*
kbbadger --exclude-query="^(COPY|COMMIT)" /var/log/kingbase.log
kbbadger -b "2012-06-25 10:56:11" -e "2012-06-25 10:59:11" /var/log/kingbase.log
cat /var/log/kingbase.log | kbbadger -
kbbadger --prefix '%t [%p]: user=%u,db=%d,client=%h' /sys_log/kingbase-2012-08-21*
kbbadger --prefix '%m %u@%d %p %r %a : ' /sys_log/kingbase.log
# Log line prefix with syslog log output
kbbadger --prefix 'user=%u,db=%d,client=%h,appname=%a' /sys_log/kingbase-2012-08-21*
# Use my 8 CPUs to parse my 10GB file faster, much faster
kbbadger -j 8 /sys_log/kingbase-10.1-main.log
注意:CSV格式文件分析需要操作系统安装perl-text-CSV
安装语句
/usr/bin/perl5 -MCPAN -e'install Text::CSV_XS'
• KWR报告
KWR 报告需要借助于快照生成,由于快照时间间隔默认是1小时,所以实时性比较弱,但是在分析性能问题时建议首先收集一次KWR这样可以对数据库整体负载有一个全面的了解。
KWR的创建方法如下:
创建扩展
Create extension sys_kwr;
建议配置参数修改之后reload 即可,无需重启数据库
track_sql = on
track_instance = on -- KWR 1.3 新增参数
track_wait_timing = on -- 默认开启
track_counts = on --默认开启
track_io_timing = on
track_functions = 'all'
sys_stat_statements.track = 'top'
生成快照
CREATE EXTENSION sys_kwr;
SELECT * FROM perf.create_snapshot(); -- 获得快照 1
CREATE TABLE IF NOT EXISTS t1(id int); -- 创建一个示例表
SELECT count(*) FROM t1; -- 执行一些 SQL
SELECT * FROM perf.create_snapshot(); -- 获得快照 2
SELECT * FROM perf.kwr_report(1,2); -- 生成 TEXT 版本报告
SELECT * FROM perf.kwr_report(1,2, 'html'); -- 生成 HTML 版报告
• KSH报告
sys_ksh 以每秒采样的方式进行会话和数据收集,并将采集数据放入内存的 Ringbuf 队列中 对资源消耗大建议采用临时开启方式。
旧版本需要单独安装sys_ksh扩展, 新版本已经集成到sys_kwr 中
V8R6B24版本使用方法
Create extension sys_kwr;
sys_kwr.collect_ksh 设置 ksh=on 需要reload不需要重启
alter system set sys_kwr.collect_ksh =off
保存于内存 Ringbuf 的数据可以通过视图 perf.session_history 查看:
SELECT * FROM perf.session_history;
其中保存于数据库的历史数据可以通过视图 perf.ksh_history 查看:
SELECT * FROM perf.ksh_history;
生成的报告可以通过 perf.ksh_report 查看:
SELECT perf.ksh_report(start_ts, duration, slot_width, write_to_file);
参数说明:
• start_ts: 报告开始时间,默认:当前时间-15 分钟
• duration: 报告时长,默认到 15 分钟,最大不超过 60 •
slot_width: 报告最小区间,输入 0 时系统自动计算合适的宽度
• write_to_ffle: 是否输出到 sys_log 目录,默认否
KSH 输出报告的内容章节包括:
• Report & Instance Info: 报告和实例信息
• Top User Event: TOP 用户事件
• Top Background Event: TOP 后端事件
• Top SQL with Top Event: TOP 语句的 TOP 事件
• Complete List Of SQL Text: TOP 完整语句
• Top Session: TOP 会话
• Top Client Id: TOP 客户端
• Top SQL Command Type: TOP 语句命令类型
• Top Phase Of Execution: TOP 运行阶段
• Activity Over Time: 区间活动统计 实例运行效果如下:
2、收集性能相关的数据
其实在高负载sql识别时已经收集了一部分性能相关数据。在sql调优过程中还是以sql执行计划为主,但为了判断执行计划的准确性以及可能存在的其他性能问题还需要收集一些其他信息。
首先要了解相关表的结构和数据量和分布情况
select id,count(1) from t01 group by id; -- 查看某一个字段或者条件数据分布情况
select sys_relation_size('t01'); --查看表的大小
select count(1) from t01; --统计实际行数
然后收集执行计划
explain (analyze true,buffers true) select * from t01; -- select语句 可以使用analyze
explain (buffers true) updatae -- update语句不建议使用analyze
绑定变量方式收集执行计划
prepare a as select * from t01 where id=$1;
explain analyze execute a('1');"
sql执行情况分析
查看解析情况
select a.userid, b.usename, dbid, queryid, query, parses, max_parse_time, mean_parse_time from sys_stat_statements a ,sys_user b WHERE a.""userid"" = b.usesysid and b.usename='system';
查看 内存命中情况
select a.userid, b.usename, dbid, queryid, query, shared_blks_hit ""缓存读"", shared_blks_read ""IO读"" from sys_stat_statements a ,sys_user b WHERE a.""userid"" = b.usesysid;
查看等待事件 select a.usesysid, b.usename , wait_event_type,wait_event,state from sys_stat_activity a,sys_user b,sys_stat_statements c WHERE a.usesysid = b.usesysid AND a.query=c.""query"" and b.usename='system' AND c.""queryid"" ='';
查看是否有锁 通过查询sys_locks "
3、确定性能问题产生的原因&实施优化手段
通过以上收集的信息基本就可以判断出sql语句的性能问题并针对问题指定对应的优化措施
以下列举了一些常见的问以及对应解决方式
1、如果执行计划展示的预估row和实际执行rows数量差距比较大,表明统计信息不准确,建议收集统计信息
2、如果表的扫描方式是通过全表扫描即seq scan 方式执行的,需要分析where条件对应字段是的数据分布情况以及是否有索引。
3、判断join顺序的外部表和内部表,判断join顺序和方式是否合理,join方式是否合理。
4、sql语句有排序操作,可以通过执行计划的buffer选项判断是否用到是temp文件进行排序,如果用到了temp文件建议调整work_mem
5、部分慢语句确认执行计划已经最优,这时候可以尝试通过并行提速,但是建议使用hint方式开启并行,这样对全局影响最小。
6、通过分析该语句的内存命中情况发现IO读比较多,建议针对shared buffers 进行优化。
7、如果该语句长时间执行不返回结果建议查看等待时间和locks 视图排查是否有锁或等待事件。针对等待事件进行针对性调优。
8、在应用程序中尽可能使用预编译方式执行sql语句,降低因为解析带来的时间消耗。
9、表倾斜比较严重的情况进行查询可以进行反向条件方式优化,比如between 改成not between in 改成not in ,尽可能通过小的数据集完成join操作
表倾斜比较严重的情况进行查询可以进行反向条件方式优化,比如between 改成not between in 改成not in ,尽可能通过小的数据集完成join操作
10 、like 查询需要根据like 条件使用对应索引优化,金仓的btree索引针对‘aaa%'场景只有在colltion =C的情况下才走索引, 除此之外我们还可以使用
create index idx_t1 on t1(name text_pattern_ops);方式或者create table t1(id int, name text collate "C"); create index idx_t1 on t1(name); 进行like语句优化,
针对’%asb%‘ 情况我们需要创建对应的gin索引。 创建语句格式如下
create index idx_t2_trgm on t2 using gin(name gin_trgm_ops);
11、可以通过物化视图提前将大表的结果集减少,然后再利用物化视图进行sql查询。
注意事项
针对单条语句的sql 优化尽可能不要修改全局参数,或者进行库级别的调整,尽可能降低因为单条sql优化带来的全局风险
当然这篇博客整理的内容还是比较粗,有很多细节会在后续的博客中展开讲述
比如:
--cpu瓶颈判断方法
--IO是否饱和分析方法
--网络情况分析方法
--操作系统内存瓶颈分析方法
--如何判断执行计划不准确
--如何判断shared_buffer 不足
--如何判断排序用到了临时文件
--如何判断join顺序是否合适
--IO分析试图 sys_stdio_user_tables和 sys_stdio_user_indexes用法
-- sys_stat_activity 视图用法
-- sys_stat_statements 视图用法等
kingbaseES sql 优化技巧汇总的更多相关文章
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- 常用的7个SQl优化技巧
作为程序员经常和数据库打交道的时候还是非常频繁的,掌握住一些Sql的优化技巧还是非常有必要的.下面列出一些常用的SQl优化技巧,感兴趣的朋友可以了解一下. 1.注意通配符中Like的使用 以下写法会造 ...
- sql数据库优化技巧汇总
(转)SQL 优化原则 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着 ...
- 数据库的规范和SQL优化技巧总结
现总结工作与学习中关于数据库的规范设计与优化技巧 1.规范背景与目的 MySQL数据库与 Oracle. SQL Server 等数据库相比,有其内核上的优势与劣势.我们在使用MySQL数据库的时候需 ...
- WEB前端开发常用的优化技巧汇总
减少HTTP请求次数或者减少请求数据的大小 页面中每发送一次HTTP请求,都需要完成请求+响应这个完整的HTTP事务,会消耗一些时间,也可能会导致HTTP链接通道的堵塞,为了提高页面加载速度和运行的性 ...
- 19 个让 MySQL 效率提高 3 倍的 SQL 优化技巧
优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 本文我们就来谈谈 MySQL 中常用的 SQL 优化 ...
- 数据库查询优化-20条必备sql优化技巧
0.序言 本文我们来谈谈项目中常用的 20 条 MySQL 优化方法,效率至少提高 3倍! 具体如下: 1.使⽤ EXPLAIN 分析 SQL 语句是否合理 使⽤ EXPLAIN 判断 SQL 语句是 ...
- SQL优化技巧--远程连接对象引起的CTE性能问题
背景 最近SSIS的开发过程中遇到几个问题.其中使用CTE时,遇到一个远程连接对象,结果导致严重的性能问题,为了应急我就修改了代码. 之前我写了一篇介绍CTE的随笔包含了CTE的用法等: http:/ ...
- Hibernate SQL优化技巧dynamic-insert="true" dynamic-update="true"
最近正在拜读Hibernate之父大作<Java Persistence with Hibernate>,颇有收获.在我们熟悉的Hibernate映射文件中也大有乾坤,很多值得我注意的地方 ...
- 13个SQL优化技巧
避免无计划的全表扫描<!--?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
随机推荐
- Lambda 表达式总结
1 Lambda 表达式简介 Lambda 表达式是 JDK 8 的新特性,主要用于简化匿名内部类的定义,帮助用户方便.高效地书写优雅的代码. Lambda 表达式实现的必须是一个接口,并且接 ...
- Java Solon v2.7.0 发布
Java Solon 是什么框架? Java "生态级"应用开发框架.从零开始构建,有自己的标准规范与开放生态.(历时七年,具备全球第二级别的生态规模) 相对于 Spring,有什 ...
- js中返回今天是星期几的方法
var weeks=["星期日","星期一","星期二","星期三","星期四","星期五 ...
- Spring rce CVE-2022-22965
原理大致是这样:spring框架在传参的时候会与对应实体类自动参数绑定,通过"."还可以访问对应实体类的引用类型变量.使用getClass方法,通过反射机制最终获取tomcat的日 ...
- day04---虚拟主机网络配置的三种模式介绍
课程大纲 补充:安装系统过程中 分区的知识 1.虚拟软件使用方法 2.操作系统网络配置 3.虚拟主机网络设置 4.操作系统远程连接 5.远程连接排错思路 补充:安装系统过程中 分区的知识 1.企业常见 ...
- 【Azure Spring Cloud】在Azure Spring Apps上看见 App Memory Usage 和 jvm.menory.use 的指标的疑问及OOM
问题描述 在Azure的Spring Cloud服务 (官名为:Spring Apps)中,在Metrics 页面中查看 App Memory Usage 和 jvm.memory.use,发现两则在 ...
- 【Azure 环境】台湾同胞:詢問大陸所有廠牌手機是否都可透過通知中心發送訊息
什么是 Azure 通知中心? Azure 通知中心提供易于使用且向外扩展的推送引擎,可用于将通知发送到任何平台 (iOS.Android.Windows.Kindle.百度等 ) 从任何后端 (云和 ...
- spring Cloud 有哪些组件?
Eureka:服务注册与发现,每个服务都向eureka提供自己的ip地址,端口号,协议,通信协议,eureka将各个服务维护到一个服务清单中(双层map,第一层key为服务名,第二层key为实例名), ...
- PlatformIO+esp32+添加自己的库(.c.h文件)
什么都放main.c的话,很有可能堆积成屎山,所以我想给分开写,每个功能有自己的.c..h文件. 在lib下新建文件夹,例如led,再在里面分别建led.c.led.h; 写好内容后再main ...
- kafka的数据同步原理ISR、ACK、LEO、HW
1.数据可靠性保证,数据同步 为保证 producer 发送的数据,能可靠的发送到指定的 topic,topic 的每个 partition 收到 producer 发送的数据后,都需要向 produ ...