Adding an INDEX to a CTE

Neil Knight picture Neil Knight · Oct 22, 2010 · Viewed 51.3k times · Source

Should be a pretty straight forward question. Can I add an INDEX to a Common Table Expression (CTE)?

Answer

Richard Vivian picture Richard Vivian · Jul 30, 2012

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