浅谈SQL执行计划优化(GBase8s篇)

Posted 麒思妙想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈SQL执行计划优化(GBase8s篇)相关的知识,希望对你有一定的参考价值。

在日常开发的过程中,对于 SQL 的优化,一直是一个比较有挑战的事情,所谓工欲善其事必先利其器,那么今天我们就来看看 如何查看GBase8s 的执行计划,并有哪些调优手段。

执行计划优化

RBO

RBO(Rule-based optimization)所谓基于规则优化,就是指通过一系列预先定义好的规则(Rule)对逻辑计划进行等价转换,以提高查询效率。减少参与计算的数据量降低重复计算的代价

优点:RBO相对于CBO而言要成熟得多,常用的规则都基于经验制定,可以覆盖大部分查询场景,并且方便扩展。

缺点:不够灵活,毕竟这个阶段对物理上的特征(如表的底层存储形式和真正的数据量)还没有感知。

常见手段

  • 谓词下推 Predicate Pushdown
  • 常量折叠 Constant Folding
  • 列裁剪 Column Prunin



CBO

CBO(Cost-based optimization) 原理是计算所有可能的物理计划的代价,并挑选出代价最小的物理执行计划。其核心在于评估一个给定的物理执行计划的代价。

物理执行计划是一个树状结构,其代价等于每个执行节点的代价总合

而每个执行节点的代价,分为两个部分

  • 该执行节点对数据集的影响,或者说该节点输出数据集的大小与分布
  • 该执行节点操作算子的代价

每个操作算子的代价相对固定,可用规则来描述。而执行节点输出数据集的大小与分布,分为两个部分:1) 初始数据集,也即原始表,其数据集的大小与分布可直接通过统计得到;2)中间节点输出数据集的大小与分布可由其输入数据集的信息与操作本身的特点推算。

所以,最终主要需要解决两个问题

  • 如何获取原始数据集的统计信息
  • 如何根据输入数据集估算特定算子的输出数据集


如何查看GBase8s的执行计划

开启并配置执行计划

> set explain on;

Explain set.

> set explain file to '/opt/GBASE/gbase/aaa.out';

Explain set.

> select o.oid,o.counts,o.memo,i.iid,i.name,i.catalog,(1+1+i.iid) from order_table as o inner join item_table as i on o.iid = i.iid  where i.iid < 10;



oid           1
counts        10
memo
iid           1
name          fifa2022
catalog       game
(expression)  3

1 row(s) retrieved.


查看执行计划

[jacky@localhost gbase]$ cat aaa.out


QUERY: (OPTIMIZATION TIMESTAMP: 02-17-2022 22:44:39)
------
select o.oid,o.counts,o.memo,i.iid,i.name,i.catalog,(1+1+i.iid) from order_table as o inner join item_table as i on o.iid = i.iid  where i.iid < 10

Estimated Cost: 4
Estimated # of Rows Returned: 1

  1) gbasedbt.o: SEQUENTIAL SCAN

        Filters: gbasedbt.o.iid < 10

  2) gbasedbt.i: INDEX PATH

    (1) Index Name: gbasedbt. 299_5
        Index Keys: iid   (Serial, fragments: ALL)
        Lower Index Filter: gbasedbt.o.iid = gbasedbt.i.iid
NESTED LOOP JOIN


Query statistics:
-----------------

  Table map :
  ----------------------------
  Internal name     Table name
  ----------------------------
  t1                o
  t2                i

  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t1     1          1         1          00:00.00   2

  type     table  rows_prod  est_rows  rows_scan  time       est_cost
  -------------------------------------------------------------------
  scan     t2     1          1         1          00:00.00   0

  type     rows_prod  est_rows  time       est_cost
  -------------------------------------------------
  nljoin   1          1         00:00.00   4


好了,今天我们就先分享到这里,欢迎大家与我交流。

参考资料

本文中图片大部分引用自Spark Catalyst 介绍

https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=158869574

https://www.jianshu.com/p/410c23efb565

以上是关于浅谈SQL执行计划优化(GBase8s篇)的主要内容,如果未能解决你的问题,请参考以下文章

Spark SQL CBO 基于代价的优化

引用:初探Sql Server 执行计划及Sql查询优化

通过分析SQL语句的执行计划优化SQL

DSE精选综述 | 关于提升数据库优化器:基数估计代价模型计划枚举

实战篇:MySQL优化系列--SQL优化实战

Mysql SQL优化&执行计划