8.3. 注意事项
8.3.1. SQL优化原则
优先使用 lsql 的索引进行过滤,统计,分组,排序,能 lsql 来实现的尽量 lsql 实现;
一定要写 LIMIT,返回的数据条数越少越好.( LIMIT 9999 是个性能分界线);
尽量尽早地过滤数据,减少每个阶段的数据量;
减少不必要的列的返回;
能并行执行的,就不要单点执行,如数据倾斜的场景;
如果查询返回的列数很多,请选用行存;
尽量减少扫描的分区数;
能尽早过滤的进行尽早过滤;
避免数据倾斜;
8.3.2. 常见数据倾斜产生的原因
ORDER BY ,不写LIMIT,这样只会有一个REDUCE产生,单点瓶颈;
JOIN的KEY里面含有NULL值或者大量的重复值导致的笛卡尔积;
ROW NUMBER的PARTION KEY分组不均衡;
对SUM.COUNT来说,不存在数据倾斜问题。但对COUNT(DISTINCT ),效率较低,数据量一多,准出问题;
GROUP BY+自定义UDAF;
8.3.3. 优先使用lsql的过滤策略
lsql层的作用是直接对接索引的,可以极大的提升数据检索以及统计的效率,功能简单,支持的函数并不多,目前函数仅仅内置COUNT、AVG、MAX、MIN、SUM四个聚合函数。
8.3.4. 同时使用lsql与HIVE的特性
当用户需要同时用到HIVE的一些函数和写法,并且又想充分利用lsql的索引特性时,可以使用子查询的方式,例
如:
SELECT * FROM ( --lsql 的查询 SELECT * FROM QUICKSTART WHERE partition='3000W' LIMIT 100 ) T --HIVE 的 BETWEEN AND WHERE T.AGE BETWEEN 20 AND 40;
当需要进行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;
需要多表关联查询时:
需要多表关联查询时使用 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. 特殊注意事项
行存不能用与统计分析(包括order by);
group by语句select中必须带有统计函数;
order by语句必须加limit限制且字段需在select后面做展示。