四川福彩快乐12app下载-四川快乐12app官网(彩世界)
做最好的网站
来自 四川福彩快乐12app下载 2019-11-07 22:09 的文章
当前位置: 四川福彩快乐12app下载 > 四川福彩快乐12app下载 > 正文

SQL优化器执行过程之逻辑算子

Join:连接,如select * from table1 table2 where table1.name=table2.name便是把多个表做Join。连接条件是最轻巧易行的等值连接,当然还可能有别的大家掌握的inner join,left join,right join等等

Optimizer模块

Optimizer是catalyst的核心,分为RBO和CBO两种。
RBO的优化战略正是对语法树实行一遍遍历,情势相称能够满意特定法则的节点,再拓展对应的等价转变,将在生龙活虎棵树等价地转换为另后生可畏棵树。SQL中卓绝的广阔优化法规有,

  • 谓词下推(predicate pushdown卡塔尔
  • 常量累计(constant folding卡塔尔
  • 列值裁剪(column pruning卡塔尔
  • Limits合并(combine limits)

图片 1

由下往上走,从join后再filter优化为filter再join

图片 2

从`100 80`优化为`180`,防止每一条record都急需进行叁遍`100 80`的操作

图片 3

剪裁不需求的字段,极其是嵌套里面包车型客车不要求字段。如只需people.age,没有需求people.address,那么能够将address字段抛弃

//@see http://blog.csdn.net/oopsoom/article/details/38121259
//org.apache.spark.sql.catalyst.optimizer.Optimizer.scala
  def batches: Seq[Batch] = {
    // Technically some of the rules in Finish Analysis are not optimizer rules and belong more
    // in the analyzer, because they are needed for correctness (e.g. ComputeCurrentTime).
    // However, because we also use the analyzer to canonicalized queries (for view definition),
    // we do not eliminate subqueries or compute current time in the analyzer.
    Batch("Finish Analysis", Once,
      EliminateSubqueryAliases,
      ReplaceExpressions,
      ComputeCurrentTime,
      GetCurrentDatabase(sessionCatalog),
      RewriteDistinctAggregates) ::
    //////////////////////////////////////////////////////////////////////////////////////////
    // Optimizer rules start here
    //////////////////////////////////////////////////////////////////////////////////////////
    // - Do the first call of CombineUnions before starting the major Optimizer rules,
    //   since it can reduce the number of iteration and the other rules could add/move
    //   extra operators between two adjacent Union operators.
    // - Call CombineUnions again in Batch("Operator Optimizations"),
    //   since the other rules might make two separate Unions operators adjacent.
    Batch("Union", Once,
      CombineUnions) ::
    Batch("Subquery", Once,
      OptimizeSubqueries) ::
    Batch("Replace Operators", fixedPoint,
      ReplaceIntersectWithSemiJoin,
      ReplaceExceptWithAntiJoin,
      ReplaceDistinctWithAggregate) ::
    Batch("Aggregate", fixedPoint,
      RemoveLiteralFromGroupExpressions,
      RemoveRepetitionFromGroupExpressions) ::
    Batch("Operator Optimizations", fixedPoint,
      // Operator push down
      PushProjectionThroughUnion,
      ReorderJoin,
      EliminateOuterJoin,
      PushPredicateThroughJoin, //谓词下推之一
      PushDownPredicate, //谓词下推之一
      LimitPushDown,
      ColumnPruning, //列值剪裁,常用于聚合操作,join左右孩子操作,合并相邻project列
      InferFiltersFromConstraints,
      // Operator combine
      CollapseRepartition,
      CollapseProject,
      CollapseWindow,
      CombineFilters, //谓词下推之一,合并两个相邻的Filter。合并2个节点,就可以减少树的深度从而减少重复执行过滤的代价
      CombineLimits, //合并Limits
      CombineUnions,
      // Constant folding and strength reduction
      NullPropagation,
      FoldablePropagation,
      OptimizeIn(conf),
      ConstantFolding, //常量累加之一
      ReorderAssociativeOperator,
      LikeSimplification,
      BooleanSimplification, //常量累加之一,布尔表达式的提前短路
      SimplifyConditionals,
      RemoveDispensableExpressions,
      SimplifyBinaryComparison,
      PruneFilters,
      EliminateSorts,
      SimplifyCasts,
      SimplifyCaseConversionExpressions,
      RewriteCorrelatedScalarSubquery,
      EliminateSerialization,
      RemoveRedundantAliases,
      RemoveRedundantProject) ::
    Batch("Check Cartesian Products", Once,
      CheckCartesianProducts(conf)) ::
    Batch("Decimal Optimizations", fixedPoint,
      DecimalAggregates) ::
    Batch("Typed Filter Optimization", fixedPoint,
      CombineTypedFilters) ::
    Batch("LocalRelation", fixedPoint,
      ConvertToLocalRelation,
      PropagateEmptyRelation) ::
    Batch("OptimizeCodegen", Once,
      OptimizeCodegen(conf)) ::
    Batch("RewriteSubquery", Once,
      RewritePredicateSubquery,
      CollapseProject) :: Nil
  }

CBO功底概念

CBO:评估 I/O,CPU,互连网(DBLINK卡塔 尔(阿拉伯语:قطر‎等消耗的能源资金财产得出

其他

Job UI

图片 4

sp.prepare.PrepareController

  • WholeStageCodegen,将四个operators合併成二个java函数,进而巩固执行进程
  • Project,投影/只取所需列
  • Exchange,stage间隔,产生了shuffle

三、transitivity(可传递性卡塔 尔(阿拉伯语:قطر‎

CBO会对现成的sql语句做等价调换,谓词条件、字段连接


优化器底工概念

举例说大家由那样一条SQL:select user.name from user,score where user.id = score.id and score.num 60

Overview

斯ParkerSQL的为主是Catalyst优化器,是以少年老成种流行性的办法接收Scala的的格局相称和quasiquotes编写制定来塑造的可增加查询优化器。

图片 5

sparkSql pipeline

sparkSql的catalyst优化器是大器晚成体sparkSql pipeline的中间焦点部分,其施行战略首要双方向,

  1. 基于法则优化/Rule Based Optimizer/RBO
    • 后生可畏种经验式、启发式优化思路
    • 对于着力优化算子join有一点点不只怕,如两张表奉行join,到底使用broadcaseHashJoin依然sortMergeJoin,前段时间sparkSql是透过手工业设定参数来明确的,纵然三个表的数据量小于某些阈值(私下认可10M?卡塔 尔(阿拉伯语:قطر‎就使用broadcastHashJoin
      • nestedLoopsJoin,P,Q双表多个循环, O(M*N)
      • sortMergeJoin是P,Q双表排序后相互影响游标
      • broadcastHashJoin,PQ双表中型Mini表放入内部存款和储蓄器hash表,大表遍历O(1)格局取小表内容
  2. 依据代价优化/Cost Based Optimizer/CBO
    • 针对各样join评估当前两张表使用每个join战术的代价,依据代价估摸显著后生可畏种代价最小的方案
    • 不同physical plans输入到代价模型(近来是总括卡塔尔,调治join顺序,减弱中间shuffle数据集大小,到达最优输出

风流浪漫、优化品种:RBO和CBO

(一)、RBO

RBO基于法则的优化器access paths优先级:

  • RBO Path 1: Single Row by Rowid
  • RBO Path 2: Single Row by Cluster Join
  • RBO Path 3: Single Row by Hash Cluster Key with Unique or Primary Key
  • RBO Path 4: Single Row by Unique or Primary Key
  • RBO Path 5: Clustered Join
  • RBO Path 6: Hash Cluster Key
  • RBO Path 7: Indexed Cluster Key
  • RBO Path 8: Composite Index
  • RBO Path 9: Single-Column Indexes
  • RBO Path 10: Bounded Range Search on Indexed Columns
  • RBO Path 11: Unbounded Range Search on Indexed Columns
  • RBO Path 12: Sort Merge Join
  • RBO Path 13: MAX or MIN of Indexed Column
  • RBO Path 14: ORDER BY on Indexed Column
  • RBO Path 15: Full Table Scan

潜心在不背弃如上事先级的前提下,若有2个优化级相近的目录可用,则RBO会选用晚建的特别索引, 消除办法是重新建构你想要让RBO使用的拾分索引,只怕利用CBO……..

(二)、optimizer_mode :优化器的格局

1、RULE:使用rbo的规则

2、CHOOSE:9i中默许值,SQL语句全体的靶子中无总计音讯,使用RBO,其余应用CBO

3、FIRST_ROWS_n(n=1,10,100,1000卡塔 尔(阿拉伯语:قطر‎:CBO会把怎么着能够最快响应速度再次回到的血本设置为非常小的值

4、ALL_ROWS:oracle10g 今后的暗中认可值,会动用CBO来解析SQL,总结各种推行路线中的开销值最棒的吞吐量(最小的I/O和CPU能源卡塔尔国


二、结果集

进行陈设中row,CBO评估的cardinality


三、访谈数据的措施

(生龙活虎卡塔 尔(阿拉伯语:قطر‎、访问表的情势:全表扫描和rowid访谈

全表扫描:从高水位线下全体数目块读取,DELETE不会下跌高水位线

ROWID访谈:通过物理存款和储蓄地点直接待上访问,rowid是个伪列,可是他能便捷的定点的数据文件、块、行

scott@GULL> select empno,rowid ,dbms_rowid.rowid_relative_fno(rowid)||'_'||dbms_rowid.rowid_block_number(rowid)||'_'||dbms_rowid.rowid_row_number(rowid) location_row from emp;

     EMPNO ROWID              LOCATION_ROW
---------- ------------------ ------------------------------
      7369 AAASZHAAEAAAACXAAA 4_151_0
      7499 AAASZHAAEAAAACXAAB 4_151_1
      7521 AAASZHAAEAAAACXAAC 4_151_2
      7566 AAASZHAAEAAAACXAAD 4_151_3
      7654 AAASZHAAEAAAACXAAE 4_151_4
      7698 AAASZHAAEAAAACXAAF 4_151_5
      7782 AAASZHAAEAAAACXAAG 4_151_6
      7788 AAASZHAAEAAAACXAAH 4_151_7
      7839 AAASZHAAEAAAACXAAI 4_151_8
      7844 AAASZHAAEAAAACXAAJ 4_151_9
      7876 AAASZHAAEAAAACXAAK 4_151_10
      7900 AAASZHAAEAAAACXAAL 4_151_11
      7902 AAASZHAAEAAAACXAAM 4_151_12
      7934 AAASZHAAEAAAACXAAN 4_151_13

(二卡塔尔、索引访谈

目录访谈的本金:后生可畏部分时访问相关的B树索引的基金,另叁个资金是回表的本钱(依照目录中的rowid卡塔尔

1、索引唯豆蔻年华性扫描(index unique scan卡塔尔:创立是独一索引,能树立独一索引的断定要创造独一索引

2、索引范围扫描(index range scan卡塔 尔(阿拉伯语:قطر‎:谓词条件中>、<等

3、索引全扫描(index full scan卡塔尔:扫描目的索引中具有的块的全部索引行。从最左的叶子节点读到底,因为叶子是五个双向链表

  • 索引全扫描的奉行结果是有静止的,並且是遵照该索引的索引键值列来排序,那也代表走索引全扫描能够既达到排序的效率,又同一时候防止了对该索引的索引键值列的真正的排序操作。
  • 索引全扫描时有序的就决定了无法并行施行,索引全扫描时单块读
  • oracle中能做索引全扫描的前提条件是目的索引至少有多少个索引键值列的质量是NOT NULL

4、索引飞速全扫描(INDEX FAST FULL SCAN卡塔 尔(英语:State of Qatar)

索引全扫描相似,读取全数叶子块的索引行

与全索引围观不一样点

  • 目录飞速全扫描只适用于CBO
  • 目录火速全扫描能够行使多块读,也能够并行推行
  • 目录火速全扫描的进行结果不必然是依样葫芦的

5、索引跳跃式扫描(INDEX SKIP SCAN卡塔 尔(阿拉伯语:قطر‎

适用复合B数索引,谓词中的过滤条件不是以索引前导列。

只是对前导列做distinct:如create index ind_1 ON emp(job,empno)

Select * from emp where empno=7499

如果job有两个CLERK,SALESMAN

同样的话语

Select * from emp where job='CLERK' AND empno=7499
UNION ALL
Select * from emp where job='SALESMAN' AND empno=7499

oracle中的索引跳跃式扫描仅仅适用那些目标索引前导列的distinct值数量较少、后续非前导列的可选择性又非常好的情形,因为索引跳跃式扫描的执行效率一定会随着目标索引前导列的distinct值数量的递增而递减

四、表连接

(意气风发卡塔尔国、表连接顺序

不论是指标SQL中有微微个表做表连接,ORACLE在其实施行都是先做两两做表连接,在各种实施那样的两两表连接进度,直到指标SQL中具备表都已一连完毕。

表连接很要紧的是驱动表(outer table卡塔尔国和被驱动表(inner table卡塔 尔(英语:State of Qatar)。

(二卡塔尔、表连接方法

  • 嵌套循环连接(nested loop卡塔 尔(英语:State of Qatar)

     1、就算驱动表所对应的驱动结果集的记录数超少,同一时候在被驱动表的接连列上又存在唯后生可畏性索引(或然在被驱动表的连接列上存在选择性很好的非唯豆蔻梢头性索引卡塔 尔(阿拉伯语:قطر‎,那么那时采用嵌套循环连接的试行功效超高。

     2、大表也得以看成驱动表,关键看大表的谓词条件是还是不是能够把驱动表的结果集的数据量下落下来

  • 哈希连接(hash join卡塔尔

     1、哈希连接不肯定会排序,或然说大多数动静下都没有需求排序

     2、哈希连接的驱动表所对应的连年列的可选拔性应竭尽好,因为那一个可选取性会影响对应hash bucket中的记录数,而hash bucket中的记录数又会一向影响从该hash bucket中询问相称记录的笔录。如若二个hash bucket里所含有的记录数过多,则大概或严重下滑所对应哈希连接的实行作用,那时候特出的表现就是该哈希连接施行了成都百货上千光阴都并未停止,数据库所在数据库服务器上的CPU占用率相当的高,但指标SQL所消耗的逻辑读却十分低,因为这个时候非常多岁月都花销在了遍历上述Hash Bucket里的兼具记录上,而遍历Hash Bucket里的记录那一个动作发生在PGA的工作区里,所以不花费逻辑读。

     3、哈希连接只适用于CBO,它也只能用来等值连接条件(固然是哈希反连接,Oracle实际上也是讲其转变到了等价的等值连接卡塔尔。

     4、哈希连接很相符小表和大表之间做连接且接二连三结果集的记录数超多的景况,特别是在小表的总是列的可选拔性相当好的状态下,当时哈希连接的进行时间就足以临近看作和全表扫描那八个大表所开支的时光非常。

     5、当多个表做哈希连接时,如果在施加指标SQL中内定的谓词条件(若是有个别话卡塔尔后拿走的数据量相当小的十一分结果集所对应的hash table、 能够完全容纳在内部存款和储蓄器中(PGA的专业区卡塔尔,则那时的哈希连接的施行作用会超高

  • 排序归总连接(merge jion卡塔尔国

    1、平时情状下,排序归并连接的实施效能会远不及哈希连接,但后面一个的利用限定更广,因为哈希连接平常只可以用来等值连接条件,而排序合併连接还能用于其余总是条件(<,<=,>,>=卡塔尔

    2、经常状态下,排序归拢连接并不相符OLTP类型的系统,器本质原因是因为对于OLTP类型的系列来说,排序异常高昂的操作,当然,借使能幸免排序操作,那么固然是OLTP类型的连串,也依然得以选择排序合併连接的。

    3、排序合併连接并不设有驱动表的定义

  • 笛卡尔积连接(Cartesian join卡塔 尔(阿拉伯语:قطر‎

     1、无任何连接条件,在进行安顿中有cartesian,平日来讲,有笛Carl积,sql语句是至极的

(三卡塔尔、表连接的花色

1、内连接(Inner JOIN)

 

--使用=
select * from emp a , dept b  where a.deptno=b.deptno
--join
select * from emp a join dept b on a.deptno=b.deptno

2、外连接(outer join)

左连接--使用( )
select * from emp a,dept b where a.deptno=b.deptno( )
--使用left join
select * from emp a left outer join dept b on a.deptno=b.deptno

右连接
--使用( )
select * from emp a,dept b where a.deptno( )=b.deptno
--使用left join
select * from emp a right outer join dept b on a.deptno=b.deptno

外接连的驱动表以( 卡塔尔对面包车型地铁表,如以上左连接,驱动表为a,右连接的驱动表为b

3、反连接(anti join)

连接中not in、not exists 、<>

sql A:select * from emp a WHERE A.DEPTNO NOT  IN (SELECT DEPTNO FROM dept b where a.deptno=b.deptno)

sql B:select * from emp a WHERE NOT EXISTS (SELECT 1 FROM dept b where a.deptno=b.deptno)

sql C:select * from emp a WHERE A.DEPTNO <> all (SELECT DEPTNO FROM dept b where a.deptno=b.deptno)

 

4、半连接(semi join)

接连几天中用in,exists,any

select * from emp a WHERE A.DEPTNO   IN (SELECT DEPTNO FROM dept b where a.deptno=b.deptno)

select * from emp a WHERE  EXISTS (SELECT 1 FROM dept b where a.deptno=b.deptno)

select * from emp a WHERE A.DEPTNO =any(SELECT DEPTNO FROM dept b where a.deptno=b.deptno)

 

5、星形连接

在OLTP基本不会用到,在OLAP中用到

参考:崔华《基于ORACLE的SQL优化》

user,score对应最下边的DataSource,担当读取数据。

Catalyst职业流程

  • Parser,利用ANTLR将sparkSql字符串深入深入分析为架空语法树AST,称为unresolved logical plan/ULP
  • Analyzer,依据于数据元数据catalog将ULP拆解解析为logical plan/LP
  • Optimizer,根据种种RBO,CBO优化计策得到optimized logical plan/OLP,首就算对Logical Plan举行剪枝,合併等操作,从而删除掉大器晚成都部队分不行总结,或对有的计量的多少个步骤举行合并

二、Selectivity

Selectivity :谓词的过滤条件再次回到的结果的行数占未加谓词过滤条件的行数

公式:=图片 6

限定0-1,值越小,表达 选取性越好 重回的cardinality 越小;值越大,采取性越差,重临的cardinality 越大。

未加任何谓词条件结果集: original cardinality,扩充谓词条件为:computed cardinality。

computed cardinality=original cardinality*selectivity

在列上未有NULL或许直方图的景况下,selectivity取值

SELECTIVITY=图片 7

NUM_DISTINCT :表示为列中差异值的个数

Apply:子查询,如select * from (select id,name from table1) as t中的(select id,name from table1) as t。可以拓宽嵌套查询。


一、cardinality

cardinality:群集中包涵的记录数。实际CBO评估对象SQL试行具体步骤的记录数,cardinality和资本是连锁的,cardinality越大,实施步骤中的花费就越大

挑选、投影、连接就是最大旨的算子

Analyzer模块

经过深入解析后ULP有了着力骨架,可是系统对表的字段新闻是不知晓的。如sum,select,join,where还应该有score,people都意味着什么意思,那个时候亟待着力的元数据信息schema catalog来抒发这几个token。最珍视的元数据音信正是,

  • 表的schema音信,重要包罗表的中坚概念(表名、列名、数据类型卡塔 尔(英语:State of Qatar)、表的数额格式(json、text、parquet、压缩格式等卡塔 尔(英语:State of Qatar)、表的概略地方
  • 基本函数新闻,首假设指类音讯

Analyzer会再次遍历整个AST,对树上的每一个节点开展数据类型绑定以及函数绑定,比方people词素会根据元数据表新闻深入分析为带有age、id以致name三列的表,people.age会被剖析为数据类型为int的变量,sum会被深入分析为特定的聚合函数,

图片 8

词义注入

//org.apache.spark.sql.catalyst.analysis.Analyzer.scala
  lazy val batches: Seq[Batch] = Seq( //不同Batch代表不同的解析策略
    Batch("Substitution", fixedPoint,
      CTESubstitution,
      WindowsSubstitution,
      EliminateUnions,
      new SubstituteUnresolvedOrdinals(conf)),
    Batch("Resolution", fixedPoint,
      ResolveTableValuedFunctions ::
      ResolveRelations ::  //通过catalog解析表或列基本数据类型,命名等信息
      ResolveReferences :: //解析从子节点的操作生成的属性,一般是别名引起的,比如people.age
      ResolveCreateNamedStruct ::
      ResolveDeserializer ::
      ResolveNewInstance ::
      ResolveUpCast ::
      ResolveGroupingAnalytics ::
      ResolvePivot ::
      ResolveOrdinalInOrderByAndGroupBy ::
      ResolveMissingReferences ::
      ExtractGenerator ::
      ResolveGenerate ::
      ResolveFunctions :: //解析基本函数,如max,min,agg
      ResolveAliases ::
      ResolveSubquery :: //解析AST中的字查询信息
      ResolveWindowOrder ::
      ResolveWindowFrame ::
      ResolveNaturalAndUsingJoin ::
      ExtractWindowExpressions ::
      GlobalAggregates :: //解析全局的聚合函数,比如select sum(score) from table
      ResolveAggregateFunctions ::
      TimeWindowing ::
      ResolveInlineTables ::
      TypeCoercion.typeCoercionRules   
      extendedResolutionRules : _*),
    Batch("Nondeterministic", Once,
      PullOutNondeterministic),
    Batch("UDF", Once,
      HandleNullInputsForUDF),
    Batch("FixNullability", Once,
      FixNullability),
    Batch("Cleanup", fixedPoint,
      CleanupAliases)
  )

常量传播

Parser模块

将sparkSql字符串切分成叁个三个token,再依照早晚语义法规拆解剖判为二个空洞语法树/AST。Parser模块方今主导都使用第三方类库ANTL讴歌RDX来贯彻,比方Hive,presto,sparkSql等。

图片 9

parser切词

斯Parker 1.x版本接收的是Scala原生的Parser Combinator塑造词法和语法剖析器,而Spark2.x本子接受的是第三方语法拆解深入分析器工具ANTLPAJERO4。

斯Parker2.x SQL语句的剖释选取的是ANTL君越4,ANTL陆风X84依据语菲律宾语件SqlBase.g4电动深入分析生成三个Java类:词法解析器SqlBaseLexer和语法解析器SqlBaseParser。

SqlBaseLexer和SqlBaseParser都以行使ANTL巴博斯 CL级4自动生成的Java类。使用那八个拆解解析器将SQL字符串语句深入分析成了ANTL昂Cora4的ParseTree语法树结构。然后在parsePlan进程中,使用AstBuilder.scala将ParseTree转变到catalyst表明式逻辑陈设LogicalPlan。


就此大家常说的:“查询慢,加个索引啊”,要承保逻辑查询布署对应的轮廓安排走索引查询才行。

Reference

  • Deep Dive Into Catalyst: Apache Spark’s Optimizer
  • Spark SQL Optimization – Understanding the Catalyst Optimizer
  • Catalyst——SparkSQL中的函数式关系查询优化框架
  • SparkSQL – 从0到1认识Catalyst
  • Spark-Catalyst Optimizer
  • sparksql推行流程剖析
  • SparkSQL优化器Catalyst
  • spark catalyst source code
  • Cost-Based Optimizer in Apache Spark 2.2

那正是说周边的优化法则就满含:

SparkPlanner模块

至今,OLP已经收获了相比较康健的优化,但是那时OLP依旧没办法真正施行,它们只是逻辑上有效性,实际上spark并不知道怎么着去实行那几个OLP。

  • 举个例子join只是三个抽象概念,代表四个表依据同样的id进行联合,不过具体怎么贯彻那些统生龙活虎,逻辑施行安插并未有证实

图片 10

optimized logical plan -> physical plan

这个时候就须要将左臂的OLP调换为physical plan物理推行安排,将逻辑上有效的执行陈设变为spark能够真正履行的布置。

  • 举例join算子,spark依据不一致情状为该算子制订了差异的算法计谋,有broadcastHashJoin、shuffleHashJoin以至sortMergeJoin,物理实行布署实际上便是在这里些现实落到实处中接收贰个耗费时间最小的算法实现,这么些历程涉及到cost model/CBO

图片 11

CBO off

图片 12

CBO on

CBO江西中国广播企业余大学的优化是join换位,以便尽量减弱中间shuffle数据集大小,达到最优输出。


大家提到了三种SQL优化器,分别是RBO和CBO。那么无论RBO,仍然CBO都包含了风华正茂类别优化准绳,这一个优化法规能够对涉嫌表明式举办等价转变,进而搜索最优的进行布置。

记录一下民用对sparkSql的catalyst这些函数式的可增添的询问优化器的领会,目录如下,

Sort:排序,如select * from table1 order by id里面包车型大巴order by。冬季的多寡经过这些算子管理后,输出有序的数据。

other

Optimizer是catalyst工作最终阶段了,前面生成physical plan以致实行,首即使由sparkSql来变成。

  • SparkPlanner
    • 优化后的逻辑实践布置OLP依然是逻辑的,并无法被spark系统驾驭,这时亟待将OLP转变来physical plan
    • 从逻辑安插/OLP生成叁个或多个大意施行计划,基于花销模型cost model从当中选用多少个
  • Code generation
    • 生成Java bytecode然后在每豆蔻梢头台机器上举办,产生奥迪Q5DD graph/DAG

逻辑算子

0. Overview
1. Catalyst工作流程
2. Parser模块
3. Analyzer模块
4. Optimizer模块
5. SparkPlanner模块
6. Job UI
7. Reference

而优化内需做的业务正是校订逻辑算子组成的逻辑查询安顿,使它试行时的代价尽量的小。当然优化准绳正是大家前边提到的这个了。

列裁剪

逻辑查询陈设

谓词下推

图片 13

在上述那个优化准则的底工上,就可以预知对涉及表达式做出相应的优良调换,进而生成执行安排。本篇作品先从优化准则的根基概念逻辑算子伊始讲起,后续会介绍种种优化准则。

最后将user.name做投影(Projection)

黑影消释

Projection:投影,指搜索的列,如select name from table1 where id = 第11中学的列name

Aggregation:分组,如select sum from table1 group by name中的group by。遵照有些列举办分组,分组后方可举办一些聚众操作,比方马克斯、Min、Sum、Count、Average等等

DataSource:数据源,也正是我们SQL语句中的表。select name from table第11中学的table1。

Selection:接收,如select name from table1 where id = 第11中学的where后的过滤条件。

在上头由四个Join,将七个表的结果按user.id=score.id连接

再按score.num 60 做一个Selection过滤

既是由逻辑算子那么就有大意算子,物清理计算子和逻辑算子的两样在于,二个逻辑算子可能对应各个的情清理计算子的实现。举例Join的物清理计算子完成能够用NestLoop Join、HashJoin、MergeSort Join等,Aggregation能够用Hash只怕排序后分组的差别做法,DataSource能够直接扫描全表也得以选取索引读取数据等等。

改为查询安插之后如图所示:

最大超小撤消

逻辑查询安排正是SQL语句通过SQL拆解解析之后由各类逻辑算子组成的树状结构。

本文由四川福彩快乐12app下载发布于四川福彩快乐12app下载,转载请注明出处:SQL优化器执行过程之逻辑算子

关键词: 逻辑 SPAR 算子 过程 spark