我正在尝试针对我需要的报告执行单个查询,但我不确定如何解决速度问题。
预期结果
我需要为每位患者提供一行,在同一列中列出所有诊断代码。我的代码确实可以工作并完成工作,但它增加了我的运行,必须在不同的标准下完成30次,并且将进行大约30分钟的5分钟处理。
尝试解决
我使用以下代码将外连接保留到。
left outer join (Select distinct add2.VisitID,
substring((Select ', '+add1.Diagnosis AS [text()]
From AbsDrgDiagnoses add1 Where add1.VisitID = add2.VisitID
ORDER BY add1.VisitID,DiagnosisSeqID For XML PATH ('')), 2, 1000) DiagText
From [Livendb].[dbo].[AbsDrgDiagnoses] add2) add3 on diag.VisitID = add3.VisitID
结果
这可以工作,但我的9秒查询一个月的数据只有一个过滤器,其中一个30个代码中的一个增加到1m 12s。如果我自己运行查询,编译需要3分49秒,所以它在我的主表中有所改进,但如果可能的话我想减少它。
其他尝试的决议
我试图从查询创建一个视图并使用它,但收到相同的运行时间。
我还附加了SourceID,它始终是相同的值,但我的8个表在它们的索引中使用了它,但它实际上略微增加了我的时间。
结论
我需要合并的表包含大约3000万行,这很可能是问题,并且没有办法解决增加的时间问题,但我希望有人可能有一个技巧可以帮助我减少这段时间。
答案 0 :(得分:2)
这是你的子查询:
(Select distinct add2.VisitID,
substring((Select ', '+add1.Diagnosis AS [text()]
From AbsDrgDiagnoses add1
Where add1.VisitID = add2.VisitID
order by add1.VisitID,DiagnosisSeqID
For XML PATH ('')
), 2, 1000) DiagText
From [Livendb].[dbo].[AbsDrgDiagnoses] add2
) add3
on diag.VisitID = add3.VisitID
让我假设当你删除它时,查询很快。
我认为outer apply
会更好:
outer apply
(select stuff((Select ', ' + add1.Diagnosis as [text()]
From AbsDrgDiagnoses add
Where diag.VisitID = add.VisitID
order by DiagnosisSeqID
For XML PATH ('')
), 1, 2, '') DiagText
) add3
我无法想象第二级子查询实际上有助于提高性能。
而且,谈到性能,您可以在AbsDrgDiagnoses(VisitID, DiagnosisSeqID, Diagnosis)
上使用索引。