更快加入子查询

时间:2016-10-28 19:27:11

标签: sql sql-server subquery left-join

我正在尝试针对我需要的报告执行单个查询,但我不确定如何解决速度问题。

预期结果
我需要为每位患者提供一行,在同一列中列出所有诊断代码。我的代码确实可以工作并完成工作,但它增加了我的运行,必须在不同的标准下完成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万行,这很可能是问题,并且没有办法解决增加的时间问题,但我希望有人可能有一个技巧可以帮助我减少这段时间。

1 个答案:

答案 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)上使用索引。