8.3. 注意事项

8.3.1. SQL优化原则

  1. 优先使用 lsql 的索引进行过滤,统计,分组,排序,能 lsql 来实现的尽量 lsql 实现;

  2. 一定要写 LIMIT,返回的数据条数越少越好.( LIMIT 9999 是个性能分界线);

  3. 尽量尽早地过滤数据,减少每个阶段的数据量;

  4. 减少不必要的列的返回;

  5. 能并行执行的,就不要单点执行,如数据倾斜的场景;

  6. 如果查询返回的列数很多,请选用行存;

  7. 尽量减少扫描的分区数;

  8. 能尽早过滤的进行尽早过滤;

  9. 避免数据倾斜;

8.3.2. 常见数据倾斜产生的原因

  1. ORDER BY ,不写LIMIT,这样只会有一个REDUCE产生,单点瓶颈;

  2. JOIN的KEY里面含有NULL值或者大量的重复值导致的笛卡尔积;

  3. ROW NUMBER的PARTION KEY分组不均衡;

  4. 对SUM.COUNT来说,不存在数据倾斜问题。但对COUNT(DISTINCT ),效率较低,数据量一多,准出问题;

  5. GROUP BY+自定义UDAF;

8.3.3. 优先使用lsql的过滤策略

​ lsql层的作用是直接对接索引的,可以极大的提升数据检索以及统计的效率,功能简单,支持的函数并不多,目前函数仅仅内置COUNT、AVG、MAX、MIN、SUM四个聚合函数。

8.3.4. 同时使用lsql与HIVE的特性

  1. 当用户需要同时用到HIVE的一些函数和写法,并且又想充分利用lsql的索引特性时,可以使用子查询的方式,例

    如:

    SELECT * FROM ( 
    --lsql 的查询 
    SELECT * FROM QUICKSTART WHERE partition='3000W' LIMIT 100 
    ) T 
    --HIVE 的 BETWEEN AND 
    WHERE T.AGE BETWEEN 20 AND 40;
    
  2. 当需要进行NOT IN ,IN子查询时:

    HIVE只支持FROM的子查询当需要使用IN的时候可以使用JOIN代替

    IN : 
    SELECT ID FROM A LEFT OUTER JOIN B ON A.ID=B.ID WHERE B.ID IS NOT NULL; 
    NOT IN :
    SELECT ID FROM A LEFT OUTER JOIN B ON A.ID=B.ID WHERE B.ID IS NULL;
    
  3. 需要多表关联查询时:

    需要多表关联查询时使用 WITH AS 的形式

    WITH B AS ( 
    SELECT C.ID FROM C 
    ) 
    SELECT A.ID FROM A LEFT JOIN B ON A.ID = B.ID WHERE B.ID IS NOT NULL;
    

8.3.5. 特殊注意事项

  1. 行存不能用与统计分析(包括order by);

  2. group by语句select中必须带有统计函数;

  3. order by语句必须加limit限制且字段需在select后面做展示。

Copyright © lucene.xin 2020 all right reserved修改时间: 2021-07-02 11:42:23

results matching ""

    No results matching ""