我在20k行上使用以下代码,需要3分钟, 我该如何改进呢?
;WITH abcd
AS (
-- anchor
SELECT topicid, [Description], ParentID,topicgroupfk, topicgroupfk AS "GROUPFK",
CAST(([Description]) AS VARCHAR(1000)) AS "Path"
FROM accounting.topics
WHERE ParentId='0' and FinancialPeriodFK=1
UNION ALL
--recursive member
SELECT t.topicid, t.[Description], t.ParentID,t.topicgroupfk,a.GROUPFK AS "GROUPFK",
CAST((a.path + '/' + t.Description) AS VARCHAR(1000)) AS "Path"
FROM accounting.topics AS t
JOIN abcd AS a
ON t.ParentId = a.topicid
where t.FinancialPeriodFK=1
)
SELECT * FROM abcd where parentid>=0
答案 0 :(得分:1)
我打赌(希望)它是一个int或bigint。因此,您可以在此处删除引用和隐式转换:
WHERE ParentId='0'
如果它已经是varchar(1000),则可以将2 cast转换为varchar(1000)。如果它更小,您可以考虑将其更改为varchar(1000),然后删除2个强制转换。
您在[ParentId]上有覆盖索引,包括[FinancialPeriodFK],其中[FinancialPeriodFK]的where子句= 1?
其中不需要parentid> = 0
是[topicgroupfk]整数吗?
你也可以尝试减小递归CTE的大小和范围并稍后获取
你可能只需要在CTE中使用topicid,parentid和path,然后尝试在主选择中使用topicid进行额外连接来获取其他列