页面树结构
转至元数据结尾
转至元数据起始

正在查看旧版本。 查看 当前版本.

与当前比较 查看页面历史

版本 1 下一个 »

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系统监控的导出日志中找到这个文件。


简化SQL需要的条件

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

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

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

示例

原始SQL:

原始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:

原始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中的序号。


  • 无标签