Sql 递归CTE的性能很差

Sql 递归CTE的性能很差,sql,sql-server,tsql,recursion,query-performance,Sql,Sql Server,Tsql,Recursion,Query Performance,我有一个[LOCATION]表,它是一个自引用表 一个位置可以有[PARENT_ID](ID或NULL)。 可以[启用]一个位置(0或1) 我的视图的目的是列出每个位置,并添加一个新列[在\u层次结构中启用\u] 此新列必须说明: -1如果位置已启用且其所有父级均已启用 -0如果位置未启用或其父节点之一未启用 我的T-SQL视图做得不错,但我的性能有问题: WITH LOCATION_CTE ([ID], [DISPLAY_NAME], [PARENT_ID], [ENABLED], [E

我有一个[LOCATION]表,它是一个自引用表

一个位置可以有[PARENT_ID](ID或NULL)。
可以[启用]一个位置(0或1)

我的视图的目的是列出每个位置,并添加一个新列[在\u层次结构中启用\u]
此新列必须说明:
-1如果位置已启用且其所有父级均已启用
-0如果位置未启用或其父节点之一未启用


我的T-SQL视图做得不错,但我的性能有问题:

WITH LOCATION_CTE ([ID], [DISPLAY_NAME], [PARENT_ID], [ENABLED],
  [ENABLED_IN_HIERARCHY])
AS (
    SELECT [ID], [DISPLAY_NAME], [PARENT_ID], [ENABLED], [ENABLED]
    FROM [LOCATION]
    WHERE [PARENT_ID] IS NULL

    UNION ALL

    SELECT l.[ID], l.[DISPLAY_NAME], l.[PARENT_ID], l.[ENABLED], 
      CAST(CASE WHEN l.[ENABLED] = 1 AND LOCATION_CTE.[ENABLED_IN_HIERARCHY] = 1 
                THEN 1 ELSE 0 
                END AS BIT) AS [ENABLED_IN_HIERARCHY]
    FROM [LOCATION] l
    INNER JOIN LOCATION_CTE ON LOCATION_CTE.[ID] = l.[PARENT_ID]
    )
SELECT *
FROM LOCATION_CTE

是否有更好的方法生成此查询?

为了使此视图快速,您需要有索引:

create index ix1 on [LOCATION] ([PARENT_ID]);

否则它可能会非常慢,特别是当表中有大量行时。

如果您可以发布一些示例数据、表结构和预期结果,这会有所帮助此表中有多少行?你能分享一下它的结构吗?有索引吗?