Sql server 2008 向CTE添加索引
这应该是一个非常直截了当的问题。我可以向公共表表达式(CTE)添加索引吗?否 CTE是一个临时的“内联”视图-您不能向这样的构造添加索引Sql server 2008 向CTE添加索引,sql-server-2008,common-table-expression,Sql Server 2008,Common Table Expression,这应该是一个非常直截了当的问题。我可以向公共表表达式(CTE)添加索引吗?否 CTE是一个临时的“内联”视图-您不能向这样的构造添加索引 如果需要索引,请使用所选CTE创建常规视图,并使其成为索引视图(通过向视图添加聚集索引)。你需要遵守这里列出的一套规则:。我也有同样的要求。无法将索引添加到CTE。但是,在CTE select中,在联接字段上添加一个ORDER BY子句将执行时间从20分钟或更长时间减少到10秒以下 (您还需要添加SELECT TOP 100%以允许CTE SELECT中的订单
如果需要索引,请使用所选CTE创建常规视图,并使其成为索引视图(通过向视图添加聚集索引)。你需要遵守这里列出的一套规则:。我也有同样的要求。无法将索引添加到CTE。但是,在CTE select中,在联接字段上添加一个ORDER BY子句将执行时间从20分钟或更长时间减少到10秒以下 (您还需要添加SELECT TOP 100%以允许CTE SELECT中的订单。) [编辑以添加下面评论中的转述引用]:
如果您在CTE中有DISTINCT,则TOP 100%不起作用。此作弊方法始终可用:在select中根本不需要TOP,将ORDER BY语句改为:
按[Blah]偏移量0行排序@B H-要解决使用TOP 100%或TOP 1000000的明显问题,您可以始终使用GROUP BY。服务于相同的目的,有时比DISTINCT更快。您不能为CTE编制索引,但方法是CTE可以利用基础索引
WITH cte AS (
SELECT myname, SUM(Qty) FROM t GROUP BY myname
)
SELECT *
FROM t a JOIN cte b ON a.myname=b.myname
在上面的查询中,a JOIN b
无法使用t.myname
上的索引,因为GROUP BY
另一方面,
WITH cte AS (
SELECT myname, SUM(Qty) OVER (PARTITION BY myname) AS SumQty,
ROW_NUMBER() OVER (PARTITION BY myname ORDER BY myname, Qty) AS n
)
SELECT * FROM t a JOIN cte b ON a.myname=b.myname AND b.n=1
在后一个查询中,
a JOIN b
可以使用t.myname
上的索引,谢谢。我不确定,因为Bing-ing没有显示任何内容,Googl-ing也没有。对我来说,索引视图第一次尝试用了18秒,然后16秒,第三次尝试用了14秒。CTE第一次尝试用了16秒。我会坚持CTE。顺便说一句,对我来说,索引表(暂时使用)是最好的,总的来说可以缩短到10秒。可能会有一些计划指南的混乱。by演示了如何使用计划指南通过向计划中添加一个线程来获取缓存的CTE的结果。这会在tempdb中为它们建立一个临时索引。@Martin Smith:哇!!!我会好好读一读,然后试着让我的头脑清醒过来:)你从哪里学来的伏都教?它对我们的一个长期运行的查询有显著的影响。排名前10万的人比排名前100%的人工作得更好。我将开始深入查询分析器,看看发生了什么。谢谢当你说在CTE选择中,你是指创建CTE的选择,还是使用CTE的选择?我一直很想知道这些技术,你能举一个例子来证明thanxHard举一个对你有意义的例子,因为你需要对大量数据集执行才能看到值。我将寻找给我这个好处的查询,并在接下来的几天为您详细记录结果和性能改进。@BlackjacketMack:“巫毒”。回想起来,在CTE中使用ORDER BY的错误信息非常清楚:“ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或for XML。”但请向Richard致敬,以获取他的答案。我需要在我的CTE中使用DISTINCE,所以TOP 100%不起作用。此作弊方法始终可用:按[Blah]偏移量0行排序