大数据计算-SQL优化手段(CBO)-以Flink为例

文章目录

背景

大数据计算中,SQL生成的执行计划第一轮会经过固定规则的优化,第二轮会根据原计划,生成多条结合成本的的执行计划,根据cost 进行排序,选出最优的执行计划。

理论知识

原始计划如左图,

有三种执行方案

方案1,scan表1,scan表2,然后hash ,再join

方案2,scan表1,scan表2,然后broadcast 表1 ,再join

方案2,scan表1,scan表2,然后broadcast 表2 ,再join

从成本(只看行数)来看,如果表aa_user 行数远小于bb_order ,那 方案2得出来的成本就是最优的。

下面是示意图

示例

aa_user 的表行数远小于bb_order

bash 复制代码
 public static void main(String[] args) {
        EnvironmentSettings settings = EnvironmentSettings.inBatchMode();

        TableEnvironment tableEnvironment = TableEnvironment.create(settings);

        Schema schema = Schema.newBuilder().column("count", DataTypes.INT()).column("word", DataTypes.STRING()).build();

        Schema schema1 = Schema.newBuilder().column("id", DataTypes.INT()).column("name", DataTypes.STRING()).build();


        tableEnvironment.createTemporaryTable("aa_user", TableDescriptor.forConnector("filesystem").schema(schema)
                .option("path","/Users/xx/IdeaProjects/flink-demo/data/order.csv").format("csv").build());


        tableEnvironment.createTemporaryTable("bb_order", TableDescriptor.forConnector("filesystem").schema(schema1)
                .option("path","/Users/xx/IdeaProjects/flink-demo/data/user.csv").format("csv").build());



      //  tableEnvironment.executeSql("select * from aa_user").print();

        //tableEnvironment.executeSql("select * from aa_user inner join bb_order on `aa_user`.`count`=`bb_order`.`id`").print();


    String cost=    tableEnvironment.explainSql("select * from aa_user inner join bb_order on `aa_user`.`count`=`bb_order`.`id`", ExplainDetail.ESTIMATED_COST);
        System.out.println(cost);

    }

结果展示

bash 复制代码
== Abstract Syntax Tree ==
LogicalProject(count=[$0], word=[$1], id=[$2], name=[$3])
+- LogicalJoin(condition=[=($0, $2)], joinType=[inner])
   :- LogicalTableScan(table=[[default_catalog, default_database, aa_user]])
   +- LogicalTableScan(table=[[default_catalog, default_database, bb_order]])

== Optimized Physical Plan ==
NestedLoopJoin(joinType=[InnerJoin], where=[=(count, id)], select=[count, word, id, name], build=[left]): rowcount = 87.6, cumulative cost = {673.6 rows, 1484.0 cpu, 9344.0 io, 32.0 network, 40.0 memory}
:- Exchange(distribution=[broadcast]): rowcount = 2.0, cumulative cost = {4.0 rows, 320.0 cpu, 32.0 io, 32.0 network, 0.0 memory}
:  +- TableSourceScan(table=[[default_catalog, default_database, aa_user]], fields=[count, word]): rowcount = 2.0, cumulative cost = {2.0 rows, 0.0 cpu, 32.0 io, 0.0 network, 0.0 memory}
+- TableSourceScan(table=[[default_catalog, default_database, bb_order]], fields=[id, name]): rowcount = 582.0, cumulative cost = {582.0 rows, 0.0 cpu, 9312.0 io, 0.0 network, 0.0 memory}

== Optimized Execution Plan ==
MultipleInput(readOrder=[0,1], members=[\nNestedLoopJoin(joinType=[InnerJoin], where=[(count = id)], select=[count, word, id, name], build=[left])\n:- [#1] Exchange(distribution=[broadcast])\n+- [#2] TableSourceScan(table=[[default_catalog, default_database, bb_order]], fields=[id, name])\n])
:- Exchange(distribution=[broadcast])
:  +- TableSourceScan(table=[[default_catalog, default_database, aa_user]], fields=[count, word])
+- TableSourceScan(table=[[default_catalog, default_database, bb_order]], fields=[id, name])
结果解释

NestedLoopJoin:Flink 选择了嵌套循环连接(Nested Loop Join)作为执行 JOIN 的策略,使用 count = id 作为连接条件。

Exchange(distribution=[broadcast]):表示将 aa_user 表的数据广播分发,以减少数据移动的开销,rowcount = 2.0 表示预估的行数。

TableSourceScan:直接扫描表 aa_user 和 bb_order,并读取相应的字段。表 aa_user 预估有 2 行,表 bb_order 预估有 582 行

相关推荐
双力臂4045 小时前
MyBatis动态SQL进阶:复杂查询与性能优化实战
java·sql·性能优化·mybatis
诗旸的技术记录与分享6 小时前
Flink-1.19.0源码详解-番外补充3-StreamGraph图
大数据·flink
资讯分享周6 小时前
Alpha系统联结大数据、GPT两大功能,助力律所管理降本增效
大数据·gpt
A__tao6 小时前
一键将 SQL 转为 Java 实体类,全面支持 MySQL / PostgreSQL / Oracle!
java·sql·mysql
G皮T7 小时前
【Elasticsearch】深度分页及其替代方案
大数据·elasticsearch·搜索引擎·scroll·检索·深度分页·search_after
A__tao7 小时前
SQL 转 Java 实体类工具
java·数据库·sql
TDengine (老段)8 小时前
TDengine STMT2 API 使用指南
java·大数据·物联网·时序数据库·iot·tdengine·涛思数据
用户Taobaoapi20149 小时前
母婴用品社媒种草效果量化:淘宝详情API+私域转化追踪案例
大数据·数据挖掘·数据分析
G皮T10 小时前
【Elasticsearch】检索排序 & 分页
大数据·elasticsearch·搜索引擎·排序·分页·检索·深度分页
Edingbrugh.南空11 小时前
Flink MySQL CDC 环境配置与验证
mysql·adb·flink