2016-10-28 85 views
1

我試圖做一個單一的查詢我需要的報告,我不知道如何通過速度問題。更快加入子查詢

預期結果
我需要每個病人一個列上,在同一列其所有的診斷代碼。我的代碼做的工作,幹得不錯,但它增加了我的運行必須根據不同的標準進行30次,將5分鐘的過程大約30

試圖解決
我使用以下代碼左外連接到。

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 1的一個碼提高至1M 12S。如果我自己運行查詢,它需要3分49秒來編譯,所以它在我的主表中有所改進,但如果可能的話,我想盡量減少它。

嘗試其他決議
我試圖創建查詢視圖,並通過這一點,但收到了同樣的運行時間。

我也附加了SourceID,它始終是相同的值,但我的8個表在他們的索引中使用它,但實際上它稍微增加了我的時間。

結論
,我需要合併表中包含大約30萬行是最有可能的問題,周圍有增加的時間沒辦法,但我希望有人可以有一個技巧,可以幫助我減少這個時間。

回答

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)上的索引。