了解那些“奇葩”SQL写法,快速写出高效率SQL(4)

简介: 了解那些“奇葩”SQL写法,快速写出高效率SQL

对比一下执行计划

mapjoin生效执行计划:

image.png

image.png

mapjoin未生效执行计划:

image.png

image.png

MapJoin简单说就是在Map阶段将小表读入内存,顺序扫描大表完成Join。

对比两种执行计划,mapjoin生效之后,只有两个MAP任务,没有了JOIN任务,相当于省了一次JOIN。

mapjoin是否生效,可以看是HashJoin还是MergeJoin来判断。

总结

mapjoin开启之后,运行效率提高明显,但会因为写法、小表过大不生效,要从执行计划中去判断并做参数调整保障mapjoin生效。

小表大小调整参数:set odps.sql.mapjoin.memory.max=2048(单位M)


distmapjoin:加强版mapjoin

场景介绍

对于大小表join的场景,小表经常会超出mapjoin的最大内存,那么mapjoin就不会生效了。ODPS提供了将中型表放入内存的方案,即distmapjoin,用法和mapjoin相似,即在select语句中使用Hint提示/*+distmapjoin((shard_count=,replica_count=))*/才会执行distmapjoin。shard_count(分片数,默认[200M,500M])和replica_count(副本数,默认1)共同决定任务运行的并发度,即并发度=shard_count * replica_count。

写法&执行计划探查

常规写法:

SELECT
    base.*
    ,cst_info.*
FROM    @base base
LEFT JOIN @cst_info cst_info
ON (base.cst_id = cst_info.cst_id
    AND base.origin_inst_code = cst_info.inst_id)
;

优化写法:

SELECT  /*+distmapjoin(cst_info(shard_count=20))*/
    base.*
    ,cst_info.*
FROM    @base base
LEFT JOIN @cst_info cst_info
ON (base.cst_id = cst_info.cst_id
    AND base.origin_inst_code = cst_info.inst_id)
;

对比执行计划

常规写法:

image.png

image.png

优化写法:

image.png

image.png

对比两种执行计划和mapjoin执行计划可以发现,优化写法都省去了JOIN任务,这个在很大程度上加快了运行速度和降低资源消耗,distmapjoin写法比mapjoin写法多了一个REDUCE任务,即对小表的分片。

distmapjoin是否生效,可以看是DistributedMapJoin1还是MergeJoin来判断。

总结

同mapjoin总结


where限制条件写在外层会很慢吗?

场景介绍

日常开发中,大家都习惯性将过滤条件紧跟在读表之后,这样可以减少数据量以减少任务运行时间。

写法&执行计划探查

过滤条件在读表之后的规范写法和多表join之后再过滤的非规范写法。

-- 规范写法
SELECT
        base.*
        ,fee_year_rate.*
FROM (
    SELECT  *
    FROM    @base
    where terms = '12'
)base
INNER JOIN @fee_year_rate fee_year_rate
ON (base.terms = fee_year_rate.terms)
;
-- 非规范写法
SELECT
        base.*
        ,fee_year_rate.*
FROM @base base
INNER JOIN @fee_year_rate fee_year_rate
ON (base.terms = fee_year_rate.terms)
WHERE   base.terms = '12'
;

印象中,规范写法的运行效率肯定会高一些,看一下执行计划会发现两种写法的执行计划是一样的,都在join之前做了过滤

image.png

总结

ODPS对谓词前置做了很好的优化,但是日常开发也尽量将过滤条件跟在读表之后,这样更加规范,代码也会具有更好的可读性。


总结

做好SQL开发、优化,得先学会阅读执行计划,多动手尝试可以快速帮助你掌握该技能。

(本篇讲到的执行计划,随着ODPS的优化,会发生改变)

目录
相关文章
|
6天前
|
SQL 分布式计算 运维
了解那些“奇葩”SQL写法,快速写出高效率SQL
本文主要讲解常见的SQL开发场景、‘奇葩’SQL写法并深入执行计划,带你了解如何快速写出高效率SQL。
|
6月前
|
SQL 分布式计算 运维
了解那些“奇葩”SQL写法,快速写出高效率SQL(3)
了解那些“奇葩”SQL写法,快速写出高效率SQL
55 0
了解那些“奇葩”SQL写法,快速写出高效率SQL(3)
|
6月前
|
SQL 分布式计算 MaxCompute
了解那些“奇葩”SQL写法,快速写出高效率SQL(2)
了解那些“奇葩”SQL写法,快速写出高效率SQL
33 0
了解那些“奇葩”SQL写法,快速写出高效率SQL(2)
|
6月前
|
SQL 分布式计算 MaxCompute
了解那些“奇葩”SQL写法,快速写出高效率SQL(1)
了解那些“奇葩”SQL写法,快速写出高效率SQL
53 0
了解那些“奇葩”SQL写法,快速写出高效率SQL(1)
|
4天前
|
SQL API 流计算
实时计算 Flink版产品使用合集之在Mac M1下的Docker环境中开启SQL Server代理的操作步骤是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
19 1
|
3天前
|
SQL 数据处理 API
实时计算 Flink版产品使用合集之遇到SQL Server锁表问题如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
10 0
|
4天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之当 SQL Server 源数据库中的数据更新后,CDC 吐出的操作(op)是怎样的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
15 0
|
6天前
|
SQL XML Linux
SQL Server的版本
【5月更文挑战第14天】SQL Server的版本
21 3
|
6天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
16 2