gpt4 book ai didi

sql - 如何加速递归 CTE

转载 作者:行者123 更新时间:2023-12-04 18:09:55 42 4
gpt4 key购买 nike

鉴于以下递归 CTE(在我的示例中简化了一点):

    WITH myCTE (sort, parentid, myid, level, somedata)
AS
(
-- Anchor member definition
SELECT
CAST(ROW_NUMBER() OVER(ORDER BY o.myid) as decimal(38, 20)) as sort,
o.parentid,
o.myid,
0 as level,
o.somedata
FROM
table1 t1,
table2 t1,
datatable o
WHERE t1.somebool = 1 AND t2.id = t1.foreignid and o.foreignkey = t2.key
and o.parentid = ''
UNION ALL
-- Recursive member definition
SELECT
CAST(b.sort + (ROW_NUMBER() OVER(ORDER BY o.myid) / power(10.0, b.level + 1)) as decimal(38, 20)) as sort,
o.parentid,
o.myid,
b.level + 1,
o.somedata
FROM datatable o
INNER JOIN myCTE AS b
ON o.parentid = b.myid

大体思路如下:从基于table1和table2的项目选择开始,我想启动查询,在anchor中我想找到所有没有父级的数据,将它与具有主要项目的数据连接起来和 parent 继续挖掘,直到我找到所有数据。我正在处理一棵未知深度的树,尽管我发现的最大级别是 7。

对递归成员应用额外限制有用吗?我从 anchor 复制的限制越多似乎效果越好,但仅过滤“o.parentid = b.myid”是否就足够了?

最佳答案

这是我推荐的调试/调整方法:

1) 添加以下查询提示,排除存在无限循环的可能性。

...
)
SELECT parentid ,
myid ,
[level]
FROM myCTE
OPTION (MAXRECURSION 20)

2) 如果返回结果,则尝试使用注释掉查询提示的相同查询。它应该在大约相同的时间运行并返回相同数量的结果。

3)此时您应该添加回排序字段。除非有特定要求将其包含在递归中,否则我建议您将其移动到针对 CTE 的查询,就像这样。
...
)
SELECT parentid ,
myid ,
[level],
-- I'm not sure what this accomplishes:
-- ROW_NUMBER() OVER (ORDER BY CAST(myid) ASC) / CAST (POWER(10,level) AS DECIMAL(38,20)) AS sort
-- Wouldn't this look nicer?
ROW_NUMBER() OVER (ORDER BY [level] ASC, CAST ([parentid] AS INT) ASC, CAST ([myid] AS INT) ASC) AS sort

FROM myCTE
ORDER BY [sort]
OPTION (MAXRECURSION 20)

3) 最后,重新添加对 Table1 和 Table2 的连接。我鼓励您也将其添加到 CTE 查询中。

我知道您有一个解决方法,但如果您花时间看看我的方法是否适合您,我将不胜感激。

关于sql - 如何加速递归 CTE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16810676/

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