在项目开发过程中,经常会遇到HANA模型运行效率的问题;

  以我们项目为例,HANA平台要求模型运行时间不能超过10秒,但是在大数量和计算逻辑复杂的情况下(例如:ERP中的BKPF和BSEG量表的年数据总量超过20亿条),HANA模型的运行时间基本上都在1分钟以上。在不关联其它表,单单是几个板块的BKPF和BSEG表UNION ALL,运行时间都超过1分钟。鉴于这种情况,项目组对HANA模型是否存在优化空间,进行了分析和探讨,也请教了HANA平台的专家对HANA的优化给出可行性建议。

  最终的分析结果,最简单、最高效的优化方法就是减少数据量,当然这个方法基本上不用说,没什么技术含量,仅仅是数量级的减少。对我们程序员来说,当然不能满足这么简单粗暴的方法。

  经过讨论,制定几条优化的方向:

  1.将复杂的可视化模型通过SQL SCIRPT替换;

  2.现有的模型都是通过计算视图实现的。查看了相关资料后,发现HANA的属性视图、分析视图、计算视图对应不同的处理机制。属性视图擅长大数据量的关联。分析视图适合逻辑运算。计算视图是在效果上可以理解为集合属性和分析视图的两种功能。于是采用将数据量比较大的关联和汇总通过属性视图实现。

  3.拆分大的模型为几个小的模型组合。

  4.图形化和SQL SCRIPT结合使用;

  5.模型落地;

  确定了方向后,项目组开始针对以上几点进行验证;

  首先,将复杂的可视化模型全部用SQL实现,实验的结果并不理想。于是上网查相关资料,发现可视化模型和SQL模型的处理机制不一样,HANA对可视化模型的运算速度要高于SQL的运行效率。而我们将SQL模型和可视化模型的运行速度进行比较,发现SQL模型的运行时间要大于可视化模型。例如,同样的数据量,同样的逻辑,最终的结果是SQL的运行时间比可视化模型的运行时间多一秒左右。当然这只是经过多次运行以后得出的规律行时间差。通过以上的对比,我们发现SQL替换可视化模型的方案不可行。

  其次,我们将BSEG和BKPF几大板块UNION ALL的过程以属性视图实现,通过最后实验对比,发现属性视图并不比计算视图速度快。

  再次,拆分大的模型为几个小的模型组合。经过分析,我们发现HANA实际上是动态查询机制,在计算过程中并不存储中间计算数据,也就是说,不管你拆分成几个模型,最终的结果都是从最底层开始,逐渐的累积到最后,形成一个大的SQL动态的查询数据。通过对最终视图的执行计划分析,我们发现最终视图的执行计划包含了几个小模型的运算轨迹,按照小模型的运算轨迹累加,最终得到最终模型的结果。实际上拆分成几个小模型,理论上来讲运行速度比不上一个完成的大模型的运行速度。举个例子,有A、B、C三个视图,逻辑关系是A调用B视图,B调用C视图,假设A是B的聚合结果,在C上做数据排重处理,如果C包含6列,其中一列是差异项,其它几列部分差异,那么在B中,不点亮C中的差异项,那么B中不点亮差异列的PROJECT会自动排重,即使你没有做排重操作,一样会排重其它几列的重复项。也就是说HANA的模型是通过动态SQL查询数据,在查询的过程中,HANA会根据自己的规则对动态SQL进行优化。

  第四,图形化和SQL结合方式,在逻辑复杂的情况,通过可视化模型不能实现业务逻辑的需要,那么就需要应用SQL进行运算,这样的结果在一定程度上来说是会减少运行时间,但这个减少的前提是通过可视化模型实现复杂业务逻辑会以增加PROJECT的方式实现业务逻辑,这样会给可视化模型造成很大的压力,因此会增加运行时间。所以,这个方法只是对可视化模型的补充,并不是优化。

  第五,模型落地,实际上就是动态查询物化,这样减少了中间的运算过程,很大的提高了运行效率,但是我本人认为这并不符合HANA本身的内存存储、内存运算的机制,传统数据库依然可以通过物化视图的方式实现运行效率的提高,并不代表优化的可行。

  通过以上几种分析,最终发现并没有达到我想要的优化结果。但是也不是一无所获。在验证的过程中,我们确认了HANA运行机制的几个关键点:
  1.HANA模型可以理解为动态的SQL查询。

  2.HANA模型的运算逻辑从下到上的整体运行。

  3.计算视图实际上包含了分析视图和属性视图的运行机制。

  以上几点的确认,为我们接下来进一步分析优化可行性提供基础论据;

  经过实际数据的验证和分析,以及项目组成员和HANA平台专家的讨论,最终我们总结出以下几点是HANA优化的可行方案:

  1.减少数据,通过FILTER、JOIN的先后顺序、左右关系尽量减少数据量。在最底层视图中,进行数据过滤,通过关联关系剔除数据以达到数据量减少的目的。我们经过验证发现通过JOIN的先后顺序会优化视图运行时间,减少时间在一秒左右。

  2.减少PROJECT和aggregation的数量。在建模过程中,要先根据需求对模型进行设计。设计过程中,尽可能的最大化的利用PROJECTION,减少不必要的PROJECTION。因为HANA的运行轨迹是按照模型的轨迹进行运算的,所以每增加一个PROJECTION就会增加一次运算,哪怕是最基本搜索。

  3.减少相同数据的使用次数。比如在开发过程中,我们会将同一部分数据通过不同条件分成两个PROJECTION,然后再对两个PROJECTION进行逻辑运算,这样的应用根据HANA的运行轨迹分析,会将同一部分数据进行两次运算,数据量级会增大,影响运行效率。可以通过行专列,或者IF条件对不同条件的数据进行计算。这样的话就减少了同一量级数据的重复使用。

  4.减少点亮不必要字段,这个很好理解,毕竟HANA是列式存储,每增加一列,会增加参与运算的数据量。

  5.在新建列的时候,尽量避免在同一视图中使用CE运算机制和SQL运算机制。要么使用CE运算机制,要么使用SQL,不要既有CE又有SQL。毕竟两个运算机制不一样,混在一起使用会增加运算负担。

  以上几点经过我们项目组的分析和验证,是有效的优化HANA模型的方法。

  虽然我们最终找到了HANA的优化方法,但是我不并满意。从以上几点,我们可以很直观的感觉到,对HANA底层的认知,还是浮于表面,并没有深入到HANA的内部机制,从内部机制和使用规范上进行优化。也就是说HANA对我们来说就像一个黑盒一样,我们能看到颜色、形状等这些表象的东西,并没有打开盒子看内部构造,所以提出的优化方案都很肤浅。

  曾经有大神说过,理论上来说HANA不存在优化的必要,只要资源足够,那么HANA的运行效率是不需要担心的。但是从技术角度来说,我不认可这样的观点。如果不去研究深层次的东西,只是简单粗暴的堆积木,那么对技术的提高以及能力的提高没有任何帮助,最终沦为真正的搬砖的。

  我始终认为,在技术的路上,要不段深挖,不断的探索,不段的尝试,才能提高自己,看清前路。

  

