—- SQL优化——
数据倾斜优化
    1.join操作导致的数据倾斜
  1)原因
  2)优化方法
      I.由于表B是个小表并且没有超过512 MB
      II.将倾斜的Key用单独的逻辑来处理
 
    2.group by 倾斜
  1)原因
  2)优化方法
      set odps.sql.groupby.skewindata=true
 
    3.错误使用动态分区造成的数据倾斜
  1)原因
  2)优化方法
      不建议使用动态分区,在partition后参数添加静态分区
 
窗口函数优化
    1.原因:通常每个窗口函数会形成一个Reduce作业,如果窗口函数较多,会消耗过多的资源
    2.满足条件:
  1.窗口函数在OVER关键字后面要完全相同,要有相同的分组和排序条件。
  2.多个窗口函数在同一层SQL中执行
子查询优化
    1.问题
  使用where 后 in语句,导致子查询返回数据量超过1000,出现:records returned from subquery exceeded limit of 1000
 
    2.使用join语句
 
 
Join语句优化
    where子句优化:
  1.主表的分区限制条件可以写在WHERE子句中(最好先用子查询过滤)。
  2.主表的WHERE子句建议写在SQL语句最后。
  3.从表分区限制条件不要写在WHERE子句中,建议写在ON条件或者子查询中。
 
 
—- Join长尾优化—-
MAP JOIN方案
    1.原理
    2.使用MAPJOIN限制条件
  i.MAP JOIN使用时,JOIN中的从表比较小才可用
  ii.MAP JOIN使用时,对小表的大小有限制,默认小表读入内存后的大小不能超过512 MB
      set odps.sql.mapjoin.memory.max=2048
    3.使用方法
  在SQL语句中SELECT后加上 / mapjoin(b) /即可,其中b代表小表
 
 
JOIN因为空值导致长尾
    1.原因:因为空值是无法关联上的,只是分发到了一处
    2.解决方案:
  可以将空值处理成随机值,随机值既不会影响关联也能避免聚集。
 
 
JOIN因为热点值导致长尾
    1.原因:因为热点值导致长尾,并且JOIN的输入比较大无法用MAP JOIN
    2.解决方案:
  i.取出热点Key:将PV大于50000的商品ID取出到临时表。
  ii.取出非热点数据
  iii.取出热点数据
  iiii.将步骤2和步骤3的数据通过union all得到完整的数据
 
通过设置odps.sql.skewjoin参数解决长尾问题
    场景:
  1.如果倾斜的值发生变化需要修改代码重新执行命令,且变化无法提前预知
  2.如果倾斜值较多也不方便在参数中设置,需要根据实际情况选择拆分代码或者参数设置
 
    操作步骤:
  1.开启功能
      set odps.sql.skewjoin=true
  2.设置倾斜的Key及对应的值
      set odps.sql.skewinfo=skewed_src:(skewed_key) [(“skewed_value”)]
   
