属性层级要不要建索引?默认值已经替你选了"要"

属性层级要不要建索引?默认值已经替你选了

一、它决定什么

AttributeHierarchyOptimizedState 的作用是:确定应用到属性层级上的优化级别。注意用词是"级别",不是"开关"——虽然实际取值只有两档,但设计意图是留出扩展余地。

项目说明
数据类型字符串(枚举)
默认值FullyOptimized
可选性0 到 1,可选且最多出现一次
父元素立方体属性(CubeAttribute)、维度属性(DimensionAttribute)

二、两个取值,一句区别

取值行为代价
FullyOptimized实例为该属性层级建立索引,以提升查询性能处理时间与存储开销增加
NotOptimized实例不额外建立索引查询可能变慢,但处理更轻

所以真正的选择不是"优化与否",而是"用处理时间和空间,换查询速度"。

默认值是 FullyOptimized,这一点值得记住:很多"处理很慢、存储占用大"的抱怨,根源是一堆从来没被用过、但都建了索引的属性。

三、什么时候该关掉

这里有个判断依据:属性层级是否真的被当作层级来用。典型情况:

  • 只用于筛选、从不做下钻的辅助属性,层级本身没意义,索引是纯浪费;
  • 基数极高的属性(如订单号、身份证号),建索引收益低、代价高;
  • 临时验证阶段的模型,先关掉换处理速度,定稿再开。

反过来,真正会被用户一层层展开浏览的层级(地区、品类、时间),保留默认的完全优化几乎没有争议。

四、两个父元素的差别

挂在维度属性下时,改的是维度层面的整体行为,影响所有引用它的立方体。

挂在立方体属性下时,只对当前立方体生效——同一个维度属性,可以在 A 立方体里优化、在 B 立方体里不优化。这个区分很实用:报表型立方体和探索型立方体,对查询性能的要求本来就不一样。

五、三个实操提醒

  1. 改配置要重新处理:优化级别影响的是实例构建的索引,改完不重处理,等于没改;
  2. 逐个属性评估,别整维度一刀切:一个维度里通常只有少数属性需要层级索引;
  3. 先量测再决定:关掉之后查询慢了多少、处理快了多少,用实际数据说话,别凭感觉。

一句话总结:默认值站在"性能优先"这一边,这在大多数分析场景是对的;但如果你有大量从不下钻的属性,它们正在悄悄消耗你的处理时间——这部分开销,值得主动收回来。