开始课程先,先按照以下链接导入所需的delivery unit https://open.sap.com/courses/2/discussion_topics/564
第一章 SQLScript简介
这是HANA建模中所必备的知识。但是第三周一整周都会介绍SQLScript,因为对于基于HANA的应用开发来说,这也是必须熟知的。
什么是SQLScript?为什么需要SQLScript?
SQLScript是SAP对标准ANSI SQL的扩展,与其他数据库厂商对SQL的扩展一样。那么为什么需要SQLScript当然也就一目了然了。我曾经很怀疑如何将逻辑推到DB这个方法,觉得这会破坏应用的可维护性和架构。但是想想O记的EBS开发,是离不开PL/SQL的。拥有了自己的DB再针对其进行优化,会带给SAP更多的可能。SQLScript是在HANA Studio的SQL Editor里编写。这个与O记的各种成熟的PL/SQL开发IDE来说,暂时确实简陋了些。但是无论从SQLScript语言本身还是开发环境,都在快速演化中,不久的将来应该会变得很顺手。
HANA的一大特点就是并行计算,而且是对开发者完全透明的。如下面的例子,第三和第四个查询互相之间没有任何依赖关系,虽然在编写时有前后顺序,但是HANA却可以并行执行,推向不同的CPU core。
但是也有一些情况HANA会放弃并行计算。比如有写操作,或者有DDL操作,因为并行计算无法保证结果的正确性。再比如,有类似CASE这样的语句,使计算必须按照一定得顺序或者逻辑执行时。需要注意的是,一旦HANA发现由于以上的某种情况使得无法进行并行计算后, 即便之后的操作都符合并行计算的条件,HANA也不会再次进行并行计算。所以最好的办法是将可以进行并行计算的部分单独创建存储过程被调用。
SQLScript还可以定义table type。其实可以理解为ABAP里面的structure,用来存储table型的数据。
最后是存储过程的定义和调用语法。存储过程有传入传出参数。需要定义使用的语言,因为除了SQLScript以外,还可以使用开源统计语言R。HANA可以与R结合,利用PAL和PA进行统计分析。此外,还有一种语言可供选择 L。只不过这只供SAP内部开发使用。我们可以指定存储过程是只读的以及存储过程的输出是否可以作为column view用于SQL查询。
第二章 创建包含SELECT的存储过程
首先,关于HANA的select,与标准SQL没有什么区别,只是要注意尽量避免SELECT * SELECT SINGLE *。我们知道在传统的RDBMS都要尽量避免这种语句以提高性能。而对于列存储的HANA来说,这几乎就是导致性能大幅下降的凶手。
对于存储过程的创建来说,与前面创建其它对象很类似,那就是通过文件的方式。这样的好处不再赘述了,所有项目相关对象一起打包存储,升级等。我们要创建的事<存储过程名称>.procedure文件。之后系统会自动打开存储过程编辑器。
再编写完毕后(这里我建议不要拷贝黏贴代码模板,而手动敲入,印象会更深),会在_SYS_BIC下找到该存储过程。这里就有问题了。因为我们是可以通过传统HANA建模方法编写存储过程的,也就是说我们可以用这种方法更改它。那么就一定要小心这种可能。因为你的更改是即刻在HANA里生效的,而此时你的HANA开发视图里项目下的存储过程还是旧的。所以要尽量避免这种直接更改。
第三章 用CE(calculation Engine) 函数创建存储过程
CE function,全名是calculation engine function,是可以用来编写存储过程的另外一种方式。了解CE函数之前,我们首先要了解SAP HANA一个比较粗略的架构。在列存储这一部分,我们以前已经了解过建模所需要的一些基本组成部分:attribute view, analytic view, calculation view。这些不同的视图其实是由HANA里不同的引擎处理的,而不同的引擎都擅长于做不同的事情。attribute view由JOIN ENGINE处理,analytic view由OLAP ENGINE处理,calculation view由CALCULATION ENGINE处理。避免HANA出现性能问题的一个最基本的原则就是避免数据在不同的引擎中反复传递。
CE函数就是calculation engine内部实现的一些常用的SQL功能,比如JOIN, SELECT…WHERE等。由于直接由calculation engine处理,效率相对较高。而普通的使用如上一章SQL编写的存储过程由于要经过SQL optimizer,所以从性能的角度,不如CE函数。但是,一定要记住的是,切忌混合CE函数与SQL在一个存储过程里,这可能成为性能的杀手。还记得之前我提到的么,避免在不同的引擎中反复传递数据。混合CE函数与SQL就会造成这样的问题出现。比如在HANA专家Werner的文章里就提及了,不要混合使用SQL与CE函数http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/6056911a-07cc-2e10-7a8a-ffa9b8cf579c?overridelayout=true
除此以外,还有一个基本事实,可能是HANA初学者或者没有实际经验的人不知道的,但是却从以上思想中可以推论出来的。大量数据在OLAP ENGINE和CALCULATION ENGINE中的传递,也会造成性能问题。而需要注意的一点是,并非analytic view只会在OLAP ENGINE里处理,如果你创建了一个calculated attribute,那么这个模型本身会成为一个calculation view,潜在的性能问题就可能产生。
具体CE函数,大家可以去help.sap.com的手册里去找。在HANA XS开发项目中创建基于CE函数的存储过程也没有特殊,与基于SQL的一样。这是本次练习的示例:
CREATE PROCEDURE get_bp_addresses_by_role_ce (
in partnerrole nvarchar(3),
out bp_addresses tt_bp_addresses )
LANGUAGE SQLSCRIPT
SQL SECURITY INVOKER
READS SQL DATA AS
BEGIN
lt_bp =
CE_COLUMN_TABLE(”SAP_HANA_EPM_DEMO”.”sap.hana.democontent.epm.data::businessPartner”,
["PartnerId", "PartnerRole", "EmailAddress", "CompanyName", "AddressId" ]);
lt_bp_proj = CE_PROJECTION(:lt_bp,
["PartnerId", "PartnerRole", "EmailAddress" , "CompanyName", "AddressId" ],
‘”PartnerRole” = :partnerrole’ );
lt_address =
CE_COLUMN_TABLE(”SAP_HANA_EPM_DEMO”.”sap.hana.democontent.epm.data::addresses”,
["AddressId", "City", "PostalCode", "Street"]);
bp_addresses = CE_JOIN(:lt_bp_proj, :lt_address, ["AddressId"],
["PartnerId", "PartnerRole", "EmailAddress", "CompanyName",
"AddressId", "City", "PostalCode", "Street"]);
END;
第四章 编写具有判断逻辑的存储过程
本章没有什么特别的内容。几乎所有的数据库厂商都扩展了标准SQL使得能够编写IF/FOR/WHILE/CASE等逻辑判断语句的存储过程。
第五章 使用SQLScript debuuger
这是常常被大家谈起来的HANA 1.0 SP05的特性。http://scn.sap.com/community/developer-center/hana/blog/2012/11/30/introducing-the-new-sap-hana-sqlscript-editor 终于大家拥有了一个叫交互式集成调试器来调试存储过程了。它与其他的调试器并没有大的不同,调试视图由三部分组成,分别是调试会话,watch和代码窗口。但是想考开始调试是需要设置权限的。要对_SYS_BIC schema的调试权限。
之后可以通过双击代码行左侧或者右键toggle breakpoint的方式。但是目前的调试器还是有一点遗憾的,就是对于存储过程的输入参数,我们没办法提供类似弹出窗口一样的东西传值。现在的解决办法是编写一个专门测试用的存储过程,调用要被调试的存储过程并传值,比如:
CREATE PROCEDURE debug_wrapper ( ) LANGUAGE SQLSCRIPT SQL SECURITY INVOKER READS SQL DATA AS BEGIN /***************************** Write your procedure logic *****************************/ call _SYS_BIC."workshop.session. .procedures/get_product_sale_price"( 'HT-1000', ?); END;
使用过基于eclipse开发环境并且调试过的同学一定不陌生,那就是设置debug配置。由于目前HANA调试器没有任何可配置项,我们只是创建一个空的配置。未来的revision中会加入比如传入参数值之类的配置项。
这一周的内容就结束了,而我们也要跟传统HANA建模相关的知识说拜拜了。从下周开始是重头戏了,SAPUI5,OData...加油!