点击此处---> 群内免费提供SAP练习系统(在群公告中)
加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)
这是一个新话题,可以继续进行讨论
当前需要在两个巨大的事实表之间进行联接。 如果在HANA上即时执行连接,则性能会降低,HANA有时会崩溃。
因此,存储过程将数据分块,然后对较小的分块执行联接,然后将结果转储到物理表中。 分块效率低下,但数据插入量甚至更多。 大部分时间花费在增量合并(数据插入)中。
这是代码
基本上,有两个表Table_A和Table_B,并从中创建一个分析视图。
我们从Table_A的分析视图中选择2个时间戳之间的数据
在一个循环中,我们联接来自Table_A和Table_B的数据
并将结果转储到物理表中。
可以做什么来优化。
不幸的是,我似乎无法像
那样将while循环的结果保存在内存中A =联合(while循环的结果)
创建过程CPM_SAP.SP_ZZFSL_CE11_REV_JOIN_V4
(在MIN_TIMESTAMP NVARCHAR(14)中,在MAX_TIMESTAMP NVARCHAR(14)中,在MIN_PERIOD NVARCHAR(6)中,在MAX_PERIOD NVARCHAR(6)中)
MIN_PERIOD;
XYEAR INT:= 0;
XMONTH INT:= 0; BEGINVAR_Z_NAME_OBSCURED =选择" RYEAR"," RTCUR"," RUNIT"," POPER"," RBUKRS"," RACCT"," RCNTR" ," RPRCTR"," RZZSITE"," RZZPOSID"," RZZFKBER"," DOCTY"," REFDOCNR"," AUFNR"," ZZLDGRP"," VBUND"," ZZBUZEI"," AWORG"," CPUDT" "," CPUTM",
" ZZBUZEI_RPOSN"," PERIOD_ID"," TIMESTAMP",
" TSL" AS" TSL"," HSL" AS" HSL"," KSL" AS" KSL"," MSL " AS" MSL"
FROM" _SYS_BIC"。" wlclose/AN_Z_NAME_OBSCURED_REV_KSLNN"
其中" TIMESTAMP">:MIN_TIMESTAMP和" TIMESTAMP" <=:MAX_TIMESTAMP; WHILE:XPERIOD <=:MAX_PERIOD DO VAR1_Z_NAME = ," RTCUR"," RUNIT"," POPER"," RBUKRS"," RACCT"," RCNTR"," RPRCTR"," RZZSITE"," RZZPOSID"," RZZFKBER"," DOCTY"," REFDOCNR"," AUFNR"," ZZLDGRP"," VBUND"," ZZBUZEI"," AWORG", " CPUDT"," CPUTM",
" ZZBUZEI_RPOSN"," PERIOD_ID"," TIMESTAMP",
" TSL" AS" TSL"," HSL" AS" HSL"," KSL" AS" KSL", " MSL" AS" MSL"
FROM:VAR_Z_NAME_OBSCURED
其中" PERIOD_ID" = CAST(:XPERIOD AS VARCHAR(6)); VAR_CE11000 =选择" PALEDGER"," KSTAR"," PERIOD_ID"," BUKRS"," COPA_AWORG"," ZZBUZEI_RPOSN"," RBELN"," PERIO",
" GJAHR"," PERDE"," RPOSN", " PRCTR"," PPRCTR"," SKOST"," RKAUFNR"," KURSF"," VV005_ME"," VV006_ME"," WW004"," WW011"," WW012"," WW013",
" WW008" ," WW023"," WW010"," WW020"," WW015"," WW006"," WW024"," WW026"," VV005" AS" VV005"," VV006" AS" VV006"来自" _SYS_BIC "。" wlclose/AN_CE11000_REV_LDG01"
其中" PERIOD_ID" = CAST(:XPERIOD AS VARCHAR(6)); VAR_JOIN =选择Z.RACCT AS RACCT,Z.RBUKRS AS RBUKRS,Z。" PERIOD_ID" AS ZPERIOD,Z 。" AWORG"作为AWORG,Z。" ZZBUZEI",Z。" REFDOCNR"作为REFDOCNR,Z。" RCNTR"作为RCNTR,Z。" RPRCTR"作为RPRCTR,Z。" RZZSITE"作为RZZSITE,Z。 " RZZPOSID" AS RZZPOSID,Z。" RZZFKBER" AS RZZFKBER,Z。" DOCTY" AS DOCTY,Z。" AUFNR" AS AUFNR,Z。" ZZLDGRP" AS ZZLDGRP,Z。" VBUND" AS VBUND,< br> Z。" TIMESTAMP"作为时间戳,Z。" RYEAR"作为RYEAR,Z。" POPER"作为POPER,Z。" TSL"作为TSL,Z。" HSL"作为HSL,Z。" RTCUR"作为RTCUR, Z." KSL" AS KSL,Z。" MSL" AS MSL,Z。" RUNIT" AS RUNIT,C。 " PALEDGER" AS PALEDGER,C。" KSTAR" AS KSTAR,C。" BUKRS" AS BUKRS,C。" PERIOD_ID" AS CPERIOD,C。" COPA_AWORG" AS COPA_AWORG,C。" RBELN" AS RBELN,C 。" ZZBUZEI_RPOSN" AS RPOSN,C。" WW004" AS WW004,C。" WW011" as WW011,C." WW012" AS WW012," WW013" AS WW013,C。" WW008" AS WW008,C. " WW023" AS WW023,C." WW010" AS WW010,C." WW020" AS WW020,C." WW015" AS WW015,C." WW006" AS WW006,C." VV005" AS VV005,C 。" VV005_ME" AS VV005_ME,C。" VV006" AS VV006,C." VV006_ME" AS VV006_ME
从:VAR1_Z_NAME_OBSCURED Z
左外连接:VAR_CE11000 C在Z." ZZBUZEI_RPOSN" = C。" ZZBUZEI_RPOSN"和
Z." REFDOCNR" = C。" RBELN"和
Z." AWORG" = C。" COPA_AWORG"和
Z." RBUKRS" = C。" BUKRS " AND
Z." PERIOD_ID" = C。" PERIOD_ID" AND
Z.RACCT = C.KSTAR;
插入CPM_SAP.ZZFSL_CE11_REV_JOIN(选择*来自:VAR_JOIN); XYEAR:=(:XPERIOD/100);
XMONTH:=:XPERI OD-(:XYEAR * 100); IF:XMONTH = 12XPERIOD时:=((:XYEAR + 1)* 100)+1;
ELSE
XPERIOD:=:XPERIOD +1 ;
END IF; END WHILE;
END;
我很抱歉,因为我不在乎翻阅代码并弄清楚到底发生了什么。 因此,完全承认我的无知,我不得不问-
如果您想合并两个事实表,为什么不在现场执行"具有恒定值的联合"(UCV)- 飞? 如果您不熟悉此方法,则可以在Werner上将其记录在案(幻灯片15): http://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/6056911a-07cc-2e10-7a8a-ffa9b8cf579c?QuickLink = index&overridelayout = true&52415780970082
如果两个事实表的共享尺寸都不完全相同,有时您仍可以构建具有所需尺寸的中间表 ,将其加入事实表-然后执行UCV。
同意-
Rajarshi,如果您可以提供非常简化的方案版本,并且仅包含必需的逻辑,那么您很有可能会获得最有用的反馈。
SCN并不是按需代码审查的地方。 ????
我遇到这样的情况:一个表具有字段A,B,C,而另一个表具有C。C是最低的混合度(我想说层次结构中的叶子,但它并不总是严格的层次结构关系)。
在这种情况下,在SQLScript中,可以从表A创建A,B,C的中间表(考虑到HANA的列结构,这是高效的),将其连接到第二个表-UCV很容易。
通常我发现这种方法通常适用于乍一看使其看起来像是两个事实表之间的联接是唯一的选择的情况。
(自从我不得不写任何形式的证明以来已经很长时间了,但是有件事告诉我,一个人应该能够以数学方式证明,如果您要合并两个事实表,那么一个人可以只加入不同的维度 将每个表都放到某个中间表中,然后再将其连接到每个事实表中,然后再添加到UCV中。)
是否还可以粘贴表DDL以及一些我们可能会爆炸的示例数据 进入一个大数据集? 桌子多大? 联接的性能如何以及该过程的时间安排?
这是HANA面临的一个相当典型的挑战。 一些评论:
-令我吃惊的是,不能使视图表现良好
-CE函数通常会提高此类代码的性能
-即便如此,如果有很多行,您的插入成本将是巨大的-您应该最多能够获得100万行/秒
-考虑按TIMESTAMP/PERIOD对目标表进行分区 这样您的MERGE DELTA不会影响已经存储的数据。 这将大大提高INSERT/MERGE DELTA的性能
-您需要嵌套SQLScript函数,以便SELECT语句中没有标量。 该代码将全部在单个线程中运行,这无济于事
John
我们有一个对帐过程,在该过程中,我使用带有常量的UNION,因为我们需要连队,期间,racct和所有5个度量。 但是由于联接字段是最终报告中使用的唯一字段,因此我能够进行联合(技巧是为值1或0附加一个列)以得到与左外部联接相同的结果。
但是在另一个过程中,我们需要两个表在同一行中标注和度量,因此用常数进行并集是不够的。
John A:这是一个创建于2012年3月的过程,尽管它的速度很慢,并且在HANA上有很多改进,但我从来没有改变过它,除了稍微更优化的SP(在较小的SP时使用) 可以运行增量,但是当从2011年至今使用该增量时,将使用此SP。
我可以在电子邮件中与模型元数据一起与您共享乱码。 让我知道 。 我的邮件是Accenture dot com上的rajarshi dot muhuri
每个人都是正确的,但我们不在同一页上,但我更同意Ravi。 因此,我举一个简单的例子,我同意乔迪(Jody)的说法。 我也知道UCV,但不熟悉缩写词。 ????
我们都喜欢汽车!!
表:经销店的汽车销售量
表:经销的经销汽车数量
经典的内部加入将是
带有常量的联合(集中在sql内部联接的第三行):
我希望它们成一行,但是尺寸不一样,它们会分成两排。 所以不可接受。
但是,如果我需要仅包含连接列的尺寸的输出,那么我会得到所需的结果。 (我也可以使用标记技巧来模拟左右联接)
因此,总而言之,并回到我原来的问题,需求的本质是我不能做太多过滤,但需要做的是留下大量外部联接。
这就是为什么我使用SP将数据分块提升,合并并吐到物理表的原因。 在2013年8月至2013年11月之间采集数据时,它的性能相对较好。 从2011年至2013年运行时,需要50分钟。
很久以来,我一直在看John Appleby的博客,并提出了两个想法
1。 分区表
2。 关闭增量合并并在退出SP时手动合并数据。
不幸的是,我在DEV中进行了测试,那里的数据集很小。 在DEV中,没有Johns Ideas的SP花费了2分钟,而在John的想法下,SP花费了相同或什至几纳秒。
我敢肯定,如果有机会在我们拥有大量数据的PROD中实现它,他的想法的真正优势就会到来。 但是,由于我早在2年前就实施了该协议,并且可以正常工作,因此我不允许对其进行调整,以免出现问题????
如果您在工会之后放一个集结子怎么办
您好,
实际上是SAP HANA中DB开发的一种典型情况。
有些大表与其他大表和/或信息结合在一起 模型(在这种情况下为分析视图),它们应该产生较大的联合结果集。
这里忽略了一个关键点:要获得超短的响应时间,绝对需要减少响应量。 数据尽早处理。
此联接结果的使用场景很可能是进一步的分析步骤-而不是纯列表输出。
如果这是 情况下,则需要适当创建模型。 在大多数情况下,"一种模型适合所有报告"的方法不会带来令人满意的结果。
要真正提高您的设计性能,请让我们知道报告/分析要求( s)您要解决。 基于此,可以创建一个或几个模型来容纳它们。
-Lars
一周热门 更多>