一、关于内存化 熟悉FineBI中FineDirect数据引擎的童鞋们应该都知道,勾选内存化的数据表可以将数据库中的数据同步到服务器内存中,而FineDirect数据引擎中的内存化功能主要用于解决和处理直连跨数据源关联问题以及大数据量join性能较低的问题。除了这两大场景之外,FineDirect直连引擎中的内存化功能其实还有着许许多多的妙用,今天就给大家分享一个通过FineDirect直连引擎内存化解决kylin数据库报错的问题。
二、详细场景
kylin数据库在处理大数据量的数据时,其性能往往表现较好,故而我们企业如果有kylin这一类大数据平台时,往往会选择使用FineDirect直连数据引擎进行实时对接数据分析。我们先来看到上图中的数据统计情况,其他组件中的数据都正常计算出来了,但预览模板时右上方统计的“一年未报企业数前五地区”的kylin数据统计却报错了(编辑模板时正常显示图表数据),我们展开报错信息可以简单判断是SQL执行失败了。看到报错不用慌~这边为了更加清晰地进行分析,我们将该SQL拷贝出来看看。 - select T_C84177.AREANAME,sum(T_C84177.CNT)
- from (select s.areaname,s.cnt
- from (select a.areaname,o.cnt
- from (select ownid,count(*) as cnt
- from kl.nbn n
- left join sjtbk.a_bm_area a on n.regorg=a.areaid
- where noreport=1 and n.ancheyear='2016' group by ownid) o
- left join (select a.ownid,a.areaname from sjtbk.a_bm_area a where substring(a.areaid,5)='00') a
- on o.ownid = a.ownid)s)T_C84177
复制代码 首先对于我们在做仪表板数据图表分析之前,添加SQL数据集的时候我们知道,当时预览的SQL是没有问题的,也就是嵌套SQL内部的部分执行时没有问题的: - select s.areaname,s.cnt
- from (select a.areaname,o.cnt
- from (select ownid,count(*) as cnt
- from kl.nbn n
- left join sjtbk.a_bm_area a on n.regorg=a.areaid
- where noreport=1 and n.ancheyear='2016' group by ownid) o
- left join (select a.ownid,a.areaname from sjtbk.a_bm_area a where substring(a.areaid,5)='00') a
- on o.ownid = a.ownid)s
复制代码 此时我们大概心中有数了,也就是因为外面嵌套的部分影响了整个SQL的执行。对于一般mysql或者oracle数据库来说,其实这段sql语句是没有什么语法问题的。但是现在连接的是kylin数据库,是否还是没有问题呢?对kylin数据库熟悉的小伙伴们应该都知道一点,在kylin数据库中是不能对join之后的结果集再做sum...group by操作的,也就是对拼接之后的结果集不能再做聚合操作。那么怎么办呢,这种情况下,是不能使用FineDirect直连引擎就束手无策了呢?
三、解决方案
其实到这里我们就要有一个解决问题的思路,问题是因为kylin数据库不允许对join之后的结果集再做sum...group by操作,那么不做数据库层面的join操作,将原本需要在数据库中执行的join用FineDirect直连引擎提供的内存化功能来处理显然就能够解决问题了,这边我们将刚刚需要计算统计的SQL拆分为两个子SQL数据集来进行处理。
SQL1:- select ownid,count(*) as cnt
- from kl.nbn n
- left join sjtbk.a_bm_area a
- on n.regorg=a.areaid
- where noreport=1 and n.ancheyear='2016'
- group by ownid
复制代码 SQL2:- select a.ownid,a.areaname
- from sjtbk.a_bm_area a
- where substring(a.areaid,5)='00'
复制代码 然后在FineDirect引擎中将SQL数据集1和SQL数据集2通过ownid进行N:1的关联,同时将SQL数据集2勾选内存化处理即可(将SQL数据集2中的数据抽取到服务器内存中然后再和SQL数据集1进行关联)。保存业务包之后重新使用新的数据集字段制作该图表,接下来我们继续看经过刚才操作之后的FineDirect数据引擎的表现情况。
如上图所示,一切正常。怎么样,FineDirect直连引擎中小小的一个内存化功能却拥有着大大的能量,确实很强大吧? 编辑于 2018-3-2 11:08
|