Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否有一个索引可以加速CTE?_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

Sql 是否有一个索引可以加速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

我有一个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)

<> P>为了加快查询速度,可以考虑这样的索引:

  • Items.Id
    上建立索引(聚集),这可能是您已经拥有的

  • 还有
    项上的(非聚集)索引。entityStatusId

  • 类似地,
    item_CTE.id
    上的聚集索引,我猜您也有


  • 如果不了解更多关于表本身、它的用法和现有索引的信息,就很难提出具体的建议。但是,有些事情要考虑……/P>
    • entityStatusId上的非聚集索引是显而易见的。假设已经准备好了,请查看查询计划。您可能会看到一个键查找。考虑将ItType ID作为一个包含列来防止密钥查找(这被称为覆盖索引)。

    • >P>取决于表的大小,以及如何选择EntTyStudid,您可以考虑在EntTyStIsId上使用筛选索引。p>
    正如Damien所建议的,您可以考虑使用hierarchyid并执行一些测试来证明这是否更快。但是,这假设您能够修改基础架构


    当您运行一个包含一个或多个CTE的查询时,可以将您的查询计划发布到

    ,SQL Server只会内联CTE代码。因此,为了加快CTE中的查询,您需要做与自己要做的原始SQL代码相同的事情。如果需要加快分层查询,请考虑切换到使用<代码> SaleYyID < /C> >对其进行建模,而不是父/子模型。父/子级必须导致多个级别的查找。(当然,这不应该盲目地进行;你需要考虑所有的查询模式,并衡量是否有一个整体的好处来进行这样的转换)“DaMiNeNethIONunBiiver,这非常有趣,关于代码> SalyYID在某个时候,我必须加快速度。因为它看起来比在CTE中使用父级/子级要快得多。这样重写递归CTE有效吗?据我所知,您需要锚定查询和非锚定查询,它们必须由
    UNION ALL
    s组合在一起。非常感谢。但是当我运行上面的操作时,我得到了错误消息:
    递归公共表表达式'item_cte'不包含顶级的UNION ALL运算符。
    @Damien_the_unsiver谢谢,我没有意识到它是递归的@Greg0我没有意识到它是递归的……)但关于索引的备注仍然有效:)