遇到慢SQL该怎么办?(下)_sql表上下连接很慢(1),大数据开发基础开发

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新大数据全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注大数据)
img

正文

目录

表本身包含大量数据

SQL语句写得很差

总结


表本身包含大量数据

尽管openGauss对于大的行存表处理性能非常优秀,但表本身的数据情况依然是导致慢SQL的重要原因。一般来说,具有以下几种情况:

1. 表的数据量很大,且很少被缓存,导致语句需要扫描的元组很多;

2. 表的数据量很大,在修改、删除数据时需要修改较多的元组;

3. 向表中插入的数据量很大;

4. 业务上需要检索出的数据量很多;

5. 频繁的数据修改,导致表中存在很多死元组(dead tuple),影响扫描性能;

表的数据量较大导致的慢SQL问题,一般需要从业务上进行入手,直接通过修改数据库来达到优化慢SQL的目的是很难实现的。因此,需要用户分析具体的业务,对业务数据进行冷热分离、分库分表、使用分布式中间件等。如果希望在数据库层进行优化,则可以通过增加宿主机的内存,进而增加max_process_memory、shared_buffers、work_mem等的大小;使用性能更佳的磁盘;适当创建索引;使用表空间调整磁盘布局等。

SQL语句写得很差

由SQL语句写法问题导致的慢SQL也相对多见,这类写得比较差的慢SQL也被俗称为“烂SQL”。多数情况都下,由“烂SQL”导致的索引失效的问题较多,对于这种情况,可参考前面的描述对SQL语句进行改写,使其能够使用到索引。

除了修改慢SQL使其能够使用索引,下面还列出了几种比较常见的、可能优化openGauss数据库性能的SQL改写规则:

改写规则改写条件改写说明原始查询语句示例改写后语句示例
将’select distinct *‘改写为’select *’所查询表格含唯一列或主键通过确定tuple无重复,去掉distinct,从而省去去重步骤,提升效率select distinct * from bmsql_customer limit 10;select * from bmsql_customer limit 10;
将having子句中条件放到where子句中-将谓词表达式提前,可有效缩减group时的数据集select cfg_name from bmsql_config group by cfg_name having cfg_name=‘1’select cfg_name from bmsql_config where cfg_name = ‘1’ group by cfg_name
简化where子句中谓词表达式-某些复杂谓词无法有效触发openGauss内的rewrite逻辑,无法使用索引扫描select o_w_id, o_d_id, o_id, o_c_id from bmsql_oorder where o_w_id + 1> 3select o_w_id, o_d_id, o_id, o_c_id from bmsql_oorder where o_w_id > 2
将order by或group by中的无用列去掉group by或order by涉及的列包含在where子句中的等值表达式中去掉无用字段,SQL更为简洁select cfg_name from bmsql_config where cfg_name=‘2’ group by cfg_name order by cfg_name, cfg_valueselect cfg_name from bmsql_config where cfg_name = ‘2’ order by cfg_value
去掉where子句中永为真的表达式-去掉无用字段,SQL更为简洁select * from bmsql_config where 1=1 and 2=2 limit 10select * from bmsql_config limit 10
将union转换为union all-避免了去重带来的执行代价select * from bmsql_config union select * from bmsql_configselect * from bmsql_config union all select * from bmsql_config
将delete语句转换为truncate语句无where子句将DML语句转换为DDL语句,一次性回收表空间,执行速度更快delete from bmsql_configtruncate table bmsql_config
将where子句中’or’连接的等式转换为’in’结构-'in’结构可加快过滤速度select * from bmsql_stock where  s_w_id=10 or  s_w_id=1 or s_w_id=100 or  s_i_id=1 or s_i_id=10select * from bmsql_stock where  s_w_id in (1,10,100) or  s_i_id in(1,10)
将self join查询拆分为效率更高两个子查询1) self join查询。 2) where子句包含相同列差值的范围查询。 例如1<a.id-b.id<10,其中a,b为同一个表的两个alias。通过等值谓词加快查询速度select a.c_id from bmsql_customer a, bmsql_customer b where a.c_id - b.c_id <= 20 and a.c_id > b.c_idselect * from (select a.c_id from bmsql_customer as a, bmsql_customer as b where trunc((a.c_id) / 20) = trunc(b.c_id / 20) and a.c_id > b.c_id    union all select a.c_id from bmsql_customer as a, bmsql_customer as b where trunc((a.c_id) / 20) = trunc(b.c_id / 20 + 1) and a.c_id - b.c_id <= 20)

对于业务系统,SQL语句上线之前的审计工作基本都可以覆盖上述的场景,业内也具备很多对SQL语句进行改写的工具,不过这些工具的一些改写规则并不是绝对意义上的等值改写。而且,很多改写条件对于openGauss来说不见得有效,因为openGauss在数据库内部也存在rewrite逻辑。

DBMind平台会进一步演进SQL语句的智能改写功能,提供给用户在线的交互式智能查询改写能力,预计在未来的版本中与用户见面。

总结

我们在上面已经列出了能够导致慢SQL的原因,基本覆盖了在openGauss上造成慢SQL的大多数原因。不过,one-by-one 手动地进行慢SQL检查对于用户来说工作量确实太大。故而,openGauss的DBMind功能本身已经集成了对慢SQL进行智能根因识别的能力,用户可以通过运行下述命令在后台启动慢SQL根因分析功能(需要首先部署Prometheus以及expoter,以便能够采集到监控指标):

gs_dbmind service start -c confpath --only-run slow_query_diagnosis

注:显式指定 --only-run 参数可以仅启动被选择的DBMind服务项

被诊断后的慢SQL会存储在元数据库(存放诊断结果的数据库)中,用户可以通过下述命令查看:

gs_dbmind component slow_query_diagnosis show -c confpath --query SQL --start-time timestamps0 --end-time timestamps1

也可以通过与Grafana联合来展示慢SQL的分析结果,DBMind也提供了简单的Grafana配置模板,可供用户参考:

https://github.com/opengauss-mirror/openGauss-server/blob/master/src/gausskernel/dbmind/tools/misc/grafana-template-slow-query-analysis.json

由于openGauss官方网站的发行包中的DBMind可能滞后于代码托管平台(gitee或github)上的最新代码,直接编译openGauss又需要花费很多的时间。故而,如果用户只是想单纯提取最新的DBMind功能,可以通过下面的Linux命令来实现:


git clone -b master --depth 1 https://gitee.com/opengauss/openGauss-server.git
cd openGauss-server/src/gausskernel/dbmind/
mv tools dbmind
tar zcf dbmind.tar.gz gs_dbmind dbmind

将生成的dbmind.tar.gz 压缩包在合适的部署位置解压即可。

当然,如果用户希望手动检查一下慢SQL的原因,也可以根据附表的检查项来检查慢SQL的产生原因。

附表:慢SQL检查列表

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注大数据)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

数据)**
[外链图片转存中…(img-0y8I3d1U-1713437493025)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值