Как я могу решить проблему производительности в SQL-запросе? - PullRequest
0 голосов
/ 11 июня 2019

Все разработчики знают, что "IN" и DISTINCT создают проблему для всех SQL-запросов.Мой коллега создал запрос ниже, но теперь он не работает в моей компании. Пожалуйста, посмотрите код ниже.Как настроить мой запрос на высокую производительность?

    SELECT  xxx
        , COUNT(DISTINCT Id) Count
FROM    Test (NOLOCK)
WHERE   IsDeleted = 0
        AND xxx IN
        (
            SELECT  CAST(value AS INT)
            FROM    STRING_SPLIT(@ProductIds, ',')
        )
GROUP BY xxx

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Все разработчики знают, что "IN" и DISTINCT создают проблему для всех SQL-запросов.

Это не обязательно так.Они ухудшают производительность, но иногда они необходимы.

IN, вероятно, не имеет большого значения.Это оценивается один раз.Если у вас есть другой способ передачи списка - скажем, с использованием временной таблицы - это лучше.

COUNT(DISTINCT id) является подозрительным.Я ожидаю, что id уже будет уникальным.Если так, то просто используйте COUNT(*).

WITH (NOLOCK) не рекомендуется, если вы действительно не знаете, что делаете.Работа с данными, которые могут быть противоречивыми, опасна.

1 голос
/ 11 июня 2019
  1. лучше создать индекс для столбца XXX
1 голос
/ 11 июня 2019

Я использовал Sentry One Plan Explorer, чтобы помочь найти точки настройки запросов, с которыми у меня возникают проблемы с производительностью: https://www.sentryone.com/plan-explorer

Сначала вам нужно решить, какова производительность вашей среды, затем найти худшие части запроса и оптимизировать их в первую очередь.

Наконец, рассмотрите, как вы храните свои данные, поищите места, в которых имеет смысл добавить индекс, если это необходимо.

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