经验总结:SQL语句改写规则

    • 使用union all代替union

      union在合并两个集合时会执行去重操作,而union all则直接将两个结果集合并、不执行去重。执行去重会消耗大量的时间,因此,在一些实际应用场景中,如果通过业务逻辑已确认两个集合不存在重叠,可用union all替代union以便提升性能。

    • join列增加非空过滤条件

      若join列上的NULL值较多,则可以加上is not null过滤条件,以实现数据的提前过滤,提高join效率。

    • not in转not exists

      如下所示,如果t2.d2字段中没有null值(t2.d2字段在表定义中not null)查询可以修改为

      产生的计划如下:

      1. ------------------------------
      2. Hash Cond: (t1.c1 = t2.d2)
      3. -> Hash
      4. (5 rows)
    • 尝试将函数替换为case语句。

    • 避免对索引使用函数或表达式运算。

      对索引使用函数或表达式运算会停止使用索引转而执行全表扫描。

    • 尽量避免在where子句中使用!=或<>操作符、null值判断、or连接、参数隐式转换。

    • 对复杂SQL语句进行拆分。

      对于过于复杂并且不易通过以上方法调整性能的SQL可以考虑拆分的方法,把SQL中某一部分拆分成独立的SQL并把执行结果存入临时表,拆分常见的场景包括但不限于:

      • 作业中多个SQL有同样的子查询,并且子查询数据量较大。
      • 函数(如substr,to_number)导致大数据量子查询选择度计算不准。