Вам сказали в комментариях, что принуждение движка к использованию специального индекса - в большинстве случаев - не лучшая идея. Движок довольно хорош в поиске лучшего плана, и он будет работать лучше всего, если вы отпустите его по собственному маршруту.
Во-вторых, вам уже сказали, что план выполнения - это лучшее место для начала. Поскольку мы не видим каких-либо подробностей, следующее является простым предположением:
Если я получу это правильно, ваш запрос будет использовать CollectionId
для фильтрации по одному заданному идентификатору (только очень мало строк политики). Для этих строк JOIN на VIEW (мы не знаем, что за этим стоит!) Пытается связать отдельные строки.
Фильтр должен работать с очень сокращенным набором.
ВашНаблюдения позволяют предположить, что вторая строка в WHERE
имеет дело с гораздо большим множеством. Я почти уверен, что фильтр для CollectionId=10003
вытягивает после другого фильтра ... План выполнения покажет детали ...
Что вы можете сделать:
- Уберите индексную подсказку
- Попробуйте добавить вторую строку в WHERE с
AND
в ON
-пункте JOIN.
Нечто подобное:
SELECT
[Policy].[Value] AS [PolicyId]
,[Person].[Value] AS [PersonId]
,[Person].[Index] AS [PersonIndex]
FROM
[dbo].[View] AS [Policy]
INNER JOIN [dbo].[ViewPerson] AS [Person] ON ([Policy].[CollectionId] = [Person].[CollectionId]
AND [Person].[Name] = 'PersonId'
AND [Policy].[Name] = 'PolicyId'
AND [Policy].[Value] = [Person].[Value])
WHERE
[Policy].[CollectionId] = 10003;