【发布时间】:2011-06-28 15:32:42
【问题描述】:
当我在 Member_Contact_Edges 表中几乎有 500 行时,此查询工作得非常好并且快速完成。但是现在,我在这个表中有近 1.000 行,这个查询需要 20-30 秒才能完成。我无法弄清楚问题出在哪里。我尝试了聚集和非聚集索引。我尝试了每种索引组合,但都没有成功。
;WITH transitive_closure(member_a, member_b, distance, path_string) AS
(SELECT member_a, member_b, 1 AS distance, CAST(member_a as varchar(MAX)) + '.' + CAST(member_b as varchar(MAX)) + '.' AS path_string
FROM Member_Contact_Edges
WHERE member_a = @source AND contact_durum=1 -- source
UNION ALL
SELECT tc.member_a, e.member_b, tc.distance + 1, CAST(tc.path_string as varchar(MAX)) + CAST(e.member_b as varchar(MAX)) + '.' AS path_string
FROM Member_Contact_Edges AS e
JOIN transitive_closure AS tc ON e.member_a = tc.member_b
WHERE tc.path_string NOT LIKE '%' + CAST(e.member_b as varchar(MAX)) + '.%' AND e.contact_durum=1
)
SELECT distance, path_string FROM transitive_closure
WHERE member_b=@target AND distance <= 3 -- destination
ORDER BY member_a, member_b, distance;
这就是我所说的存储过程:
Exec Contacts_KacinciDerece @source = 30284, @target=24688
输出:(这是我所期望的,这个查询创建了这个)
谢谢。
【问题讨论】:
-
在递归 CTE(这就是您在此处所拥有的)中,将源表中的记录数加倍可能会导致处理时间呈指数增长,因为它是针对自身进行评估的。将行数加倍意味着它正在比较 3 倍的行数(500*500 与 1000*1000)
-
更正 - 行数的 4 倍,250k vs 1m
标签: sql-server optimization transactions performance