多维SSAS Cube中跨多维度生成自定义计算属性的实现方案咨询
方案可行性评估
你提出的通过CROSS JOIN三个维度生成新维度DimNew的方案完全可行:100×100×100的维度量级仅100万行,对SSAS多维模型来说完全没有性能压力,而且符合维度建模规范,后续如果DimA/DimB的DimName发生变更,只需要重刷DimNew的ETL即可,无需修改事实表,适合需要长期使用NewAttr做切片、下钻、聚合分析的场景。
你提到的第二种直接在事实表存储NewAttr的方案仅适合临时需求,正式环境不推荐:维度属性变更时需要全量刷写事实表,维护成本极高,且容易出现同一维度组合对应不同NewAttr值的数据不一致问题。
更优实现方案(按需选择)
根据你的使用场景,可以选择成本更低的实现方式,无需改动底层ETL流程:
场景1:NewAttr仅用于结果展示,不需要切片/分组/筛选
直接在Cube中创建MDX计算成员即可,5分钟即可完成配置,零底层改动:
CREATE MEMBER CURRENTCUBE.[Measures].[NewAttr] AS CASE WHEN [DimC].[DimId].CurrentMember.MEMBER_VALUE IN (1,2,3) THEN "A " + [DimA].[DimName].CurrentMember.MEMBER_CAPTION WHEN [DimC].[DimId].CurrentMember.MEMBER_VALUE IN (4,5,6) THEN "B " + [DimB].[DimName].CurrentMember.MEMBER_CAPTION ELSE "" END, VISIBLE = 1;
- 优点:无额外开发成本,上线速度快
- 缺点:查询性能略低于物理属性,不支持作为维度字段做切片、聚合操作
场景2:需要用NewAttr做切片/分组/筛选,不想改动底层库表结构
用SSAS数据源视图(DSV)的命名计算+事实退化维度方案实现:
- 在SSAS的DSV中,找到关联了DimA、DimB、DimC的事实表查询,新增命名计算
NewAttr,表达式如下:
CASE WHEN DimC.DimId IN (1,2,3) THEN 'A ' + DimA.DimName WHEN DimC.DimId IN (4,5,6) THEN 'B ' + DimB.DimName END
- 在Cube的事实维度(退化维度)中新增
NewAttr属性,设置为可聚合、可筛选即可
- 优点:不需要修改底层数据库表结构,也不需要新增独立维度,查询性能和物理维度属性一致,支持所有维度操作
- 缺点:如果三个维度是SCD慢变维度,需要确认关联逻辑适配历史版本的属性取值
场景3:后续需要扩展NewAttr相关的更多属性
就采用你原本的新建DimNew维度的方案即可,扩展性最好,后续新增规则只需要修改DimNew的ETL逻辑,不需要改动Cube结构。
内容的提问来源于stack exchange,提问作者SKK
相关产品推荐
相关产品推荐

