有没有可以提高CTE的索引?

时间:2018-09-16 15:29:11

标签: 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 i.entityStatusId = 1
)
Select ItemTypeId, Count(*) as ItemCount from item_cte group by ItemTypeId option(MaxRecursion 100)

2 个答案:

答案 0 :(得分:2)

为加快查询速度,您可以考虑使用以下索引:

  1. 显然已经在Items.Id上建立了索引(聚集)。

  2. Items.entityStatusId上的索引也(非聚集)。

  3. 类似地,item_CTE.id上的聚集索引,我想您也有。

答案 1 :(得分:0)

在不了解表本身,表的用法和现有索引的情况下,很难提出具体建议。但是,要考虑一些事情...

  • entityStatusId上的非聚集索引是显而易见的。假设已准备就绪,请查看查询计划。您可能会看到密钥查找。考虑将itemTypeId添加为包含的列,这将阻止键查找(这被称为覆盖索引)。

  • 取决于表的大小,以及entityStatusId的选择性,您可以考虑在entityStatusId上使用过滤索引。

正如Damien所建议的那样,您可以看看使用architectureid并执行一些测试来证明这是否更快。但是,前提是您能够修改基础架构。

随时将您的查询计划发布到https://www.brentozar.com/pastetheplan/