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