Есть ли индекс, который ускорит CTE? - PullRequest
0 голосов
/ 16 сентября 2018

У меня есть этот CTE, выполнение которого занимает около двух секунд.

Можно ли добавить индекс, который ускорит его?

with item_cte
as
(select Id, itemTypeId from Items where Id = 230
        and entityStatusId = 1
     union all
     Select i.id, i.itemTypeId from items I
     inner join item_CTE icte on icte.Id = i.ParentId where i.entityStatusId = 1
)
Select ItemTypeId, Count(*) as ItemCount from item_cte group by ItemTypeId option(MaxRecursion 100)

Ответы [ 2 ]

0 голосов
/ 16 сентября 2018

Не зная больше о самой таблице, ее использовании и существующих индексах, трудно дать конкретные рекомендации.Тем не менее, некоторые вещи, которые следует учитывать ...

  • Некластеризованный индекс для entityStatusId является очевидным.Предполагая, что это на месте, посмотрите на план запроса.Вы, вероятно, увидите поиск ключей.Попробуйте добавить itemTypeId в качестве включенного столбца, который должен предотвращать поиск ключа (это называется индексом покрытия).

  • В зависимости от размера таблицы и от того, насколько селективным является entityStatusIdВы можете рассмотреть использование отфильтрованного индекса на entityStatusId.

Как предположил Дэмиен, вы можете посмотреть на использование иерархии и выполнение некоторых тестов, чтобы доказать, быстрее ли это.Однако это предполагает, что вы можете изменить базовую схему.

Не стесняйтесь размещать свой план запросов на https://www.brentozar.com/pastetheplan/

0 голосов
/ 16 сентября 2018

Чтобы ускорить этот запрос, вы можете рассмотреть такие индексы:

  1. Ядовитый индекс (кластеризованный) для Items.Id, который, вероятно, у вас уже есть.

  2. Также (некластеризованный) индекс для Items.entityStatusId.

  3. Аналогично, кластеризованный индекс для item_CTE.id, который также, я думаю, у вас есть.

...