Оптимизировать этот запрос, используя Join и Group By? - PullRequest
0 голосов
/ 08 ноября 2019

Могу ли я оптимизировать этот запрос, используя объединение и группирование по?

 SELECT PM.Program_ID, 
                PM.[Program_Name], 
                ISNULL(
         (
             SELECT TOP 1 VF.ReadBy
             FROM VVF_ScriptFlow VF
             WHERE VF.ProgramId = PM.Program_ID
             ORDER BY VF.Id DESC
         ), 'NA') AS CurrentOwner
         FROM Program_Master PM
         WHERE PM.Department_ID = @DepartmentId;
     END;

Ответы [ 2 ]

1 голос
/ 08 ноября 2019

Здесь не так много, поскольку у нас нет определений таблиц, индексов, количества строк или плана выполнения. Все это полезно при решении проблем с производительностью.

Мое слепое предположение - попробовать НАРУЖНОЕ ПРИМЕНЕНИЕ. Это может быть или не быть чем-то другим, но я не могу ничего проверить. Я также призываю вас всегда указывать, из какой таблицы происходит столбец. Это действительно трудно расшифровать, когда вы не знаете.

SELECT 
    pm.Program_ID, 
    pm.[Program_Name],
    ISNULL(x.ReadBy, 'NA') AS CurrentOwner
FROM Program_Master pm
outer apply
(
    SELECT TOP 1 sf.ReadBy 
    FROM VVF_ScriptFlow sf
    WHERE sf.ProgramId = pm.Program_ID 
    ORDER BY sf.Id DESC
) x
WHERE pm.Department_ID = @DepartmentId;
1 голос
/ 08 ноября 2019

Для этого запроса:

SELECT pm.Program_ID, pm.[Program_Name],
       isnull((select top 1 s.ReadBy
               from VVF_ScriptFlow s
               where s.ProgramId = pm.Program_ID  -- hope I got the table alisses right
               order by Id desc
              ), 'NA') as CurrentOwner
FROM Program_Master pm
WHERE Department_ID = @DepartmentId;

Вам нужны два индекса:

  • Program_Master(Department_Id, Program_ID, [Program Name]
  • VVF_ScriptFlow(ProgramId, id desc, ReadBy)

Я сомневаюсь, что вы получите лучшую производительность с этими индексами.

Обратите внимание, что это один из случаев, когда вы хотите использовать ISNULL() вместо COALESCE(). SQL Server довольно глупо относится к тому, как он относится к COALESCE() (ну, я мог бы сказать, что он неправильный в интерпретации стандарта);с COALESCE() он будет оценивать подзапрос дважды, когда значение не равно NULL.

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