我有此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 i.entityStatusId = 1
)
Select ItemTypeId, Count(*) as ItemCount from item_cte group by ItemTypeId option(MaxRecursion 100)
答案 0 :(得分:2)
为加快查询速度,您可以考虑使用以下索引:
显然已经在Items.Id
上建立了索引(聚集)。
在Items.entityStatusId
上的索引也(非聚集)。
类似地,item_CTE.id
上的聚集索引,我想您也有。
答案 1 :(得分:0)
在不了解表本身,表的用法和现有索引的情况下,很难提出具体建议。但是,要考虑一些事情...
entityStatusId上的非聚集索引是显而易见的。假设已准备就绪,请查看查询计划。您可能会看到密钥查找。考虑将itemTypeId添加为包含的列,这将阻止键查找(这被称为覆盖索引)。
取决于表的大小,以及entityStatusId的选择性,您可以考虑在entityStatusId上使用过滤索引。
正如Damien所建议的那样,您可以看看使用architectureid并执行一些测试来证明这是否更快。但是,前提是您能够修改基础架构。
随时将您的查询计划发布到https://www.brentozar.com/pastetheplan/