SQL性能优化的小技巧二

九、提高group by语句的效率
1、反例

先分组,再过滤

select job, avg(salary) from employee 
group by job
having job ='develop' or job = 'test';
1
2
3
2、正例

先过滤,后分组

select job,avg(salary) from employee 
where job ='develop' or job = 'test' 
group by job;
1
2
3
3、理由

可以在执行到该语句前,把不需要的记录过滤掉

十、清空表时优先使用truncate
truncate table在功能上与不带 where子句的 delete语句相同:二者均删除表中的全部行。但 truncate table比 delete速度快,且使用的系统和事务日志资源少。

delete语句每次删除一行,并在事务日志中为所删除的每行记录一项。 truncate table通过释放存储表数据所用的数据页来删除数据,并且只在事务日志中记录页的释放。

truncate table删除表中的所有行,但表结构及其列、约束、索引等保持不变。新行标识所用的计数值重置为该列的种子。如果想保留标识计数值,请改用 DELETE。如果要删除表定义及其数据,请使用 drop table语句。

对于由 foreign key约束引用的表,不能使用 truncate table,而应使用不带 where子句的 DELETE 语句。由于 truncate table不记录在日志中,所以它不能激活触发器。

truncate table不能用于参与了索引视图的表。

十一、操作delete或者update语句,加个limit或者循环分批次删除
1、降低写错SQL的代价

清空表数据可不是小事情,一个手抖全没了,删库跑路?如果加limit,删错也只是丢失部分数据,可以通过binlog日志快速恢复的。

2、SQL效率很可能更高

SQL中加了limit 1,如果第一条就命中目标return, 没有limit的话,还会继续执行扫描表。

3、避免长事务

delete执行时,如果age加了索引,MySQL会将所有相关的行加写锁和间隙锁,所有执行相关行会被锁住,如果删除数量大,会直接影响相关业务无法使用。

4、数据量大的话,容易把CPU打满

如果你删除数据量很大时,不加 limit限制一下记录数,容易把cpu打满,导致越删越慢。

5、锁表

一次性删除太多数据,可能造成锁表,会有lock wait timeout exceed的错误,所以建议分批操作。

十二、UNION操作符
UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果。
实际大部分应用中是不会产生重复的记录,最常见的是过程表与历史表UNION。如:

select username,tel from user
union
select departmentname from department
1
2
3
这个SQL在运行时先取出两个表的结果,再用排序空间进行排序删除重复的记录,最后返回结果集,如果表数据量大的话可能会导致用磁盘进行排序。
推荐方案:采用UNION ALL操作符替代UNION,因为UNION ALL操作只是简单的将两个结果合并后就返回。
尚学堂给同学们带来全新的Java300集课程啦!java零基础小白自学Java必备优质教程_手把手图解学习Java,让学习成为一种享受_哔哩哔哩_bilibili

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark SQL性能优化是提高Spark SQL查询速度和效率的关键。下面是一些建议和技巧: 1. 数据分区和分桶:通过合理的数据分区和分桶,可以减少数据倾斜和提高查询性能。使用合适的列进行分区和分桶,可以使查询只针对特定的数据子集进行操作。 2. 数据压缩:使用适当的数据压缩方式可以减少数据存储和传输的成本,并提高查询性能。Spark SQL支持多种压缩格式,如Snappy、Gzip等。 3. 合理设置资源:根据集群规模和任务需求,合理设置Spark SQL的资源配置。包括executor内存、executor核数、并行度等参数的调整,可以根据具体情况进行优化。 4. 数据倾斜处理:数据倾斜是指某些数据分区的大小远远超过其他分区,导致任务执行时间变长。可以采用一些技术手段来解决数据倾斜问题,如使用随机前缀、增加分区、使用广播变量等。 5. 使用合适的数据格式:选择适合查询需求的数据格式可以提高查询性能。例如,Parquet格式支持谓词下推和列式存储,可以减少IO和提高查询速度。 6. 缓存和持久化:对于经常被重复查询的数据,可以使用Spark的缓存和持久化机制,将数据存储在内存或磁盘上,避免多次计算和IO操作。 7. SQL优化:优化SQL查询语句,包括选择合适的连接方式、使用合适的索引、避免不必要的数据转换和计算等。 8. 资源监控和调优:通过Spark监控工具,如Spark UI、Ganglia等,可以实时监控任务的资源使用情况,及时发现和解决性能瓶颈。 综上所述,通过合理的数据分区和分桶、数据压缩、资源配置、数据倾斜处理、数据格式选择、缓存和持久化、SQL优化以及资源监控和调优等手段,可以有效提高Spark SQL的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值