【发布时间】:2017-03-20 13:53:11
【问题描述】:
我们在 SSAS 多维数据集中实现了动态安全性。我们使用的是 SQL Server 2012。
有一个员工维度具有以下层次结构(不是父子级)
Region
Corporation
Department
Team
Employee
我们有一个桥接表,在我们的用户表和员工表之间定义了度量 [User Employee Access Count]。
在 Cube Dimension Employee 上,在 Team hierachy 中,我们有以下 MDX 用于允许集。
NONEMPTY
(
[Employees].[Team].[All].Children,
(
StrToMember("[User].[Username].&["+coalesceempty(customdata(),username)+"]"),
[Measures].[User Employee Access Count]
)
)
这是我发现的实现动态安全的默认方式,并且有效。
问题是当用户第一次访问多维数据集时会有很长的延迟。 Employee 维度大约有 40.000 个成员,当我在查询中使用它时,MDX 大约需要 2-3 秒才能运行,但是当用户第一次登录 int 时,如果她有权访问大多数或所有员工,则第一个查询在完成之前最多挂起 90 秒。
查询是什么并不重要,后续查询不会影响性能。
我的猜测是 SSAS 使用时间来构建内部安全结构。 就像我说的那样,当我将上述 MDX 定义为 MDX 查询中的一个集合并在 SSMS 中运行它时,即使用户可以访问 40.000 个维度成员,也需要 2-3 秒才能返回所有行,这包括开销通过 SSMS 打印出所有行。
我已经尝试过组合安全设置。大多数用户只能访问一小部分员工,他们的延迟不到 30 秒,这很慢,但可以接受,所以我们尝试为可以访问许多员工的用户创建一个组,然后拒绝成员集,但管理繁琐,首次登录时仍会遇到高延迟。
目前,我已经设置了一个作业,它遍历具有最高延迟的用户和最频繁的用户,并且每 30 分钟对多维数据集执行一次简单的 MDX 查询。这预热了动态安全性,并将对用户的影响降至最低,但有时他们仍然需要等待首次登录,理想情况下我希望消除首次查询延迟。
是否有人在大维度和大量报表用户的环境中具有动态安全经验?
【问题讨论】:
-
顺便说一句 - 存在“customdata()”是因为有时用户通过以服务用户身份登录的自定义组件访问多维数据集,但包含用户名作为自定义数据。
-
如果我理解您限制了用户可以看到的团队。对团队 1 和部门 1 具有权限的用户是否可以查看部门 2 的部门总数但看不到其他团队的团队总数?如果他们查看部门 1 的总数,它应该只显示团队 1 的总数还是部门 1 中所有团队的总数?我之所以问,是因为我怀疑取消选中角色中维度数据安全选项卡中的 Visual Totals 框可能会提高一些性能。如果能满足您的要求,值得一试。
标签: sql-server dynamic ssas mdx