当前位置: 首页 > news >正文

大数据计算-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

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);}

结果展示

== 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 行

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 智能合约开发与测试1
  • 如何安全上网后能保障源代码泄密
  • 使用LinkedHashMap实现固定大小的LRU缓存
  • 三维重建学习
  • 计算机基础知识复习8.30
  • 若依脚手架 创建一个系统 his医院信息管理系统
  • 数据库表的分类
  • 数字芯片设计验证经验分享系列文章(第四部分):将ASIC IP核移植到FPGA上——如何测试IP核的功能和考虑纯电路以外的其他因素
  • 物品租赁​​​​​​​|基于SprinBoot+vue的物品租赁​​​​​​​系统(源码+数据库+文档)
  • Hive SQL
  • 只有十几岁,能不能学黑客技术或网络安全?
  • UE5 摄像机图像采集到材质 映射到 UI 和 物体表面
  • 【C++】RAII思想与智能指针原理——有效避免内存泄露问题
  • 数字时代的内容安全治理:审核与管理的艺术
  • 机器学习 第6章 支持向量机
  • 时间复杂度分析经典问题——最大子序列和
  • 《Java编程思想》读书笔记-对象导论
  • 07.Android之多媒体问题
  • CSS实用技巧干货
  • in typeof instanceof ===这些运算符有什么作用
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JavaScript 基础知识 - 入门篇(一)
  • JS字符串转数字方法总结
  • LeetCode算法系列_0891_子序列宽度之和
  • Linux中的硬链接与软链接
  • Node 版本管理
  • Python学习之路13-记分
  • TCP拥塞控制
  • 多线程 start 和 run 方法到底有什么区别?
  • 给自己的博客网站加上酷炫的初音未来音乐游戏?
  • -- 数据结构 顺序表 --Java
  • 算法-插入排序
  • 项目管理碎碎念系列之一:干系人管理
  • hi-nginx-1.3.4编译安装
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #ubuntu# #git# repository git config --global --add safe.directory
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (1)常见O(n^2)排序算法解析
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (二)Eureka服务搭建,服务注册,服务发现
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (正则)提取页面里的img标签
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)fock函数详解
  • (转)详解PHP处理密码的几种方式
  • .htaccess配置重写url引擎
  • .NET Core 中的路径问题
  • .NET 使用配置文件
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET中winform传递参数至Url并获得返回值或文件
  • :O)修改linux硬件时间