Предположим, у меня есть 2 таблицы, продукты и категории продуктов. Обе таблицы имеют отношение к CategoryId. И это запрос.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category
FROM Products p
INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId
WHERE c.CategoryId = 1;
Когда я создаю план выполнения, таблица ProductCategories выполняет поиск по кластерному индексу, как и ожидалось. Но для табличных продуктов он выполняет сканирование индекса кластера, что вызывает у меня сомнения. Почему FK не помогает улучшить производительность запросов?
Поэтому я должен создать индекс для Products.CategoryId. Когда я снова создаю план выполнения, обе таблицы выполняют поиск по индексу. И оценочная стоимость поддерева значительно снижается.
Мои вопросы:
Помимо FK помогает в ограничении отношений, есть ли у него какая-либо другая полезность? Улучшает ли это производительность запросов?
Должен ли я создать индекс для всех столбцов FK (понравился Products.CategoryId) во всех таблицах?