Добавление индекса в CTE - PullRequest
35 голосов
/ 22 октября 2010

Должен быть довольно простой вопрос.Могу ли я добавить ИНДЕКС в общее табличное выражение (CTE)?

Ответы [ 3 ]

55 голосов
/ 30 июля 2012

У меня было такое же требование. Индексы не могут быть добавлены в CTE. Однако в CTE выберите добавление предложения ORDER BY к объединенным полям, что сократило время выполнения с 20 минут или более до 10 секунд.

(Вам также необходимо добавить SELECT TOP 100 PERCENT, чтобы разрешить ORDER BY в CTE.)

[изменить, чтобы добавить перефразированную цитату из комментария ниже]:
Если у вас есть DISTINCT в CTE, то TOP 100 PERCENT не работает. Этот читерский метод всегда доступен: вообще не нуждаясь в TOP в select, измените оператор ORDER BY следующим образом:
ЗАКАЗАТЬ ПО [Blah] OFFSET 0 ROWS

19 голосов
/ 22 октября 2010

Нет.

CTE - это временное «встроенное» представление - вы не можете добавить индекс к такой конструкции.

Если вам нужен индекс, создайте обычное представление с помощьюВЫБЕРИ свой CTE и сделай его индексированным представлением (добавив в представление кластеризованный индекс).Вам нужно будет соблюдать ряд правил, изложенных здесь: Создание индексированного представления .

0 голосов
/ 24 декабря 2015

@ BH - Чтобы обойти проблему DISTINCT с использованием TOP 100% или TOP 1000000, вы всегда можете использовать GROUP BY.Служит той же цели и иногда быстрее, чем DISTINCT.

...