繁体   English   中英

使用 DAX 的 SSAS RLS 实施缓慢

[英]Slow SSAS RLS implementation with DAX

我已经发布了 my.pbix,效果很好,速度也不错。 我从 SSAS 消费。 现在,我已经引入了一些 RLS 安全措施,对于访问权限有限的人来说,速度非常慢……

我该如何解决这个问题?

我有3个角色。

角色 1:(每个人都可以访问):

远程学习系统

员工表: =[NT Username] = USERNAME()

项目表:

=[Key_Project] IN
SELECTCOLUMNS(
    FILTER(
        'Engagement Role'
        ,'Engagement Role'[UserName] = USERNAME()
        )
    ,"Key_project"
    ,'Engagement Role'[Key_project])

角色 2:(每个人都可以访问):

员工表:

=[TeamLeadEmployeeID] IN
SELECTCOLUMNS(
    FILTER(
        'Employee Current'
        ,'Employee Current'[NT UserName] = USERNAME()
    )
    ,"RLS_Ids"
    ,[Employee Number])

项目表:

= VAR MyEmployeeNumber=
SELECTCOLUMNS(
FILTER(
'Employee Current'
,'Employee Current'[NT Username]=USERNAME()
)
,"EmployeeNumber"
,'Employee Current'[Employee Number]
)


VAR My_Employees =
SELECTCOLUMNS(
    FILTER(
'Employee Current'
,'Employee Current'[TeamLeadEmployeeID] = MyEmployeeNumber
) ,"EmployeeNumber"
    ,'Employee Current'[Employee Number]
)

RETURN
[Key_project] IN
SELECTCOLUMNS(
    FILTER(
        'Engagement Role'
        ,'Engagement Role'[Employee Number] IN My_Employees
    )
    ,"Key_project"
    ,'Engagement Role'[Key_project]
)

(第三个角色并不重要,它没有过滤器是读取所有访问权限)。

如果可以避免,您不想以这种方式设置安全性。 以您的第一个示例为例——安全过滤器遍历“项目”表的每一行,因此它为表的每一行计算 SELECTEDCOLUMNS。 根据这些表的大小,这可能需要做很多额外的工作,并且完全回避了柱状 model 的优势。

您想要过滤实际上具有与其中的 USERNAME() 匹配的值的表,然后让该过滤器沿着现有关系在整个 model 中传播。

因此,对于 Role1,您不会为“项目”表构建 RLS 过滤器,您只会在“参与角色”上放置一个过滤器,它看起来就像是 [UserName] = USERNAME()

[Key_Projects] 上的“参与角色”和“项目”之间还需要存在关系。 关系的筛选方向应为 go,从“参与角色”到“项目”。

我认为您会发现它的性能要高得多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM