我有一个查询,当"检查is_member"与仅加载整个数据集相比。此视图充当安全检查,它检查您是否是特定组的成员 - 即组1,然后下一列将说明它具有哪些访问权限 - 即分区2。 然后,此视图与Fact表连接,以便它只检索2行。
问题是,is_member是否为Fact数据的每一行执行?只是我的理论,因为没有这个视图它运行速度快1000倍。如果有人能提出替代结构吗?
WITH group_security AS (SELECT DISTINCT division_cod FROM dbo.dim_group_security_division AS gsd
WHERE (IS_MEMBER(group_name) = 1))
SELECT dbo.dim_division.dim_division_key, dbo.dim_division.division_ID, dbo.dim_division.division_code, dbo.dim_division.division_name
FROM dbo.dim_division INNER JOIN
group_security ON dbo.dim_division.division_code = group_security.division_code OR group_security.division_code = 'ALL'
答案 0 :(得分:0)
自JOIN
dbo.dim_division.division_code
以来,您对此列有索引吗?
或者你可以尝试一下:
SELECT dim.dim_division_key,
dim.division_ID,
dim.division_code,
dim.division_name
FROM dim_division dim
WHERE EXISTS ( SELECT *
FROM dbo.dim_group_security_division gsd
WHERE gsd.division_code IN ('ALL', dim.division_code)
AND IS_MEMBER(gsd.group_name) = 1 )
这样,系统可以在dim_group_security_division
的第一个“匹配”处停止,而不必查找全部,然后由于DISTINCT而聚合结果。
在这种情况下,在gsd.division_code
上设置索引以加快速度可能也很有用。