对于文件夹及其路径的层次结构,我有这个简单的递归 CTE:
WITH paths AS (
SELECT Id, ParentId, Name AS [Path] FROM Folders
WHERE ParentId IS NULL
UNION ALL
SELECT f.Id, f.ParentId, [Path] + '/' + f.Name FROM Folders f
JOIN paths on f.ParentId = paths.Id
)
SELECT Id, [Path] from paths
WHERE Id = @FolderId
在我的本地 SQL Server Express 上,它在 35 毫秒内运行没问题。在我的 Azure SQL 数据库上,有时需要大约 400 毫秒。Azure SQL 表只有大约 2000 行,其他简单查询只需要大约 80 毫秒。我有关于 Id 和 ParentId 的索引。我的应用程序可以非常频繁地进行此查询,每次都必须等待半秒或更长时间,这很烦人。这是两个单独计划的屏幕截图,不知道为什么它们不同:
https://www.brentozar.com/pastetheplan/?id=Hky4zASAI
https://www.brentozar.com/pastetheplan/?id=H17LfRHAU
Azure SQL 只是更慢吗?
编辑:这与 Azure SQL 无关,那里的表比我的测试大得多。
我再次检查了您的查询,看来您可以这样重写: