优化sql“使用ismember选择来自查询”

时间:2014-07-22 00:02:03

标签: tsql query-optimization

我有一个查询,当"检查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'

1 个答案:

答案 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上设置索引以加快速度可能也很有用。