SAP HANA项目过程中优化分析以及可行性验证的更多相关文章

  1. 联想项目结束了,聊聊华为SAP HANA项目八卦

    联想项目结束了,聊聊华为SAP HANA项目八卦 [转] 本文目录 [隐藏] 1.故事线 2.华为的文化我们不懂 3.分分钟的文化冲突 4. 项目到底要做什么(待更新) 5.项目咋样了(待更新) 1. ...

  2. 【HANA系列】SAP HANA数据处理的理解与分析一

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA数据处理的理解与 ...

  3. Bug,项目过程中的重要数据

    作者|孙敏 为什么要做Bug分析? Bug是项目过程中的一个有价值的虫子,它不只是给开发的,而是开给整个项目组的. 通过Bug我们能获得什么? 积累测试方法,增强QA的测试能力,提升产品质量 发现项目 ...

  4. 【HANA系列】SAP HANA计算视图中的RANK使用方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA计算视图中的RA ...

  5. 跟我extjs5(03--在项目过程中加载文件)

    跟我extjs5(03--在项目过程中加载文件) 上一节中用sencha工具自己主动创建了一个项目.而且能够在浏览器中查看. 如今我们来看看js类载入过程. 例如以下图所看到的: watermark/ ...

  6. SAP HANA studio 创建分析视图

    [Step By Step]SAP HANA中创建分析视图(Analytic View) 1. 在Modeler视图中点击新建Analytic View 2. 设置分析视图的属性 Name: 分析视图 ...

  7. 2016年JD工作遇到的问题:1-5,搭建环境和熟悉项目过程中的坑

    1.更新不需要权限的项目A,却提示没有权限. 先从Git上更新项目A的代码,提示没有权限. 然后从Git上更新其它项目B的代码,正常. 再更新项目A的代码,正常了. 奇葩问题! 2.Eclipse中, ...

  8. Maven3.2创建webapp项目过程中问题以及解决方案

    用maven组件来创建web项目,maven的好处一大堆,但是在创建项目的时候问题也很多,诸多不顺,网上找了很多资料,貌似都没能解决问题. 环境:jdk1.7.0_80,eclipse4.4,mave ...

  9. webpack 创建vue项目过程中遇到的问题和解决方法

    目录 1 webpack简介 2 webpack实现多个输入输出多个html 3  webpack 中的module下rules 下的use和loader选项 4 webpack 文件更新,如何使页面 ...

