Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 2008 向CTE添加索引_Sql Server 2008_Common Table Expression - Fatal编程技术网

Sql server 2008 向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创建常规视图,并使其成为索引视图(通过向视图添加聚集索引)。你需要遵守这里列出的一套规则:。

我也有同样的要求。无法将索引添加到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行排序