首页 > 解决方案 > 查询三层表的 SQL 性能

问题描述

我有一张人员表,其中包括每个人的 ID 以及他们在工作层次结构中的 Boss 的 ID(最多 3 层)。例如,该表可能如下所示:

ID  BossID
1   NULL
2   1
3   1
4   1
5   2
6   3
7   3
8   2
9   3
10  NULL

所以 1 和 10 没有老板,1 是 2,3 和 4 的老板。2 是 5 和 8 的老板,等等。我想要的是一种查询这张表的方法,这样我就可以找到所有人在层次结构中低于指定 ID,例如,如果查询 ID 1,则返回 1、2、3、4、5、6、7、8 和 9,如果我查询 2,则返回 2、5,以及8.我目前的尝试是:

with Hierarchy AS (
select a.ID as AncestorID, a.ID as DescendantID, 0 as Depth from BossTable a
UNION ALL
select CTE.AncestorID, a.ID, CTE.Depth + 1 from BossTable a
inner join Hierarchy CTE on a.BossID = CTE.DescendantID
)
select a.AncestorID, a.DescendantID, a.Depth from Hierarchy a

它确实返回了我正在寻找的东西,但是查询速度很慢并且会导致生产问题。我的理想目标是把它变成一个可以被索引的视图,但目前这是不可能的,因为它不能像其他索引那样具有唯一的聚集索引。BossTable 也可以经常编辑,将人员转移到不同的老板,添加或删除,因此使用此数据创建另一个表是不现实的。

任何建议将不胜感激,只是希望尽可能高效。

标签: sqlsql-serverperformancequery-optimization

解决方案


推荐阅读