1 背景
smartbi根据拖的报表通过业务逻辑处理生成的SQL因为要处理各种情况,为了业务上的统一性,拼出来的SQL语句往往比较复杂,嵌套的层级比较多。一是会使查询的性能较差(目前已知mysql、sqlserver),二是SQL不便于阅读, 所以在查询过程中对生成的SQL语句做了简化处理。
前提条件
1、使用SQL简化的功能的前提是要先开启数据模型引擎V2.0:OLAP_QUERY_NEW_ENGINE_BUILD_MDX =true以及新前置开关:USE_NEW_ENGINE_PREPROCESS=true。
2、在运维设置/系统选项 开启简化SQL的开关:COMMONS_SQL_OPEN_SIMPLIFY_SQL=true;一旦开启,所有基于数据模型的报表查询满足条件都会简化SQL语句。
3、如果多维引擎需要开启SQL简化:需要开启 OLAP 中的配置项 mondrian.simplifySql=true 来控制是否启用简化SQL功能,默认不开启;并且新增日志 smartbiolap_fatal.log 用于记录在调用简化SQL功能中抛出异常的日志,可以在OLAP系统监控的导出日志中找到这个文件。
2 简化SQL需要的条件
- 要有子查询,且子查询不是union的,还要有from子句
子查询里面不能有distinct,limit,group by,聚合函数。
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方言测试。
group by不支持常量
目前测试的不支持常量的数据库,可直接去掉该group by表达式。
group by不支持表达式
目前测试的不支持常量的数据库,可替换成group by 1, 2, 3的方式实现,1,2,3代表group by字段在selectItem中的序号。