【云小课】【第38课】GaussDB(for openGauss)如何进行SQL调优

网友投稿 716 2022-05-29

数据库使用过程中,SQL调优是提升数据库性能的重点。SQL调优的唯一目的是“资源利用最大化”,即CPU、内存、磁盘IO、网络IO四种资源利用最大化。所有调优手段都是围绕资源使用开展的。所谓资源利用最大化是指SQL语句尽量高效,节省资源开销,以最小的代价实现最大的效益。本章介绍典型的SQL调优的方法和案例。

调优流程

对慢SQL语句进行分析,通常包括以下步骤:

1. 收集SQL中涉及到的所有表的统计信息。在数据库中,统计信息是规划器生成计划的源数据。没有收集统计信息或者统计信息陈旧往往会造成执行计划严重劣化,从而导致性能问题。从经验数据来看,10%左右性能问题是因为没有收集统计信息。具体请参见更新统计信息。

通过查看执行计划来查找原因。如果SQL长时间运行未结束,通过EXPLAIN命令查看执行计划,进行初步定位。如果SQL可以运行出来,则推荐使用EXPLAIN ANALYZE或EXPLAIN PERFORMANCE查看执行计划及实际运行情况,以便更精准地定位问题原因。有关执行计划的详细介绍请参见SQL执行计划介绍。

3. 审视和修改表定义。

4. 针对EXPLAIN或EXPLAIN PERFORMANCE信息,定位SQL慢的具体原因以及改进措施,具体参见典型SQL调优点。

5. 通常情况下,有些SQL语句可以通过查询重写转换成等价的,或特定场景下等价的语句。重写后的语句比原语句更简单,且可以简化某些执行步骤达到提升性能的目的。查询重写方法在各个数据库中基本是通用的。经验总结:SQL语句改写规则介绍了几种常用的通过改写SQL进行调优的方法。

典型调优案例

选择合适的分布列

现象描述:

表定义如下:

CREATE TABLE t1 (a int, b int); CREATE TABLE t2 (a int, b int);

执行如下查询:

SELECT * FROM t1, t2 WHERE t1.a = t2.b;

优化分析:

如果将a作为t1和t2的分布列:

CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a); CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (a);

【云小课】【第38课】GaussDB(for openGauss)如何进行SQL调优

则执行计划将存在“Streaming”,导致DN之间存在较大通信数据量。

如果将a作为t1的分布列,将b作为t2的分布列:

CREATE TABLE t1 (a int, b int) DISTRIBUTE BY HASH (a); CREATE TABLE t2 (a int, b int) DISTRIBUTE BY HASH (b);

则执行计划将不包含“Streaming”,减少DN之间存在的通信数据量,从而提升查询性能。

建立合适的索引。

现象描述:

查询与销售部所有员工的信息:

SELECT staff_id,first_name,last_name,employment_id,state_name,city FROM staffs,sections,states,places WHERE sections.section_name='Sales' AND staffs.section_id = sections.section_id AND sections.place_id = places.place_id AND places.state_id = states.state_id ORDER BY staff_id;

优化分析:

建议在places.place_id和states.state_id列上建立2个索引。

更多其他调优案例请参考调优案例。

云小课 云数据库 GaussDB(for openGauss) 数据库

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:程序员因重复记录日志撑爆ELK被辞退!
下一篇:节后返工压力大?容智iBot帮你补回失去的时间
相关文章