2010-10-22 156 views
27

应该是一个非常简单的问题。我可以将一个INDEX添加到公用表表达式(CTE)吗?向CTE添加索引

+4

这可能是一些可能与一些搞乱计划指南。 [本文](http://explainextended.com/2009/05/28/generating-xml-in-subqueries/)[Quassnoi](http://stackoverflow.com/users/55159/quassnoi)展示了如何使用计划指南通过向计划添加EagerSpool来获取缓存的CTE结果。这会在tempdb中为它们构建一个临时索引。 – 2010-10-22 12:08:49

+1

@Martin Smith:哇!我将有一个很好的阅读,并尝试让我的头围绕这一切:) – 2010-10-22 12:51:19

回答

18

甲CTE是一个临时的,“内联”视图 - 你不能索引添加到这样的构建体。

如果您需要索引,请使用CTE的SELECT创建常规视图,并将其设置为索引视图(通过将聚集索引添加到视图中)。您需要遵守这里列出的一组规则:Creating an Indexed View

+1

谢谢。我不确定Binging是什么也没有显示,Googl也没有。 – 2010-10-22 11:29:44

+10

Lycos-ing怎么样? – 2013-03-06 22:30:54

+1

对我来说,索引视图首先尝试18秒,然后16秒,然后14秒第三次尝试。 CTE首先尝试了16秒。我会坚持CTE。顺便说一句,对于我索引表(暂时使用)是最好的整体下降到10秒。 – Todd 2017-03-28 11:58:27

48

我有同样的要求。索引不能添加到CTE。但是,在CTE中,选择在连接字段上添加ORDER BY子句将执行时间从20分钟或更长时间减少到10秒以下。

(您还需要添加SELECT TOP 100%,至允许ORDER BY的CTE选择。)

[编辑从注释下添加转述报价]:
如果你有不同之处在CTE然后TOP 100 PERCENT不起作用。这种骗子方法总是可用的:在选择时不需要TOP,将ORDER BY语句改为:
ORDER BY [Blah] OFFSET 0 ROWS

+2

你从哪里学到这样的伏都教?它对我们有长时间运行的查询有显着的影响。前100,000比PERCENT 100的效果更好。我将开始深入查询分析器,看看发生了什么。谢谢! – BlackjacketMack 2012-09-08 01:35:05

+0

这是非常有趣,很好知道。我将我的查询从最高1000000改为最高100 PERCENT。我会改回它。在尝试为CTE建立索引时,我在MSDN上遇到了这个提示。 – 2012-09-08 05:14:15

+0

TOP 100 PERCENT可能会使用估计记录数返回。 TOP 1000000可能会认为会有更多的内存并预留更多的内存,以便没有排序警告和泄漏到TempDB。 – milivojeviCH 2012-10-22 10:17:32

0

@BH - 解决使用TOP的DISTINCT问题100%或TOP 1000000,你总是可以使用GROUP BY。实现相同的目的,有时比DISTINCT更快。