随机推荐

  1. shell工具-sed

    sed sed是一种流编辑器,它一次处理一行内容.处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这 ...

  2. bootstrap1.3

    <html>   <head>   <meta charset="UTF-8">   <title></title>   ...

  3. adb push 和 adb pull命令

    adb push命令 :从电脑上传送文件到手机: adb pull命令 :从手机传送文件到电脑上             @Cocos 下次需要权限的目录可以执行chmod 777 目录名      ...

  4. 七种bond模式说明

    第一种模式:mod=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略) 特点:传输数据包顺序是依次传输(即:第1个包走eth0,下一个包就走eth1….一直循环 ...

  5. Linux-系统相关命令及配置文件

    1.查看/配置主机名 # 查看主机名 hostname # 配置主机名(临时) hostname <HOSTNAME> # 配置主机名(永久) hostnamectl set-hostna ...

  6. nuget.org无法解析的办法

    今天想学习ef框架,就着手安装最新的ef啦.可是遇到了问题,提示 未能解析此远程名称:'nuget.org' 就去上网找资料啦,发现原来是被墙了,表示无奈. 网上的资料提示,修改hosts文件或是dn ...

  7. C# WPF 中WebBrowser拖动来移动窗口,改变窗口位置

    前言 wpf中的WebBrowser相比之前的winform阉割了不少东西,也增加了不少东西,但是msdn对wpf也没有较好的文档 WebBrowser可以说是一个.NET控件,相对于WPF中的控件, ...

  8. 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation

    [源码下载] 背水一战 Windows 10 (55) - 控件(集合类): SemanticZoom, ISemanticZoomInformation 作者:webabcd 介绍背水一战 Wind ...

  9. Python文件读写及网站显示

    一.关于文件读写的笔记 (一) 文件概述 文件是一个存储在辅助存储器上的数据序列,可以包含任何数据内容 文件都是按照2进制进行存储的,但在表现形式上有2种:文本文件和二进制文件. 1. 文本文件 文本 ...

  10. Android------------------系统服务调用的学习

    一.ServiceManager的方法: 此方法getService,用于根据名称获取当前的IBinder的代理(并没有直接获取服务), 服务提供的功能是依靠IBinder间接调用的(返回值IBind ...