繁体   English   中英

递归 CTE 的性能不佳

[英]Bad performance of recursive CTE

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

一个位置可以有一个 [PARENT_ID](id 或 NULL)。
一个位置可以是 [ENABLED](0 或 1)。

我的视图的目的是列出每个位置,并添加一个新列[ENABLE_IN_HIERARCHY]
这个新专栏必须说明:
- 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]);

否则它可能真的很慢,特别是如果表的行数很多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM