openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程236.1 Query执行流程236.1.1 调优手段之统计信息236.1.2 调优手段之GUC参数236.1.3 调优手段之底层存储236.1.4 调优手段之SQL重写
openGauss学习笔记-236 openGauss性能调优-SQL调优-Query执行流程
SQL调优的唯一目的是“资源利用最大化”,即CPU、内存、磁盘IO三种资源利用最大化。所有调优手段都是围绕资源使用开展的。所谓资源利用最大化是指SQL语句尽量高效,节省资源开销,以最小的代价实现最大的效益。比如做典型点查询的时候,可以用seqscan+filter(即读取每一条元组和点查询条件进行匹配)实现,也可以通过indexscan实现,显然indexscan可以以更小的代价实现相同的效果。
根据硬件资源和客户的业务特征确定合理的openGauss部署方案和表定义是数据库在多数情况下满足性能要求的基础。下文的调优说明假设您已根据“软件安装”指引在安装过程中按照合理的openGauss方案完成了安装,且已经根据“开发设计建议”的指引进行了数据库设计。
236.1 Query执行流程
SQL引擎从接受SQL语句到执行SQL语句需要经历的步骤如图1和表1所示。其中,红色字体部分为DBA可以介入实施调优的环节。
图 1 SQL引擎执行查询类SQL语句的流程 [图片上传失败...(image-852688-1709632755627)]
表 1 SQL引擎执行查询类SQL语句的步骤说明
步骤 | 说明 |
---|---|
1、语法&词法解析 | 按照约定的SQL语句规则,把输入的SQL语句从字符串转化为格式化结构(Stmt)。 |
2、语义解析 | 将“语法&词法解析”输出的格式化结构转化为数据库可以识别的对象。 |
3、查询重写 | 根据规则把“语义解析”的输出等价转化为执行上更为优化的结构。 |
4、查询优化 | 根据“查询重写”的输出和数据库内部的统计信息规划SQL语句具体的执行方式,也就是执行计划。统计信息和GUC参数对查询优化(执行计划)的影响,请参见调优手段之统计信息和调优手段之GUC参数。 |
5、查询执行 | 根据“查询优化”规划的执行路径执行SQL查询语句。底层存储方式的选择合理性,将影响查询执行效率。详见调优手段之底层存储。 |
236.1.1 调优手段之统计信息
openGauss优化器是典型的基于代价的优化(Cost-Based Optimization,简称CBO)。在这种优化器模型下,数据库根据表的元组数、字段宽度、NULL记录比率、distinct值、MCV值、HB值等表的特征值,以及一定的代价计算模型,计算出每一个执行步骤的不同执行方式的输出元组数和执行代价(cost),进而选出整体执行代价最小/首元组返回代价最小的执行方式进行执行。这些特征值就是统计信息。从上面的描述可以看出统计信息是查询优化的核心输入,准确的统计信息将帮助规划器选择最合适的查询规划。一般来说我们会通过ANALYZE语法收集整个表或者表的若干个字段的统计信息,周期性地运行ANALYZE,或者在对表的大部分内容做了更改之后马上运行ANALYZE。
236.1.2 调优手段之GUC参数
查询优化的主要目的是为查询语句选择高效的执行方式。
如下SQL语句:
select count(1)
from customer inner join store_sales on (ss_customer_sk = c_customer_sk);
在执行customer inner join store_sales的时候,openGauss支持Nested Loop、Merge Join和Hash Join三种不同的Join方式。优化器会根据表customer和表store_sales的统计信息估算结果集的大小以及每种join方式的执行代价,然后对比选出执行代价最小的执行计划。
正如前面所说,执行代价计算都是基于一定的模型和统计信息进行估算,当因为某些原因代价估算不能反映真实的cost的时候,我们就需要通过guc参数设置的方式让执行计划倾向更优规划。
236.1.3 调优手段之底层存储
openGauss的表支持行存表、列存表,底层存储方式的选择严格依赖于客户的具体业务场景。一般来说计算型业务查询场景(以关联、聚合操作为主)建议使用列存表;点查询、大批量UPDATE/DELETE业务场景适合行存表。
对于每种存储方式还有对应的存储层优化手段,这部分会在后续的调优章节深入介绍。
236.1.4 调优手段之SQL重写
除了上述干预SQL引擎所生成执行计划的执行性能外,根据数据库的SQL执行机制以及大量的实践发现,有些场景下,在保证客户业务SQL逻辑的前提下,通过一定规则由DBA重写SQL语句,可以大幅度的提升SQL语句的性能。
这种调优场景对DBA的要求比较高,需要对客户业务有足够的了解,同时也需要扎实的SQL语句基本功,后续会介绍几个常见的SQL改写场景。
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!