Tsql “优化sql”;使用ismember从查询中选择;

Tsql “优化sql”;使用ismember从查询中选择;,tsql,query-optimization,Tsql,Query Optimization,与只加载整个数据集相比,我有一个查询在“checking is_member”时运行得非常慢。此视图用作安全检查,它检查您是否是特定组(即组1)的成员,然后下一列将说明它具有什么访问权限(即分区2)。 然后,该视图与事实表联接,这样它将只检索第2部分的行 问题是,is_成员是否为每行事实数据执行?这只是我的理论,因为没有这个观点,它运行速度要快1000倍。如果有人能建议另一种结构 WITH group_security AS (SELECT DISTINCT division_cod FRO

与只加载整个数据集相比,我有一个查询在“checking is_member”时运行得非常慢。此视图用作安全检查,它检查您是否是特定组(即组1)的成员,然后下一列将说明它具有什么访问权限(即分区2)。 然后,该视图与事实表联接,这样它将只检索第2部分的行

问题是,is_成员是否为每行事实数据执行?这只是我的理论,因为没有这个观点,它运行速度要快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'

既然您在
dbo.dim\u division.division\u code
上加入了
JOIN
,那么您在该列上有索引吗

或者,您可以尝试一下:

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\u group\u security\u division
中的第一个“匹配”处停止,而不必查找全部,然后根据不同的结果汇总结果

在这种情况下,在
gsd.division\u code
上有一个索引可能也很有用,以加快速度