HANA:传参,游标(Cursor)应用,FOR循环,解决存储表内存溢出的问题

作者 idan lian  如需转载备注出处

1.应用场景

最近项目上用HANA开发的比较多,之前我是bw用的比较多,就不会有这种问题。我们这个项目很多都是开发的计算视图,但最近做acdoca的逻辑时,计算视图在生产环境执行的时候报错,报的内存溢出,acdoca上亿的数据,直接用计算视图确实跑不出来,跑出来也要跑很久,内存溢出的报错如下这种。

想解决内存溢出和查询慢的这个问题,只有把中间过程落地存储成数据库表了,有点类似BW ADSO的分层,但是HANA分层直接插入数据库表的时候,插入数据的时候也是直接去处理acdoca全部的数据,依然报错,内存溢出。

BW ADSO建模为什么不报错呢。因为adso存储的时候执行DTP。是分包跑的,就是acdoca几亿的 数据量,我也是根据包大小去分开上千个包执行落地的,这次的解决方案就是模仿这种逻辑

2.实现步骤

定义参数:对HANA最底层视图定义参数,在HANA中间层视图也创建一个相同的参数

参数传递:

在中间层把中间层的视图传递给最底层,

创建存储过程时根据定义的游标,按字段的不通去for循环分开循环执行,字段的值会传递到中间层参数,从而传递到最底层视图的参数,限制最底层数据,实现类似的分包处理。

3.传参,HANA游标,及FOR循环

上面想到了解决办法,怎么实现呢,大体的思路就是分公司或者分期间,去循环执行存储过程,这样可以有效减少最底层处理的数据量,解决内存溢出的问题,执行这个的时候一定要注意,你的计算视图逻辑里,有没有跨公司的逻辑,或者跨年的逻辑,如果有,就不能这样分开去处理,我这里用我项目上的为例,是分开按年份执行的,这样可以在内存允许的范围内减少循环次数。

传参:涉及到减少acdoca最底层的计算数据量,那么我中间层按年份执行的变量参数怎么传给最底层呢,这里涉及到定义HANA参数,以及HANA参数的传递,这是我本次需求的最底层视图和中间层定义的参数和参数限制,最底层为图形化视图,主要是acdoca的明细数据,中间层为计算视图,是通用逻辑处理。

3.1传参

首先看参数的创建和传递

基础数据层视图

最底层为ACDOCA模型,如图创建参数

参数限制写在过滤中

中间层视图

中间层为脚本视图,定义参数及参数传递如下

这里参数传递的语法如下:

PLACEHOLDER."$$参数"=>:需要传递的参数

存储过程中的传参

后面会把存储过程的代码贴出来,可以参考

3.2.HANA游标,及FOR循环

游标有些没接触过的比较陌生,先说下根据我百度到的和个人理解的概念

什么是数据库游标?
可以将数据库游标视为指向查询结果中特定行的指针。指针可以从一行移动到下一行。根据游标的类型,您甚至可以将其移动到上一行。
可以这样想:SQL结果就像一个袋子,你可以一次保存一大堆行,但不能单独保存任何一行;而游标就像一把镊子。有了它,你可以把手伸进包里抓一排,然后移到下一个。

这样理解游标是不是很像abap定义内表,定义工作区,for循环就是去循环抓取数据。

特殊说明一下游标的语法

--定义游标表及赋值,游标表的数据为select的字段及数据(类似abap定义内表,内表赋值),

DECLARE CURSOR  游标表 FOR

SELECT DISTINCT 表字段 FROM 查询表";

循环读取数据到R工作区)

FOR 工作区 AS 游标表DO

****数据处理****

FROM 表名(PLACEHOLDER."$$变量$$" =>: 工作区.字段 )--R工作区字段循环传参赋值

END FOR;--结束循环

4.存储代码示例

实现存储过程的代码如下,定义游标关键步骤的注释我都写的很详细,不特殊解释了

