【发布时间】:2023-03-08 07:04:01
【问题描述】:
我创建临时表以设置级别:
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 );
但我得到相同的结果,执行需要很长时间
【问题讨论】:
-
查看执行计划以告诉您问题所在。您需要为表添加索引。
-
我运行执行计划并且问题出现在 CTE 函数中,我在几秒钟内用照片更新我的问题@Brad
-
您需要在
Design上使用前导列ParentDesignKey的覆盖索引,因此不必为每个父行扫描它 -
我该怎么做? @马丁史密斯
-
您应该将新索引添加到 [dbo].[Design] 而不是 [#DesignLvl]; [dbo].[Design] 的主键是什么?
标签: sql sql-server tsql common-table-expression sql-server-2017