先来打个广告,大家期待已久的正式版的QlikView开发课程已经正式上线了,大家可以登陆http://www.hellobi.com/course/62进行系统的学习,本课程共计21课,包含了几乎所有QV开发者所关心的问题和知识点,相信会对大家技术水平的提高有很大的帮助。另外也有免费的入门课程http://www.hellobi.com/course/33可供大家学习。
QlikView的提前加载功能,我想大家可能用的比较少,但是该功能对于QV的优化却有很大的作用,尤其在对后台脚本以及数据转换处理方面。简单来说,通过提前加载功能,你可以在一个加载语句中进行各种QV所支持的数据转换和处理,一方面简化了QV后台脚本,另一方面也优化了数据处理的效率。
来看一个简单的例子:
Load Date(OrderDate,‘YYYY/MM/DD’) as OrderDate;
SQL SELECT OrderDate FROM … ;
首先,我们从数据库抽取到了OrderDate字段,并且该字段是string类型,我们现在需要把该字段转换为QV所能识别的日期类型,但是在传统的SQL语句中是不支持QV中的日期函数的,那么我们通常的做法是先把该数据库中的表存储到QV中的一个临时表中,然后QV再去加载该临时表,然后按照需求做特定的处理。那么按照这种做法,我们就需要在QV中对该表的内容重复加载两次,除了代码冗余以外,也造成了内存资源的浪费,既然QV是一款内存式的BI工具,那么就要求我们在后台脚本中尽可能的做到代码执行的效率最高,以达到内存的最大化利用。
我们再来看看以上QV提供的提前加载功能,首先第二行的Select语句首先执行,然后再将值返回给Load语句,看上去比较复杂,不过你可以把它成以下的语句,那么就非常清晰了。
Load From ( Select From ( DB_TABLE ) )
是不是感觉和SQL语句中的嵌套查询很类似?
我们再来看一个内嵌函数Round( Exp( x ) ),该函数会首先计算内层函数Exp的值,然后返回值给Round函数,最后根据该返回值计算外层函数的值,也就是说会遵循从右向左的评估方式。原因很简单,Exp函数是最接近数据源的,理所应当被首先评估和计算。其实提前加载也就是同样的机理,也是接近数据源的语句就越先被执行。
利用提前加载功能,就可以简化很多在脚本中需要重复计算的过程,看下面这个例子:
Load ... ,
Age( Today(), BirthDate ) as Age,
Date( Age( Today(), BirthDate ),'YYYY/MM/DD' ) as ReferenceDate
Resident Table1;
该函数中Date函数用到了第一行中Age函数返回的值,如果不用提前加载功能,那么我们必须要在Date函数中重新用Age函数再计算一遍,造成了资源的浪费。
再来看一下用提前加载功能如何完成的:
Load ...,
Age,
Date( Age,'YYYY/MM/DD' ) as ReferenceDate;
Load *,
Age( Today(), BirthDate ) as Age,
Resident Table1;
利用提前加载,我们对Age函数只需要定义一次,然后就可以直接拿来用了,无疑在QV的脚本执行速度和效率方面都得到了很大的提升。并且对提前加载功能,拿官方的话来说就是没有任何的缺点,所以大家尽可能去使用它,尤其是对QV优化感兴趣的伙伴们。