2010-10-22 147 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更快。