Sql 是否有一个索引可以加速CTE?
我有一个CTE,大约需要两秒钟才能完成 我可以添加一个索引来加速它吗Sql 是否有一个索引可以加速CTE?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一个CTE,大约需要两秒钟才能完成 我可以添加一个索引来加速它吗 with item_cte as (select Id, itemTypeId from Items where Id = 230 and entityStatusId = 1 union all Select i.id, i.itemTypeId from items I inner join item_CTE icte on icte.Id = i.ParentId where
with item_cte
as
(select Id, itemTypeId from Items where Id = 230
and entityStatusId = 1
union all
Select i.id, i.itemTypeId from items I
inner join item_CTE icte on icte.Id = i.ParentId where i.entityStatusId = 1
)
Select ItemTypeId, Count(*) as ItemCount from item_cte group by ItemTypeId option(MaxRecursion 100)
<> P>为了加快查询速度,可以考虑这样的索引:
Items.Id
上建立索引(聚集),这可能是您已经拥有的项上的(非聚集)索引。entityStatusId
item_CTE.id
上的聚集索引,我猜您也有如果不了解更多关于表本身、它的用法和现有索引的信息,就很难提出具体的建议。但是,有些事情要考虑……/P>
- entityStatusId上的非聚集索引是显而易见的。假设已经准备好了,请查看查询计划。您可能会看到一个键查找。考虑将ItType ID作为一个包含列来防止密钥查找(这被称为覆盖索引)。
当您运行一个包含一个或多个CTE的查询时,可以将您的查询计划发布到,SQL Server只会内联CTE代码。因此,为了加快CTE中的查询,您需要做与自己要做的原始SQL代码相同的事情。如果需要加快分层查询,请考虑切换到使用<代码> SaleYyID < /C> >对其进行建模,而不是父/子模型。父/子级必须导致多个级别的查找。(当然,这不应该盲目地进行;你需要考虑所有的查询模式,并衡量是否有一个整体的好处来进行这样的转换)“DaMiNeNethIONunBiiver,这非常有趣,关于代码> SalyYID在某个时候,我必须加快速度。因为它看起来比在CTE中使用父级/子级要快得多。这样重写递归CTE有效吗?据我所知,您需要锚定查询和非锚定查询,它们必须由
UNION ALL
s组合在一起。非常感谢。但是当我运行上面的操作时,我得到了错误消息:递归公共表表达式'item_cte'不包含顶级的UNION ALL运算符。
@Damien_the_unsiver谢谢,我没有意识到它是递归的@Greg0我没有意识到它是递归的……)但关于索引的备注仍然有效:)