1 背景

smartbi的报表通过业务逻辑处理生成的SQL因为要处理各种情况,为了业务上的统一性,拼出来的SQL语句往往比较复杂,嵌套的层级比较多。一是会降低查询效率,二是SQL不便于阅读, 所以在查询过程中对生成的SQL语句做了简化处理。

1、如果多维引擎需要开启SQL简化:需要开启 OLAP 中的配置项 mondrian.simplifySql=true 来控制是否启用简化SQL功能,默认不开启;并且新增日志 smartbiolap_fatal.log 用于记录在调用简化SQL功能中抛出异常的日志,可以在OLAP系统监控的导出日志中找到这个文件。

2、目前SQL简化已做兼容测试的库有:STARROCKS 、GBASE8T 、 SHENTONG 、 CIRRODATA 、GREENPLUM 、DB2_V9 、POSTGRESQL 、VASTBASEG100_PG 、KINGBASE 、VERTICA 、SELECTDB 、 HANA 、CLICKHouse、 YMATRIX 、OCEANBASE 、 IMPALA 、DAMENG 、MSSQL 、GBASE8S_V84 、 MYSQL。没有兼容适配的库,不会走SQL简化。


简化SQL需要的条件

  1. 要有子查询,且子查询不是union的,还要有from子句
  2. 子查询里面不能有distinct,limit,group by,聚合函数。

  3. where子句、having子句、select子句没有子查询(暂未支持,后续可以支持)

       同时要满足上面3个条件才会简化。

示例

原始SQL:

select
    floor(a) as a1,
    1 as b1
from
    (
        select
            aa as a,
            cc as c
        from
            table
        order by
            a desc
    ) t
where
    t.c > 30

简化后的SQL:

SELECT
    floor(aa) AS a1,
    1 AS b1
FROM
    table
WHERE
    cc > 30
ORDER BY
    aa DESC

3 简化SQL方言处理

简化后的SQL,where、group by、order by部分可能出现常量,表达式。例如:有些数据库不支持group by为常量,表达式。则需要对简化后的sql进行方言处理

测试部分数据库方言特性见:Where、order、group、having方言测试

4 group by不支持常量

目前测试的不支持常量的数据库,可直接去掉该group by表达式。

5 group by不支持表达式

目前测试的不支持常量的数据库,可替换成group by 1, 2, 3的方式实现,1,2,3代表group by字段在selectItem中的序号。