我可以使用加入和分组依据来优化此查询吗?
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;
答案 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;