create procedure "SAPHANADB".ZPR_insert_ZBWT_DT_BPC as/********* Begin Procedure Script ************/ 
BEGIN 
--定义游标表ZGJAHR,游标表的数据为select的字段及数据(类似abap定义内表,内表赋值)
DECLARE CURSOR  ZGJAHR FOR 
SELECT DISTINCT GJAHR FROM "SAPHANADB"."/BIC/AZEFI00012";  truncate table "SAPHANADB"."ZBWT_DT_BPC";
--执行FOR循环,根据游标数据循环读取到R中,(定义的R我理解有点类似定义abap的工作区,循环读取数据到R工作区)
FOR R AS ZGJAHR DO
insert into "SAPHANADB"."ZBWT_DT_BPC"
SELECT"TIME" || ROW_NUMBER()OVER(ORDER BY "TIME","ENTITY")  AS "ID","TIME",CASE WHEN "ACCOUNT" IS NULL THEN '' ELSE "ACCOUNT" END AS "ACCOUNT","ENTITY","ENTITY_TEXT","INTERCO","INTERCO_TEXT","AUDITTRAIL","CATEGORY","SCOPE","RHCUR","RWCUR","TYPE","MISC","KUNNR","KIDNO","ZZYLIU6","ZZYLIU11","VTWEG",CASE WHEN "FLOW" IS NULL THEN '' ELSE "FLOW" END AS "FLOW",CASE WHEN  "ZHBHB" IS NULL THEN '' ELSE  "ZHBHB" END AS  "ZHBHB", 	CASE WHEN  "ZLOGIC_CODE" IS NULL THEN '' ELSE  "ZLOGIC_CODE" END AS  "ZLOGIC_CODE", CASE WHEN  "ZLOGIC_VALUE" IS NULL THEN '' ELSE  "ZLOGIC_VALUE" END AS  "ZLOGIC_VALUE", "RSTGR","RFAREA","DRCRK","RASSC","MATKL",CASE WHEN "MATKL_HB" IS NULL THEN '' ELSE "MATKL_HB" END AS "MATKL_HB",CASE WHEN "CODE_QD_D" IS NULL THEN '' ELSE "CODE_QD_D" END AS "CODE_QD_D",CASE WHEN "CODE_QD_E" IS NULL THEN '' ELSE "CODE_QD_E" END AS "CODE_QD_E","RACCT","RMVCT",CASE WHEN "LAND1" IS NULL THEN '' ELSE "LAND1" END AS "LAND1",CASE WHEN "REGION" IS NULL THEN '' ELSE "REGION" END AS "REGION","ZZYLIU10","MATNR",CASE WHEN "MATNR_TEXT" IS NULL THEN '' ELSE "MATNR_TEXT" END AS "MATNR_TEXT","BTTYPE","ZDATE",CASE WHEN "PSPID" IS NULL THEN '' ELSE "PSPID" END AS "PSPID",CASE WHEN "AUFNR" IS NULL THEN '' ELSE "AUFNR" END AS "AUFNR",CASE WHEN "ZZYLIU9" IS NULL THEN '' ELSE "ZZYLIU9" END AS "ZZYLIU9",CASE WHEN "ATTRIBUTE1" IS NULL THEN '' ELSE "ATTRIBUTE1" END AS "ATTRIBUTE1",CASE WHEN "ATTRIBUTE2" IS NULL THEN '' ELSE "ATTRIBUTE2" END AS "ATTRIBUTE2",CASE WHEN "ATTRIBUTE3" IS NULL THEN '' ELSE "ATTRIBUTE3" END AS "ATTRIBUTE3",CASE WHEN "HKONT_SR" IS NULL THEN '' ELSE "HKONT_SR" END AS "HKONT_SR",CASE WHEN "HKONT_CB" IS NULL THEN '' ELSE "HKONT_CB" END AS "HKONT_CB","PS_POSID","ZSJLY","ZSFJS","ZCHBJ","WERKS","NPLNR","ZDXJT",sum("HSL") AS "HSL",sum("WSL") AS "WSL",sum("MSL") AS "MSL" 
FROM "_SYS_BIC"."ZP_DFYH_BW.ZP_LL/ZCV_DT_BPC"(PLACEHOLDER."$$IP_GJAHR$$" =>:R.GJAHR)--R工作区字段循环传参赋值
GROUP BY "TIME",CASE WHEN "ACCOUNT" IS NULL THEN '' ELSE "ACCOUNT" END,"ENTITY","ENTITY_TEXT","INTERCO","INTERCO_TEXT","AUDITTRAIL","CATEGORY","SCOPE","RHCUR","RWCUR","TYPE","MISC","KUNNR","KIDNO","ZZYLIU6","ZZYLIU11","VTWEG",CASE WHEN "FLOW" IS NULL THEN '' ELSE "FLOW" END,CASE WHEN  "ZHBHB" IS NULL THEN '' ELSE  "ZHBHB" END, 	CASE WHEN  "ZLOGIC_CODE" IS NULL THEN '' ELSE  "ZLOGIC_CODE" END, CASE WHEN  "ZLOGIC_VALUE" IS NULL THEN '' ELSE  "ZLOGIC_VALUE" END, "RSTGR","RFAREA","DRCRK","RASSC","MATKL",CASE WHEN "MATKL_HB" IS NULL THEN '' ELSE "MATKL_HB" END,CASE WHEN "CODE_QD_D" IS NULL THEN '' ELSE "CODE_QD_D" END,CASE WHEN "CODE_QD_E" IS NULL THEN '' ELSE "CODE_QD_E" END,"RACCT","RMVCT",CASE WHEN "LAND1" IS NULL THEN '' ELSE "LAND1" END,CASE WHEN "REGION" IS NULL THEN '' ELSE "REGION" END,"ZZYLIU10","MATNR",CASE WHEN "MATNR_TEXT" IS NULL THEN '' ELSE "MATNR_TEXT" END,"BTTYPE","ZDATE",CASE WHEN "PSPID" IS NULL THEN '' ELSE "PSPID" END,CASE WHEN "AUFNR" IS NULL THEN '' ELSE "AUFNR" END,CASE WHEN "ZZYLIU9" IS NULL THEN '' ELSE "ZZYLIU9" END,CASE WHEN "ATTRIBUTE1" IS NULL THEN '' ELSE "ATTRIBUTE1" END,CASE WHEN "ATTRIBUTE2" IS NULL THEN '' ELSE "ATTRIBUTE2" END,CASE WHEN "ATTRIBUTE3" IS NULL THEN '' ELSE "ATTRIBUTE3" END,CASE WHEN "HKONT_SR" IS NULL THEN '' ELSE "HKONT_SR" END,CASE WHEN "HKONT_CB" IS NULL THEN '' ELSE "HKONT_CB" END,"PS_POSID","ZSJLY","ZSFJS","ZCHBJ","WERKS","NPLNR","ZDXJT";END FOR;--结束循环
END

