QlikView优化之提前加载

浏览: 2663

先来打个广告,大家期待已久的正式版的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优化感兴趣的伙伴们。

推荐 1
本文由 曹浩 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

谢谢曹老师的分享
SUM()如何在脚本运用

要回复文章请先登录注册