Причина в том, что SQL Server не всегда выбирает лучший план выполнения для ваших запросов
и, к счастью, есть несколько различных советов, которые можно использовать, чтобы заставить SQL Server использовать один план выполнения поверх другого. Одна из проблем, с которой вы можете столкнуться, - это использование параметров в предложении WHERE, иногда запрос выполняется отлично, а иногда - очень медленно.
Как уже упоминалось выше, SQL Server предлагает множество советов, которые можно использовать, чтобы принудительно составить план выполнения. Опция, которая нас интересует, это опция OPTIMIZE FOR. Это позволит нам указать, какое значение параметра мы хотим, чтобы SQL Server использовал при создании плана выполнения.
Пожалуйста, обратитесь к этому руководству: Оптимизация запросов, управляемых параметрами, с помощью SQL Server. ОПТИМИЗАЦИЯ ДЛЯ ПОДСКАЗКИ .
Может быть, вы можете изменить код, подобный этому, и протестировать снова.
DECLARE @LanguageIds1 INT = 11;
DECLARE @LanguageIds2 INT = 14;
SELECT
[G].[Id],
[G].[Name],
COUNT(*) AS [AudiobookCount]
FROM [Genre] AS [G]
INNER JOIN [Audiobook2Genre] AS [A2G] ON [A2G].[GenreId] = [G].[Id]
INNER JOIN [Audiobook] AS [A] ON [A].[Id] = [A2G].[AudiobookId]
WHERE [A].[LanguageId] IN (@LanguageIds1,@LanguageIds2)
GROUP BY [G].[Id], [G].[Name]
ORDER BY [G].[Name]
OPTION (OPTIMIZE FOR (@LanguageIds1= 11,@LanguageIds2= 14))
Для получения более подробной информации: вы можете увидеть Подсказки (Transact-SQL) - Запрос .
Вы также можете сослаться на этот случай: Почему параметризованный запрос создает значительно более медленный план запроса по сравнению с непараметрическим запросом.
Надеюсь, это поможет.