簡體   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