Я создаю временную таблицу, чтобы установить уровень:
CREATE TABLE [#DesignLvl]
(
[DesignKey] INT,
[DesignLevel] INT
);
WITH RCTE AS
(
SELECT
*,
1 AS [Lvl]
FROM
[Design]
WHERE
[ParentDesignKey] IS NULL
UNION ALL
SELECT
[D].*,
[Lvl] + 1 AS [Lvl]
FROM
[dbo].[Design] AS [D]
INNER JOIN
[RCTE] AS [rc] ON [rc].[DesignKey] = [D].[ParentDesignKey]
)
INSERT INTO [#DesignLvl]
SELECT
[DesignKey], [Lvl]
FROM
[RCTE]
После создания я использовал LEFT JOIN в действительно большом запросе, например:
SELECT...
FROM..
LEFT JOIN [#DesignLvl] AS [dl] ON d.DesignKey = dl.DesignKey
WHERE ...
Запрос работает, но производительность упала, и теперь запрос выполняется слишком медленно. Есть ли способ оптимизировать эту таблицу?
План выполнения CTE
Я пытаюсь добавить индекс CLUSTERED как:
CREATE TABLE [#DesignLvl]
(
[DesignKey] INT,
[DesignLevel] INT
);
CREATE CLUSTERED INDEX ix_DesignLvl
ON [#DesignLvl] ([DesignKey], [DesignLevel]);
Также попробуйте:
CREATE TABLE [#DesignLvl]
( [DesignKey] INT INDEX IX1 CLUSTERED ,
[DesignLevel] INT INDEX IX2 NONCLUSTERED );
Но я получаю тот же результат, выполнение заняло много времени
Design
с ведущим столбцомParentDesignKey
, чтобы ему не приходилось сканировать его для каждой родительской строки. - person Martin Smith   schedule 04.03.2019CREATE TABLE [#DesignLvl] ( [DesignKey] INT INDEX IX1 CLUSTERED , [DesignLevel] INT INDEX IX2 NONCLUSTERED );
? @МартинСмит - person Jonathan   schedule 05.03.2019