以上方式处理后,再执行存储过程,就会分包处理,不会报错了,如果对大家有帮助希望点赞一下,谢谢,也欢迎评论交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626517.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flink 1.18 sql gateway /sql gateway jdbc

一 sql gateway 注意 之所以直接启动gateway 能知道yarn session 主要还是隐藏的配置文件,但是配置文件可以被覆盖,多个session 保留最新的applicationid 1 安装flink (略) 2 启动sql-gatway(sql-gateway 通过官网介绍只能运行…

YOLOv8改进 | 检测头篇 | 利用DBB重参数化模块魔改检测头实现暴力涨点 (支持检测、分割、关键点检测)

一、本文介绍 本文给大家带来的改进机制是二次创新的机制,二次创新是我们发表论文中关键的一环,本文给大家带来的二次创新机制是通过DiverseBranchBlock(DBB)模块来改进我们的检测头形成一个新的检测头Detect_DBB,其中DBB是一种重参数化模块,其训练时采用复杂结构,推理时…

#AIGC##LLM##RAG# RAG:专补LLMs短板_减少LLM幻觉并多模态/RAG 技术最新进展

RAG技术,即检索增强生成,标志着自然语言处理领域的重大进展。通过整合先前知识,它提升了大型语言模型的性能,广泛应用于多模态领域和垂直行业。本文深入探讨了RAG技术的演进历程、技术发展、LLMs问题及其解决方案,为读…

【RT-DETR有效改进】ShapeIoU、InnerShapeIoU关注边界框本身的IoU(包含二次创新)

前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…

十、Three场景实现多个物体的合并

Three场景实现多个物体的合并 目的 产品需求是让物体的光柱墙包含一个多边形的区域,二而我的多边形只能使用原型,方向,多边形。那么再研究的时候就需要将这些多边形合并成为一个形状,那么就行实现了。 原先的图形 如上图,是两个mesh组成的。首先寻找mesh合并的方法。 第…

分布式限流要注意的问题

本文已收录至我的个人网站:程序员波特,主要记录Java相关技术系列教程,共享电子书、Java学习路线、视频教程、简历模板和面试题等学习资源,让想要学习的你,不再迷茫。 为什么需要匀速限流 同学们回想一下在Guava小节里…

MySQL运维篇(二)主从复制

一、概述 主从复制是指将主数据库的 DDL 和 DML 操作通过 二进制日志 传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL 支持一台主库同时向多台从库进行复制, 从…

聊一聊 C# 的线程本地存储TLS到底是什么

一:背景 1. 讲故事 有朋友在后台留言让我说一下C#的 ThreadStatic 线程本地存储是怎么玩的?这么说吧,C#的ThreadStatic是假的,因为C#完全是由CLR(C)承载的,言外之意C#的线程本地存储&#xff…

基于Java+SSM+MYSQL的助农特色农产品销售系统详细设计和实现【附源码】

基于JavaSSM助农特色农产品销售系统详细设计和实现【附源码】 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定…

调试openjdk11源码报段错误异常Segmentation fault解决方案

解决方案-忽略信号:(gdb) handle SIGSEGV pass noprint nostop ##openjdk11源码编译简单教程 传送门centos7下openjdk11源码下载编译安装_openjdk11下载-CSDN博客 ##调试openjdk11源码报段错误异常Segmentation fault解决方案 Program received signal SIGSEGV,…

连接器应用案例详解 | prodesign加速卡采用Samtec NovaRay® 极高密度阵列

【摘要/前言】 ChatGPT最近受到的欢迎和关注凸显了人工智能在影响日常生活方面所取得的进展。 有谁曾使用 ChatGPT 完成家庭作业或撰写博客?提前申明:这一篇文章绝对是真人撰写~ 无论如何,像ChatGPT这样的聊天机器人和类似服务的支柱都是高…

芯片有关新闻-China chip imports suffer steepest drop on record after US curbs

Jan 16, 2024 9:01 am 由于长期的经济不确定性和美国的出口管制,中国的芯片进口去年遭遇了有记录以来的最大降幅。 全球最大半导体市场的集成电路进口额下降了15.4%,至3494亿美元,这是自2004年中国海关数据公布以来的最大跌幅,并…

Controller层自定义注解拦截request请求校验

一、背景 笔者工作中遇到一个需求,需要开发一个注解,放在controller层的类或者方法上,用以校验请求参数中(不管是url还是body体内,都要检查,有token参数,且符合校验规则就放行)是否传了一个token的参数&am…

BigDecimal中使用ROUND_HALF_UP进行四舍五入

一、BigDecimal 简介 BigDecimal 类位于 java.math 包中,它提供了更加精确的算术运算,使用户完全控制舍入行为。 如果未指定舍入模式,并且无法表示确切的结果,则抛出异常; 否则,可以通过操作提供适当的 MathContext 对…

学生党有必要买台灯吗?央视公认最好的护眼灯

我认为学生党还是很有必要买台灯的!现在的孩子学业压力都比较大,白天光线亮度比较充足,对眼睛没有太大影响。不过夜晚的时候周围环境的光线都逐渐暗下来,如果单靠室内的灯光来学习,那肯定是远远不够的!不仅…

Pandas加载大数据集

Scaling to large datasets — pandas 2.1.4 documentationhttps://pandas.pydata.org/docs/user_guide/scale.html#use-efficient-datatypes官方文档提供了4种方法:只加载需要的列、转化数据类型、使用chunking(转化文件存储格式)、使用Dask…

山海鲸:助力企业实现内外数据整合与价值挖掘

作为山海鲸的开发者,我们深知数字化转型对于企业发展的重要性。在不断钻研如何提升山海鲸可视化这款免费产品的实用性同时,也在不断推出各行实用解决方案,本文将介绍山海鲸企业数字化转型发展解决方案,探讨如何通过数据驱动创新&a…

类和对象特性

#include<iostream> #include<string> using namespace std; class peron{ public:peron(string person){cout << "peron调用构造函数" << endl;tperson person;}~peron(){cout << "peron调用析构函数" << endl;}//手…

compose部署

目录 本章目标&#xff1a; 自定义网络数据库 正文&#xff1a; 注&#xff1a;创建两个网络mynet和mynetwork 1. 自定义网络-mynet 创建自定义网络&#xff1a; docker network create --subnet172.33.0.0/16 mynet 查看网络信息 docker network list 查看指定网络的详细信…

电脑提示“ureg.dll文件丢失”解决方法,ureg.dll文件下载修复安装教程

ureg.dll是Windows操作系统中的一个动态链接库文件&#xff0c;主要与Microsoft Office软件相关&#xff0c;它基本上是为了支持和启动与Office相关的程序和功能。 如果ureg.dll文件丢失或损坏&#xff0c;可能会导致与Microsoft Office相关的程序或功能无法正常工作。对于用户…