SID --代理键 surrogate ID它是来管理主数据的,这个我觉得是翻译成代理键。ADSO是用来放交易数据的。交易数据里的主数据是以代理键展示的。
但是这个SID的德文意思,其实是主数据识别ID。就像ABAP的德文意思是 通用报表合并处理器。只不过后来都重新写成英文。
为啥要有这个SID?
那就回到最开始的雪花模型,是为了主数据的复用。
也就是和星型模型不一样的地方,主数据不是在维度表里。通过使用SID表关联主数据表来达到主数据和SID分离,而且可以重复多次使用主数据表的目的。
BW会集中管理信息对象主数据。相对于描述性的主数据,直接用代理键在query里,处理起来就会更快。就算现在在HANA里用了列式存储,也一样要用SID。讲到Query,就要讲query的运行时runtime,这个是OLAP engine那的,它就是靠SID来增速的。
SID在什么时候生成?
RSODSO_SETTINGS:最开始SID生成是有三个地方,都在DSO里面设置。
1. 在跑报表的时候生成,那万一没这个SID就得用报表的时间去立马找。
2. 激活的时候生成。对报表没影响。
3.不生成,也就是你这个DSO不用来出报表,不能被加到infoprovider里。
以前呢,都是在DSO里面弄。那么现在ADSO了,在哪里弄呢?
在它的details的每个字段下面。
被检查的这个字段,必须是有主数据的。要不你啥都没有,只做属性或者高基数,那没得检查。
field没得检查,只有带主数据的infoobject,有主数据表的才能检查。field用在报表里还是有些限制的,我还没去研究。
默认都是激活的时候检查。也就是检查你没有SID,就给你生成。还有个选项是去persist SID给你保存在数据模型里多加一列。
这可能就像infocube了,cube以前是有SID的表的。现在ADSO都不管理SID了,那SID表在哪里了?我去跑报表的时候,实际上难道是去用join去拿SID表的对应主数据么?那这个join不是每个主数据都得去join,那还怎么优化报表性能?
这个Persist SID就是在ADSO表保存信息对象的SID,在激活表里多加一列INT4的列。激活的时候,这个列就被填充。为啥是INT4,因为SID就是个INT4的类型。当然跟那些动不动char 10的比快多了。
在什么情况下persist SID ?
1. ADSO 有大量数据,超过1亿条。
2. 有个高基数的核心信息对象。
3.有个核心信息对象有频繁访问的导航属性。
4.核心信息对象有复杂的层级。
5.核心信息对象是另一个信息对象的组件。
好了,到这里,正好我有个ADSO里有成本中心,带了N个导航属性,那我就直接去把成本中心改成保有SID了么?感觉能瞬间提升不少报表性能。
但是实际上要多加考虑。如果你这个ADSO是空的。那怎么改没问题。问题就在,它有数据了。那就得做remodeling 重构了。
而且主数据的删除是一个大难题,因为你这个主数据可以被用在很多个ADSO里面,你删了一条,那对应的SID也就没意义了。但是你这个主数据在被人家用着,那你就删不掉了。
层级会有自己的SID,层级加载的时候就会生成SID。
但是文本不会有SID。
随便当一个datapackage处理的时候,会有检查每个key的SID是不是存在了,如果没有,那就必须得生成一个。
从下面这个图就能看到,SID表是自己的。在别处ADSO请求激活的时候会生成自己的SID。自己有层级加载的时候也会生成SID表,自己被别人用作导航属性且别人数据加载的时候会生成SID。
Master Data View是包括自己的时间相关和非时间相关的所有属性。一般咱用表,也就用这个M。
其次P表是所有非时间相关属性。Q表所有跟时间相关的属性。
X表是所有非时间相关的导航属性的SID。
Y表所有时间相关的导航属性的SID。在主数据加载的时候就会给所有的导航属性创建SID。
纯展示属性会在CP用到join的时候生成,第一次使用的时候生成。但是在主数据里没有这个纯展示属性的SID。
层级加载会创建SID。
CHCKFL,DATAFL,INCLFL啥意思
这三个就是SID在哪里被用到了。也就是被lock了。为了保证数据一致性。
CHCKFL,你这个主数据表的对象被其他对象用了。
DATAFL,其他的ADSO用了,或者infoprovider用了。
INCLFL,其他的层级用了。
主数据删除
那怎么才能删?那就是selective deletion删了,删除不要的。前提是你去源系统看了哪些是在用的,哪些是不用的啊。只能删除不用的。
或者就是delete master data,会删掉没被锁的。
也就是X--这种的。删的时候选WITH SIDs。
F4 Help
--待续
维度表和SID表的外键关联
--待续