人大金仓数据库KingbaseES-查询优化器概述

关键字:

SQL调优、SQL语言特点、SQL处理过程、优化器、统计信息、人大金仓、KingbaseES

SQL 语言特点

SQL 语言的特点为:

(1) 综合统一

SQL 语言集数据定义语言 DDL、数据操纵语言 DML、数据控制语言 DCL 的功能于一体。

(2) 高度非过程化

用户只需提出“做什么”,而不必指明“怎么做”。存取路径的选择以及 SQL 语句的操作过程由系统自动完成。大大减轻了用户负担,而且有利于提高数据独立性。

由于 SQL 语言高度非过程化的特点,面对一个 SQL 语句应该要如何处理完全由数据库管理系统决定选择,当处理过程不够高效时就会出现一些性能问题,此时则需要人工的干预,进行性能调优,从而达到我们的性能目标。

SQL处理过程

在 KingbaseES 中,SQL 语句的处理通常都要经历词法语法分析阶段(parser)语义检查阶段(analyzer)查询重写阶段(rewritter)查询优化阶段(planner)查询执行阶段(executor)5个阶段,如图所示。

C:\Users\sunna\Desktop\图片3.png

(1) 词法语法分析阶段:检查 SQL 语句是否符合词法语法规则,然后转化为解析树。

(2) 语义检查阶段:检查解析树是否符合语义规则,然后转化为查询树。

(3) 查询重写阶段:如果查询树中涉及视图或者规则,重写为查询树。

(4) 查询优化阶段:经过逻辑优化和物理优化,生成最优的执行计划。

(5) 查询执行阶段:按照执行计划进行执行。

查询优化器简介

(1) 优化器概念

优化器是数据库里的一个核心子系统,它的目的是按照一定的规则来得到它认为的目标SQL在当前情形下的最高效的执行路径,也就是说优化器的目的是为了得到目标SQL 的执行计划。

(2) 优化器作用

对于一条给定的SQL语句,通常会有一个或多个执行计划可供选择,每个执行计划都可以返回正确的结果,给出预期运行最快的执行计划。

(3) 优化技术

① 基于规则的逻辑优化(RBO)

查询优化器在逻辑优化阶段的主要任务是:根据关系代数的等价变换规则找出更高效的变换形式。常见逻辑优化包括:视图重写Inline cte表达式预处理子查询优化等价谓词重写条件化简外连接消除以及谓词下推

构造查询的基本动作通常由关系代数的操作符来表达,常见关系代数的操作符包括:

  • 选择:与 SQL 查询的 WHERE 子句对应
  • 投影:与 SQL 查询的 SELECT 子句对应
  • 卡氏积:与 SQL 查询的 FROM 子句的关系列表对应
  • 连接:与 SQL 查询中的 JOIN、NATURAL JOIN 和 OUTER JOIN 对应
  • 并、交和差:与 SQL 的操作符 UNION、INTERSECT、EXCEPT 对应
  • 消除重复:与 SQL SELECT 子句中的关键字 DISTINCT 对应,SQL 的操作符 UNION、INTERSECT、EXCEPT 默认消除重复
  • 分组:与 SQL 查询中的 GROUP BY 对应
  • 排序:与 SQL 查询中的 ORDER BY 具有相同的效果

② 基于代价估算的物理优化(CBO)

物理优化会选择那些消耗系统I/O和CPU资源最少的执行路径作为最优选择,在解析目标时,首先会对SQL进行查询转换,然后计算完成查询转换之后得到的等价改写SQL的各种可能的执行路径的成本,再从这些执行路径里选择成本值最小的一条来作为原目标SQL的执行计划,最后KingbaseES就会根据此执行计划去实际执行该SQL,并将执行结果返回给用户。

物理优化原理:枚举所有的执行路径,估算其代价,选出代价最小的路径作为执行计划。

路径多样的原因:各种关系代数操作符在KingbaseES中存在着一种或者多种算法来应对不同情况,包括:

  • 选择:seqscan、indexscan、index only scan等
  • 排序:sort、indexscan
  • 连接:hashjoin、merge join、nestloopjoin(连接顺序也可以变化)
  • 聚集:hashaggregate、groupaggregate

物理优化的一个重要手段是代价估算,即估算某个路径(可以是单表的路径,也可以是两个关系连接得到的路径,还可以是多个表根据不同的连接方式得到的连接路径)的代价。这些路径中每个节点主要的操作可归纳为数据的读写及运算,这些操作所产生的开销主要为 CPU 开销及 I/O 开销。所以查询优化代价估算基于 CPU 开销和 IO 开销,即:总代价 =I/O 代价 + CPU 代价。

影响COST计算的几个常见问题如下:

  • Cardinality:集的势,指定集合所包含的记录数,或者说指定结果集的行数,表示对目标SQL的某个具体执行步骤的执行结果包含的记录数的估算。某步骤的Cardinality越大,对应的成本值越大,总成本也就越大。
  • Selectivity:可选择率,范围为0-1,值越小,表设计的选择性越好,在为1时的选择性是最差的。

【说明】

▫ Selectivity = 施加指定谓词条件后返回结果集的记录数/为施加任何谓词条件的原始结果集的记录数

▫ Cardinality和Selectivity的值会直接影响CBO对于相关执行步骤的估算,进而影响CBO对于目标SQL执行计划的选择。

  • 成本因子:例如,连续或随机扫描单个数据块的成本因子,CPU从HEAP块处理一条记录的成本因子,从INDEX块处理一条索引记录的成本因子等。
  • 数据存储物理顺序和索引顺序的离散度,会影响索引扫描的计算成本。
  • 内存大小,会影响索引扫描的计算成本。
  • 列统计信息(列、宽、空值比例,唯一值比例,高频值及其比例,bucket等)会影响选择性,即结果集行数,最终影响索引扫描的计算成本。
  • 回表:如果回表次数太多,就不应该走索引了,应该走全表扫描,所以在SQL优化时,必须关注回表次数,要注意回表的物理I/O次数。
  • 表与表之间的关系

优化器的局限性

KingbaseES 的查询优化器会存在一些无法覆盖的情况,最常见的两种情况及解决方式如下:

(1) 对于尚未支持的逻辑优化规则,建议用户通过改写的方式来写出更加高效的 SQL 语句;

(2) 对于代价计算不准(多条件、多表连接、相关子查询条件等)的情况,建议用户通过 HINT 的方式人工指定计划。

参考资料

产品手册

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值