首页 > 代码库 > 慎用SSAS服务端动态命名集

慎用SSAS服务端动态命名集

SSAS里的动态命名集(Named Set)在项目中会经常用到,常用的函数如TopCount, Filter, Exists等,但有些能设置为静态命名集,有些则不能,例如TopCount如果设置成Static Set就没多大意义了,今天解决个Excel访问SSAS的性能问题和此有关,之前有个项目在support阶段每次使用excel访问ssas首次创建pivot table都要花费近20秒的时间,实在忍无可忍才着手排查原因,首先使用profiler捕捉到性能瓶颈如下图

发现在每次新建pivot table时,服务器会要查询MDSCHEMA_SETS动态视图,接着尝试到SSAS服务器上查询$system.mdschema_sets看看里面的内容,新建DMX查询窗口,输入select * from $system.mdschema_sets后F5, 果不其然,这个查询执行了20秒,只查出了5条记录,正好就是cube里设计进去的5个Dynamic Sets, 其中一个是[Top 100 Account By Sales]取消费排行前百名的会员,而会员维度是个大型维度,有上千万笔记录。

由此得出结论,在新建pivot table时,服务端会自动计算一次系统里所有的Dynamic Set, 因为是Dynamic的,从上图也看到,即使是有Cache存在也是会重新做一次查询的。

现在的解决方案是把这些服务端的Dynamic Sets都删掉,以后如果需要用到这些功能,在Excel客户端也是可以实现的,举例如下

新建一个客户端命名集

然后就可以在相应的维度下面找到这个命名集

用法和服务端的命名集完全一致,唯一麻烦的就是需要在每个终端用户的客户端上创建这个mdx named set

 

慎用SSAS服务端动态命名集