我经常需要在QlikView中一次性从SAP Business Warehouse(BW)中提取数月和数月的数据,为此我使用QlikView自己的SAP OLAP Connector。
我决定将它们放在for-next循环中,如下所示,而不是只有月份和年份参数更改的同一SAP Connector脚本的无限重复:
CUSTOM CONNECT TO "Provider=QvSAPOLAPConnector.dll;MSHOST=server1;R3NAME=SBW;GROUP=;CLIENT=100;Log=1;XUserId=ABCDEFG;XPassword=ABCDEFG;";
FOR Month = 1 TO 12
LET MonthValue = date(addmonths(StartDate, $(Month) - 1),'YYYYMM');
MyData:
LOAD
*;
SELECT
PseudoMDX D (
Dimensions (
[0MATERIAL] (),
[0SALESORG] ()
),
Measures (
[4VHMY6XTAN8117F8FC78GMG72].[4VHMY7D6CKFG2GI4R0BX0QDMM], // Sales
),
Variables (
[S_CALM_N] (I = [0CALMONTH].[$(MonthValue)])
),
From (CUBE01/QUERY01));
NEXT
现在,这适用于相对较小的结果集,因为内存要求在合理的限制范围内(我监视QlikView连接器qvconnect.exe
/ qvconnect64.exe
- 64位)。
但是,我发现如果你运行了大量的循环,即使你没有在每个循环中返回很多行,QlikView也会经常停止加载"内存不足"信息。
如果不使用单独脚本的单独文档,我该如何避免这种情况发生?
答案 0 :(得分:0)
这样做的原因是qvconnect.exe
/ qvconnect64.exe
似乎不在循环(或实际上PseudoMDX
语句)之间进行垃圾收集,因此其内存占用将稳定增加,直到你的循环/脚本完成或你的机器内存不足。
我不确定为什么该进程拒绝放弃其内存,也许它正在尝试缓存一些维度值以供以后使用。我个人看到几个服务器作业失败,因为qvconnect.exe
决定吃掉所有10GiB的内存!
我找不到关于这个主题的任何官方文档,但简单的解决方案是在循环中移动CUSTOM CONNECT
语句:
FOR Month = 1 TO 12
LET MonthValue = date(addmonths(StartDate, $(Month) - 1),'YYYYMM');
CUSTOM CONNECT TO "Provider=QvSAPOLAPConnector.dll;MSHOST=server1;R3NAME=SBW;GROUP=;CLIENT=100;Log=1;XUserId=ABCDEFG;XPassword=ABCDEFG;";
MyData:
LOAD
*;
SELECT
PseudoMDX D (
Dimensions (
[0MATERIAL] (),
[0SALESORG] ()
),
Measures (
[4VHMY6XTAN8117F8FC78GMG72].[4VHMY7D6CKFG2GI4R0BX0QDMM], // Sales
),
Variables (
[S_CALM_N] (I = [0CALMONTH].[$(MonthValue)])
),
From (CUBE01/QUERY01));
NEXT
在循环执行时观察qvconnect.exe
的内存占用量,表明在从SAP BW返回数据时内存使用量增加,但在下一个循环周期开始时将释放。