递归查询SQL运行太慢吗?如何改进?

发布于 2025-02-12 10:16:29 字数 1399 浏览 0 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

停顿的约定 2025-02-19 10:16:29

递归CTE非常好。但是,如果您想构建一个较大的层次结构(例如200k+),则使用temp表中的没有羞耻感。

这是我用于大型和缓慢移动的层次结构的脱衣/修改版本。

示例

Create Table #YourTable ([Employee] varchar(50),[Manager] varchar(50))
Insert Into #YourTable Values 
 ('Jack',null)
,('Luna','Jack')
,('Japan','Jack')
,('Alice','Luna')
,('Alex','Luna')
,('Jessica','Alex')


Select *
      ,Lvl=1
      ,Path=convert(varchar(500),Employee)
 Into  #TempBld 
 From  #YourTable 
 Where Manager is null

Declare @Cnt int=1
While @Cnt<=30  -- Set Max Level -- You can be a little generous here.
    Begin
        Insert Into #TempBld 
        Select A.*
              ,Lvl =B.Lvl+1
              ,Path=B.Path+' - '+A.Employee
         From  #YourTable A
         Join  #TempBld B on (B.Lvl=@Cnt and A.Manager=B.Employee)
        Set @Cnt=@Cnt+1
    End

Select * from #TempBld Order by Path

结果

Lvl Employee    Manager   Path
1   Jack        NULL      Jack
2   Japan       Jack      Jack - Japan
2   Luna        Jack      Jack - Luna
3   Alex        Luna      Jack - Luna - Alex
4   Jessica     Alex      Jack - Luna - Alex - Jessica
3   Alice       Luna      Jack - Luna - Alice

Recursive CTEs are great to a point. However, if you are looking to build a large hierarchy (like 200K+), there is NO shame in using TEMP tables.

Here is a stripped down/modified version I've used for my LARGE and SLOW MOVING hierarchies.

Example

Create Table #YourTable ([Employee] varchar(50),[Manager] varchar(50))
Insert Into #YourTable Values 
 ('Jack',null)
,('Luna','Jack')
,('Japan','Jack')
,('Alice','Luna')
,('Alex','Luna')
,('Jessica','Alex')


Select *
      ,Lvl=1
      ,Path=convert(varchar(500),Employee)
 Into  #TempBld 
 From  #YourTable 
 Where Manager is null

Declare @Cnt int=1
While @Cnt<=30  -- Set Max Level -- You can be a little generous here.
    Begin
        Insert Into #TempBld 
        Select A.*
              ,Lvl =B.Lvl+1
              ,Path=B.Path+' - '+A.Employee
         From  #YourTable A
         Join  #TempBld B on (B.Lvl=@Cnt and A.Manager=B.Employee)
        Set @Cnt=@Cnt+1
    End

Select * from #TempBld Order by Path

Results

Lvl Employee    Manager   Path
1   Jack        NULL      Jack
2   Japan       Jack      Jack - Japan
2   Luna        Jack      Jack - Luna
3   Alex        Luna      Jack - Luna - Alex
4   Jessica     Alex      Jack - Luna - Alex - Jessica
3   Alice       Luna      Jack - Luna - Alice
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文