我们已经在我们的SSAS多维数据集中实现了动态安全性。我们使用的是SQL Server 2012。
存在以下层次结构的employee维度(不是父子维度)
Region
Corporation
Department
Team
Employee我们有一个桥接表,在User表和Employee表之间定义了度量用户员工访问计数。
在Cube Dimension Employee上,在团队层次结构中,我们有以下允许集的MDX。
NONEMPTY
(
[Employees].[Team].[All].Children,
(
StrToMember("[User].[Username].&["+coalesceempty(customdata(),username)+"]"),
[Measures].[User Employee Access Count]
)
)这是我发现的实现动态安全的默认方法,并且它是有效的。
问题是,当用户第一次访问多维数据集时,会有很长的延迟。Employee维度大约有40.000个成员,当我在查询中使用MDX时,MDX大约需要2-3秒才能运行,但是当用户第一次登录int时,如果她有权访问大多数或所有员工,第一个查询在完成之前会挂起90秒。
查询是什么并不重要,后续查询不会对性能造成影响。
我的猜测是,SSAS使用时间来构建内部安全结构。正如我所说的,当我在MDX查询中将上述MDX定义为一个集合,并在SSMS中运行它时,返回所有行需要2-3秒,即使用户有权访问40.000个维度成员,这还包括SSMS打印所有行的开销。
我已经尝试做了一个安全设置的组合。大多数用户只能访问一小部分员工,并且他们的延迟不到30秒,这很慢,但还可以接受,所以我们尝试为访问许多员工的用户创建一个组,并只创建一个拒绝成员集,但管理很麻烦,我们在第一次登录时仍然会遇到很高的延迟。
目前,我已经设置了一个作业,该作业遍历延迟最高的用户和最频繁的用户,并且每隔30分钟对多维数据集执行一次简单的MDX查询。这提高了动态安全性,并最大限度地减少了对用户的影响,但有时他们仍然需要等待第一次登录,理想情况下,我希望消除第一次查询延迟。
有没有人有在大维度和大量报表用户的环境中使用动态安全的经验?
发布于 2017-03-21 15:50:03
NonEmpty()是一种计算,当它涉及到很大的维度时,它的成本很高,并且你必须每次都运行,这是不好的。如何在维度表中存储集合列?像这样:
|=======================================================|
|UserID | UserName | EmployeesSet |
|=======================================================|
| 1 | Adam B | {[Employees].[Employees].&[Adamb]} |
|=======================================================|然后,您可以将其作为键值导入,并使用StrToSet()来解析它,而不是运行NonEmpty()函数。
https://stackoverflow.com/questions/42905426
复制相似问题