QlikView装载数据时,如果有两个或以上表中存在两个或以上相同的字段时就会自动产生组合键。
组合键实际上是产生了表间的多对多关系,这种关系逻辑上可能是对的。组合键会引起QlikView性能隐患,存储所有出现的组合值,在数据量很大时会消耗太多的内存。组合键越多Qlikview的运行性能下降越厉害,百万级数据量情况下如果4-5个组合键,系统可能运行都成问题。
如何处理出现的组合键呢?
Case1:源数据表中组合的字段并不具有逻辑的组合含义,采用重命名方式解决
例如:
订单:
Load
订单号,订单日期,订单金额,操作员,操作时间
From Db.Sales;
订单明细:
Load
订单号,产品号,产品数量,产品单价,操作员,操作时间
From Db.SalesDetails;
如果QlikView直接装载会产生“订单号、操作员,操作时间”这三个字段的组合键。再细看一下,订单和订单明细表中都有操作员、操作时间两个字段,而这两个字段对没有逻辑上的关联,因此可以Rename该字段名称。
修改如下:
订单:
Load
订单号,订单日期,订单金额,操作员 as订单_操作员,操作时间 as订单_操作时间
From Db.Sales;
订单明细:
Load
订单号,产品号,产品数量,产品单价,操作员 as 订单明细_操作员,操作时间as 订单明细_操作时间From Db.SalesDetails;
如果重复的字段较多,则可以采用Qualify关键字。写法如下:
Qualify 操作员,操作时间;
订单:
Load
订单号,订单日期,订单金额,操作员,操作时间
From Db.Sales;
订单明细:
Load
订单号,产品号,产品数量,产品单价,操作员,操作时间
From Db.SalesDetails;
或者
Qualify *;
订单:
Load
订单号,订单日期,订单金额,操作员,操作时间
From Db.Sales;
订单明细:
Load
订单号,产品号,产品数量,产品单价,操作员,操作时间
From Db.SalesDetails;
Unqualify *;
Qualify关键字支持?,*等通配符。
Case2:源数据中逻辑上存在多对多的组合键,可以采用创建Key进行处理
例如:
订单明细:
Load
订单号,产品号,产品数量,产品单价,操作员,操作时间
From Db.SalesDetails;
采购单:
订单号,产品号,销售商号,采购时间,采购数量,采购单价
From Db.Supply;
“订单号,产品号”在订单明细和采购单两表中逻辑上存在多对多关系,这时可以采用创建一个新的键值来表示:
订单明细:
Load
订单号,产品号,
订单号&’-’&产品号 as SupplyKey,
产品数量,产品单价,操作员,操作时间
From Db.SalesDetails;
采购单:
订单号&’-’&产品号 as SupplyKey,
,销售商号,采购时间,采购数量,采购单价
From Db.Supply;
有时组合键很长,这样也会多耗费Qv的内存,可以进一步优化:
AutoNumber(订单号&’-’&产品号) as SupplyKey产生组合键值
AutoNumber会根据“订单号&’-’&产品号”不同产生唯一的数值。该函数的缺点就是不能用于增量数据装载的环境中,因为AutoNumber每次装载会重新编号。
要解决这个问题,Qv8提供了Hash128()函数,写法如下:
Hash128(订单号&’-’&产品号) as SupplyKey
Case2:源数据中逻辑上存在多对多的组合键,组合字段较多,可以采用合并大表的方式解决
例如:
XXX:
Load
A,B,C,D,E,F
From Db.xxx;
YYY:
Load
A,B,C,D,H,I
From Db.YYYY;
XXX和YYY表中都有A,B,C,D字段,可以考虑组合成大表的方式解决,采用Concatenate关键字:
XXX:
Load
A,B,C,D,E,F
From Db.xxx;
Concatenate
Load
A,B,C,D,H,I
From Db.YYYY;