将 INDEX 添加到 CTE
我可以将 INDEX 添加到公用表表达式 (CTE) 中吗?
Can I add an INDEX to a Common Table Expression (CTE)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我可以将 INDEX 添加到公用表表达式 (CTE) 中吗?
Can I add an INDEX to a Common Table Expression (CTE)?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
我也有过同样的要求。无法将索引添加到 CTE。然而,在 CTE select 中,在连接字段上添加 ORDER BY 子句将执行时间从 20 分钟或更长减少到 10 秒以下。
(您还需要添加 SELECT TOP 100 PERCENT 以允许在 CTE 选择中使用 ORDER BY。)
[编辑以添加下面评论中的解释引用]:
如果 CTE 中有 DISTINCT,则 TOP 100 PERCENT 不起作用。这种作弊方法始终可用:在选择中根本不需要 TOP,将 ORDER BY 语句更改为:
排序依据 [Blah] 偏移 0 行
I have had the same requirement. Indexes can not be added to a CTE. However, in the CTE select adding an ORDER BY clause on the joined fields reduced the execution time from 20 minutes or more to under 10 seconds.
(You need to also ADD SELECT TOP 100 PERCENT to allow an ORDER BY in a CTE select.)
[edit to add paraphrased quote from a comment below]:
If you have DISTINCT in the CTE then TOP 100 PERCENT doesn't work. This cheater method is always available: without needing TOP at all in the select, alter the ORDER BY statement to read:
ORDER BY [Blah] OFFSET 0 ROWS
不可以
。CTE 是临时的“内联”视图 - 您无法向此类构造添加索引。
如果需要索引,请使用 CTE 的 SELECT 创建常规视图,并将其设为索引视图(通过向视图添加聚集索引)。您需要遵守此处列出的一组规则:创建索引视图< /a>.
No.
A CTE is a temporary, "inline" view - you cannot add an index to such a construct.
If you need an index, create a regular view with the SELECT of your CTE, and make it an indexed view (by adding a clustered index to the view). You'll need to obey a set of rules outlined here: Creating an Indexed View.
您无法为 CTE 建立索引,但方法是 CTE 可以利用基础索引。
在上面的查询中,由于
GROUP BY
,a JOIN b
无法使用t.myname
上的索引。另一方面,
在后一个查询中,
a JOIN b
可以使用t.myname
上的索引。You cannot index a CTE, but the approach is that the CTE can make use of the underlying indexes.
In the above query,
a JOIN b
cannot make use of an index ont.myname
because of theGROUP BY
.On the other hand,
In the latter query,
a JOIN b
can make use of an index ont.myname
./* 下面的构造将我的查询时间从 2 分钟减少到 4 秒 */
/* The Below construct reduced my query from 2 minutes to 4 seconds */
另一种技术是插入临时表而不是使用 CTE
然后,您可以向临时表添加索引
。通过执行此操作,我将 9 分钟的查询减少到 3 秒的查询。
有些人可能强烈反对临时表。
对于我们其他人来说,试图让事情正常运转……需要考虑一些事情。
(我确实尝试了前 100000 个... order by)我没有意识到时间减少。
Another technique is to insert into a temp table instead of using a CTE
You can then add an index to the temp table
I reduced a 9min query to a 3 sec query by doing this.
Some may be religiously opposed to temp tables.
for the rest of us trying to get things working... something to consider.
( I did try the top 100000 ... order by) I did not realize a time reduction.