一
前言
基于HANA的内存数据库的强大性能, SAP建议把业务逻辑下沉到HANA中计算.以便减去应用服务器的负担,让程序性能更好一些.
业务逻辑下沉到HANA一般的方式是使用视图搭建数据模型来实现相关业务逻辑,
HANA视图(HANA工作台中的可视化视图工具,也可以通过SQL语句创建)
CDS视图
当视图模型结构过于复杂时,视图本身的性能就会变差,如果在执行一个大量运算时,需要频繁读取视图的内容. 此时把视图写入到物理表(数据落地)会极大的优化性能
本文主要介绍视图内容写入物理表的一个小应用
二
HANA环境
HANA数据库中复制数据最快捷的方式
通过查询创建表
create column table zts_table as ( select * from ZDDL_ZPUHM )
通过查询写入表
INSERT INTO zts_table SELECT * FROM ZDDL_ZPUHM
但这样创建的表,通过SE11无法查看,因此ABAP中无法使用该表.
三
几个思虑
视图中的数据关键字是什么? 确保视图数据不重复的字段是哪几个, 表需要用这几个字段创建关键字, 确保写入表后数据不会丢失.如果不想考虑这个问题, 则可以考虑使用GUID或记录号作为表的关键字.
数据量过大时的分包处理
复制的间隔.表需要每天复制一次就好? 还是需要使用时立即复制?
四
小工具
基于上述的思虑,开发了一个简单的类ZCL_COPY_TABLE.专门用来处理视图到表的复制,使用很简单. 如图一
其中ZSTABLE_COPY的结构字段如下 图二
TABNAME_ORI 源表名(或视图)
TABNAME_TAR 目标表名
PACKAGE_NUM 每个包的条目数(大量数据读取时,每个包读取的条目数,0表示一次性读取)
SAME_FIELDS 字段完全相同标记(如未标记,使用MOVE-CORRESPONDING 复制同名字段)
INTERVAL 间隔方式
D按天检查(检查是否又当天的复制)
I按时间间隔检查,检查上次复制距离当期的秒数
R不检查,直接执行
SECONDS间隔检查的秒数
FNAME_KEY表内容复制的唯一关键字的字段名(确保视图数据全部写入表中)
通过日志表 ZTCOPY_TABLE_LOG 如图三 记录表复制操作的日志, 该日志表也用于间隔检查.
图一
图二
图三
五
可能的改进
写文章的时候查了一个新的ABAP INSERT 语法.
新的语法支持使用
INSERT
FROM ( SELECT * FROM)
该语句会被解析成HANA中的相应语句, 性能优于传统的先读取到内表,再从内表写入目标表的方式,也不会有内存压力. 后续可以考虑应用该语句优化这个类
六
总结
复杂视图的内容落地(保存到表中),使用表代替后续多次访问内容及参与其他表连接,有时候可以极大的优化后续的SQL语句性能. 在这个小工具中考虑了视图逻辑的一些常见的场景. 使用比较方便.
类的源码较长. 需要的同学可以在公众号中回复如下关键字获取
复制视图