gpt4 book ai didi

sql - 为递归查询优化 CTE

转载 作者:行者123 更新时间:2023-12-04 14:18:40 26 4
gpt4 key购买 nike

我有一张带有自连接的表。您可以将结构视为表示组织层次结构的标准表。例如表:-

MemberId
MemberName
RelatedMemberId

该表由 50000 条样本记录组成。我写了 CTE 递归查询,它工作得很好。然而,在我的机器(4GB 内存、2.4 Ghz Core2Duo、7200 RPM HDD)上处理 50000 条记录所需的时间大约为 3 分钟。

我怎么可能提高性能,因为 50000 不是那么大的数字。随着时间的推移,它将继续增加。这正是我在存储过程中所拥有的查询。该查询的目的是选择特定成员下的所有成员。例如。在公司的所有者下,每个人都来了。对于 Manager,除了 Owner 之外的所有记录都被返回。我希望您了解查询的目的。

设置 ANSI_NULLS ON

设置 QUOTED_IDENTIFIER ON

Alter PROCEDURE spGetNonVirtualizedData
(
@MemberId int
)
AS
BEGIN

With MembersCTE As
(
Select parent.MemberId As MemberId, 0 as Level
From Members as parent Where IsNull(MemberId,0) = IsNull(@MemberId,0)

Union ALL
Select child.MemberId As MemberId , Level + 1 as Level
From Members as child
Inner Join MembersCTE on MembersCTE.MemberId = child.RelatedMemberId
)
Select Members.*
From MembersCTE
Inner Join Members On MembersCTE.MemberId = Members.MemberId
option(maxrecursion 0)

END
GO

正如您所看到的,为了提高性能,我什至在最后一步选择记录时进行了连接,这样所有不必要的记录都不会被插入到临时表中。如果我在我的基本步骤和 CTE 的递归步骤(而不是最后一步的 Select)中进行了连接,则查询需要 20 分钟来执行!

MemberId 是表中的主键。

提前致谢 :)

最佳答案

在您的 anchor 定条件下,您有 Where IsNull(MemberId,0) = IsNull(@MemberId,0)我认为这只是因为当您通过时 NULL作为参数 =在带回方面不起作用 IS NULL值。这将导致扫描而不是搜索。

使用 WHERE MemberId = @MemberId OR (@MemberId IS NULL AND MemberId IS NULL)相反,这是可交易的。

另外我假设你不能在 RelatedMemberId 上建立索引。 .如果不是,你应该添加一个

CREATE NONCLUSTERED INDEX ix_name ON Members(RelatedMemberId) INCLUDE (MemberId)

(尽管如果 MemberId 是聚集索引键,您可以跳过包含的列位,因为它将被自动包含)

关于sql - 为递归查询优化 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5756569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com