HANA每一个运算节点都有存在优化的可能,这次先来看看union相关优化。
用合适的方法替代UNION
由于列引擎不原生支持UNION ALL、UNION、INTERSECT和EXCEPT操作,避免使用它们可能会提高性能。
下面是示例,展示了如何避免使用UNION、INTERSECT和EXCEPT。请注意,这些示例中的转换通常不适用于一般情况。只有在感兴趣的列中没有空值时,这些转换才有效。对于INTERSECT和EXCEPT,如果所有感兴趣的列都显式声明了NOT NULL约束,则SQL优化器会自动应用这些转换:
注意:UNION ALL通常比UNION更快,因为它不需要进行集合比较。如果可以接受重复值或者你知道不会有重复值,应优先选择UNION ALL
原始代码: SELECT a, b FROM T UNION SELECT a, b FROM S; | 推荐代码: SELECT DISTINCT COALESCE(T.a, S.a) a, COALESCE(T.b, S.b) b FROM T FULL OUTER JOIN S ON T.a = S.a AND T.b = S.b; |
原始代码: SELECT a, b FROM T INTERSECT SELECT a, b FROM S; | 推荐代码: SELECT DISTINCT T.a a, T.b b FROM T JOIN S ON T.a = S.a AND T.b = S.b; |
原始代码: SELECT a, b FROM T EXCEPT SELECT a, b FROM S; | 推荐代码: SELECT DISTINCT T.a a, T.b b FROM T WHERE NOT EXISTS (SELECT * FROM S WHERE T.a = S.a AND T.b = S.b); |
使用UNION Pruning
假设存在历史数据和当前数据存在不同的表,在特定的场景下以不同的年份进行区分,那么可以做一个配置表,使用配置表对数据进行配置,访问不同时间区间的数据,可以提高访问效率。
PA教程相关说明
还有另外一种UNION Pruning的方法,直接在管理匹配的关系中定义一个常量。
在代码中的区别,一个是加了WHERE FLAG='CURRENT',另一个没有加,时间上性能提升是非常明显的。