SQL Server 2016:如何识别SSAS多维数据集未使用的聚合?
如何识别SSAS多维数据集上未被使用的聚合
针对你在SQL Server 2016中排查SSAS多维数据集未使用聚合的需求,我整理了几个可行的方法,结合你提到的DMV来整合出完整的未使用聚合清单:
方法一:关联两个DMV生成未使用聚合列表
你已经用到了$system.discover_object_activity和$system.discover_partition_stat,把这两个DMV关联起来就能直接筛选出未被命中的聚合。执行下面的MDX查询:
SELECT dps.database_name AS [数据库名称], dps.cube_name AS [多维数据集名称], dps.measure_group_name AS [度量组名称], dps.partition_name AS [分区名称], dps.aggregation_name AS [聚合名称], doa.hit_count AS [命中次数] FROM $system.discover_partition_stat dps LEFT JOIN $system.discover_object_activity doa ON dps.database_id = doa.database_id AND dps.object_id = doa.object_id AND dps.partition_id = doa.partition_id WHERE dps.aggregation_name IS NOT NULL -- 只筛选聚合对象 AND (doa.hit_count IS NULL OR doa.hit_count = 0) -- 命中次数为0或无记录(从未被使用) ORDER BY dps.cube_name, dps.measure_group_name, dps.partition_name;
这个查询会返回所有从未被查询命中的聚合,包括那些刚创建/处理后还没被访问过的聚合。
方法二:结合聚合处理状态补充验证
如果需要确认这些未使用的聚合是否处于有效状态(比如是否已经处理完成),可以在上面的查询中加入处理状态字段:
SELECT dps.database_name AS [数据库名称], dps.cube_name AS [多维数据集名称], dps.measure_group_name AS [度量组名称], dps.partition_name AS [分区名称], dps.aggregation_name AS [聚合名称], dps.process_state_desc AS [聚合处理状态], doa.hit_count AS [命中次数] FROM $system.discover_partition_stat dps LEFT JOIN $system.discover_object_activity doa ON dps.database_id = doa.database_id AND dps.object_id = doa.object_id AND dps.partition_id = doa.partition_id WHERE dps.aggregation_name IS NOT NULL AND (doa.hit_count IS NULL OR doa.hit_count = 0) ORDER BY dps.process_state_desc, dps.cube_name;
这里process_state_desc会显示聚合的处理状态(比如Processed、Unprocessed),你可以排除那些未处理的聚合,只关注已处理但未被使用的。
注意事项
$system.discover_object_activity中的数据是内存级别的统计,SSAS服务重启后会重置这些计数,所以建议在业务高峰周期结束后再查询,确保数据能覆盖足够的访问场景。- 如果某些聚合是近期新增的,可能还没被查询命中,建议先观察一段时间(比如1-2个业务周期)再判断是否属于未使用的聚合。
- 对于大型多维数据集,可能需要分数据库或分多维数据集查询,避免结果集过大。
内容的提问来源于stack exchange,提问作者shrutidec12
相关产品推荐
相关产品推荐

