使用加入和分组依据优化此查询?

时间:2019-11-08 20:31:57

标签: sql sql-server

我可以使用加入和分组依据来优化此查询吗?

 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 个答案:

答案 0 :(得分:1)

对于此查询:

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,它将对子查询进行两次评估。

答案 1 :(得分:1)

由于我们没有表定义,索引,行数或执行计划,因此此处没有太多内容。所有这些都有助于解决性能问题。

我的盲目猜测是尝试外部申请。可能有或没有什么不同,但我实际上无法测试任何东西。我还敦促您始终指定列来自哪个表。不知道的时候真的很难解密。

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;