MarkNinja Ответов: 2

Как я могу оптимизировать этот запрос


Я пытаюсь оптимизировать этот запрос так как он является тяжелым ресурсоемким в БД

Что я уже пробовал:

INSERT      @UserNotes
SELECT      pn.pkfkGroupCode,
            pn.pkfkGroupDivisionCode,
            pn.pkfkDivisionMasterPolicyID,
            '',
            pn.pkfkPolicyNumber,
            pn.pkPolicyNotesID,
            CASE
                  WHEN LEN(LTRIM(RTRIM(Note))) > 20 THEN LEFT(Note,17) + '...'
                  ELSE LTRIM(RTRIM(Note))
            END AS 'NoteHeader',
            LTRIM(RTRIM(ISNULL(pn.Note,''))), 
            CASE
                  WHEN ISNULL(ActionFlag,'') = 'I' THEN 'Incomplete'
                  WHEN ISNULL(ActionFlag,'') = 'T' THEN 'To Follow Up'
                  WHEN ISNULL(ActionFlag,'') = 'C' THEN 'Complete'
                  WHEN ISNULL(ActionFlag,'') = 'U' THEN 'Unassigned'
            END AS 'Status',
            CONVERT(char(10),CaptureDate,111) AS 'CaptureDate',
            ISNULL(CONVERT(char(10),ActionDate,111),'') AS 'ActionDate',
            ISNULL(CONVERT(char(7),ActionDate,111),'') AS 'DueMonth',
            pn.fkUserID AS 'AssignedBy',
            '',
            ISNULL(AssignedTo,0) AS 'AssignedTo',
            ''
FROM  PolicyNotes pn WITH (NOLOCK)
WHERE (
            pn.fkUserID = CAST(@UserID as varchar(255))
            OR
            ISNULL(pn.AssignedTo,0) = @UserID
            OR
            (
            ISNULL(@PolicyID,0) <> 0 AND ISNULL(pn.AssignedTo,'0') <> CAST(@UserID as varchar(255)) AND ISNULL(fkUserID,'0') <> CAST(@UserID as varchar(255)) AND ISNULL(ActionFlag,'') <> '' AND ActionDate IS NOT NULL
            )
            OR
            (
            ISNULL(pn.AssignedTo,0) = 0 AND ISNULL(ActionFlag,'') = 'U' AND ActionDate IS NOT NULL AND fkUserID IN
            (
                  SELECT      CAST(fkUserID as varchar(255))
                  FROM  SystemControl_Live.dbo.aa_UserTaskGroup
                  WHERE fkTaskGroupID IN
                  (
                        SELECT fkTaskGroupID
                        FROM  SystemControl_Live.dbo.aa_UserTaskGroup
                        WHERE fkUserID = @UserID
                  )
            )
            )
            )
AND         ISNULL(UPPER(LTRIM(RTRIM(pn.ActionFlag))),'N') NOT IN ('N','')
AND         LTRIM(RTRIM(ISNULL(Note,''))) <> ''
AND         (@GroupCode IS NULL OR pn.pkfkGroupCode = @GroupCode)
AND         (@GroupDivisionCode IS NULL OR pn.pkfkGroupDivisionCode = @GroupDivisionCode)
AND         (@DivisionMasterPolicyID IS NULL OR pn.pkfkDivisionMasterPolicyID = @DivisionMasterPolicyID)
AND         (@PolicyNumber IS NULL OR pn.pkfkPolicyNumber = @PolicyNumber)
--Donovan -- remove completed items from list
AND			isnull(pn.ActionFlag,'') <> 'C'
ORDER BY
            ISNULL(ActionDate,'') ASC, pkfkPolicyNumber, CaptureDate

ZurdoDev

Убедитесь, что у вас есть соответствующие индексы. Попробуйте удалить функции where WHERE предложение, если это возможно. SQL обычно не может использовать индекс для поля, если оно обернуто в функцию. Сузьте круг, если есть 1 или 2 конкретных вещи, которые замедляют его. Сначала посмотрите на сброс некоторых результатов во временную таблицу, а не на многоуровневые выборки.

Другими словами, начните пробовать много вещей.

Maciej Los

Какая версия sql server?

2 Ответов

Рейтинг:
6

CHill60

Далее к комментариям и решению выше...
У вас есть много вещей, таких как

CONVERT(char(10),CaptureDate,111) AS 'CaptureDate',
Почему? Правильно используйте даты и преобразуйте их в "читаемый" формат только тогда, когда вы представляете их в пользовательском интерфейсе.

То же самое относится и к таким вещам, как
CAST(fkUserID as varchar(255))
Подумайте об упрощении этого ужасного предложения WHERE, используя временную таблицу(ы) или табличную переменную(ы) - см. комментарий от @ZurdoDev

Если вы используете SQL Server 2017 или выше замените
LTRIM(RTRIM(Note))
с
TRIM(Note)
Вы должны попытаться переосмыслить свой подзапрос внутри подзапроса внутри where....
SELECT      CAST(fkUserID as varchar(255))
FROM  SystemControl_Live.dbo.aa_UserTaskGroup
WHERE fkTaskGroupID IN
(
      SELECT fkTaskGroupID
      FROM  SystemControl_Live.dbo.aa_UserTaskGroup
      WHERE fkUserID = @UserID
)
Я думаю, что это должно работать так же хорошо (хотя стоит проверить ваши данные)
SELECT CAST(A.fkUserID as varchar(255))
FROM  SystemControl_Live.dbo.aa_UserTaskGroup A
INNER JOIN SystemControl_Live.dbo.aa_UserTaskGroup B ON A.fkTaskGroupID = B.fkTaskGroupID AND B.fkUserID = @userID


Maciej Los

Хорошие моменты!

Рейтинг:
0

Maciej Los

Извините, но мы ничем не можем вам помочь. У нас нет доступа к вашим данным и даже к вашему экрану.
Пожалуйста, следуйте за этим: Как оптимизировать SQL-запросы (советы и методы)[^]
Одним из самых полезных инструментов является Профилировщик SQL Server[^]
Для получения более подробной информации, пожалуйста, смотрите:
Запуск SQL Server Profiler - SQL Server | Microsoft Docs[^]
Средства мониторинга и настройки производительности - SQL Server | Microsoft Docs[^]
Подсказки запросов (Transact-SQL) - SQL Server | Microsoft Docs[^]

Кстати: производительность запроса зависит от многих других факторов, таких как таблица индексирования производительности SQL Server и др.


CHill60

5 б

Maciej Los

Спасибо, Кэролайн.