Есть ли какая-то проблема с параметрами в SQL-запросе выбора в SQL Azure? - PullRequest
0 голосов
/ 27 марта 2019

Я пытаюсь найти, где проблема с этим запросом выбора в SQL Azure.Он работает около 700 мс.

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]

Когда я изменил его на это (удалите параметры и непосредственно введите значения).

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 (11,14)
GROUP BY [G].[Id], [G].[Name]
ORDER BY [G].[Name]

Он работает только около 80 мс.Таким образом, разница во времени выполнения составляет около 620 мс, и я не понимаю, почему.

Я попытался скопировать базу данных из Azure в локальную версию MSSQL 2017 Developer Edition через bacpac и выполнить те же запросы.Время работы было примерно одинаковым.

1 Ответ

1 голос
/ 28 марта 2019

Причина в том, что 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) - Запрос .

Вы также можете сослаться на этот случай: Почему параметризованный запрос создает значительно более медленный план запроса по сравнению с непараметрическим запросом.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...