使用STUFF的SQL Server过程花费了太多时间

时间:2017-07-12 13:58:24

标签: sql sql-server reporting-services ssrs-2012

我有一个简单的查询,我通过STUFFFOR XML PATH选择并插入临时表。

之后,我将这个临时表连接到主表,以根据一些参数获得所需的结果,但这需要太长时间。

我在表上添加了一个聚簇索引,通过它我可以比以前更快地得到STUFF部分查询的结果,但整体结果仍然很慢。

这是我的代码示例:

DECLARE @TEMP_ACAusVertarg TABLE
                           (ACAusVertag NVARCHAR(MAX),
                            IKLeistungserbringer INT,
                            Rechnungsnummer NVARCHAR(MAX) 
                           )

INSERT INTO @TEMP_ACAusVertarg (ACAusVertag, IKLeistungserbringer, Rechnungsnummer)
    SELECT 
        STUFF((SELECT ',' + T1.ACAusVertrag
               FROM   DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMP T1
               WHERE
                   --    Erfassungsart = '1'
                   T1.IKLeistungserbringer = T2.IKLeistungserbringer
                   AND T1.Rechnungsnummer = T2.Rechnungsnummer
               ORDER BY 
                   T2.IKLeistungserbringer, T1.ACAusVertrag
               FOR XML path('')), 1, 1, '') AS ACAusVertrag,
        IKLeistungserbringer, Rechnungsnummer
    FROM 
        DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMP T2
    WHERE 
        T2.Erfassungsart = 1

    SELECT 
        REPORT.Bundesland,
        REPORT.Regionalkennzeichen,
        REPORT.SGS,
        REPORT.AC,
        ACAUSVERTRAG.ACAusVertag,      --NEW
        REPORT.PNR,
        REPORT.Rechnungsnummer,
        REPORT.Zahldatum,
        REPORT.IKRechnungssteller,
        REPORT.NameRechnungssteller,
        REPORT.StrasseRechnungssteller,
        REPORT.PLZRechnungssteller,
        REPORT.OrtRechnungssteller,
        REPORT.IKLeistungserbringer,
        REPORT.NameLeistungserbringer,
        REPORT.StrasseLeistungserbringer,
        REPORT.PLZLeistungserbringer,
        REPORT.OrtLeistungserbringer,
        SUM(REPORT.AnzahlVerordnungen) AS AnzahlVerordnungen
    FROM 
        DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMP REPORT WITH (NOLOCK) 
    INNER JOIN 
        @TEMP_ACAusVertarg  AS ACAUSVERTRAG ON ACAUSVERTRAG.IKLeistungserbringer = REPORT.IKLeistungserbringer
    WHERE   
        SGS = @SGS      
        AND AC = @AC
        AND Bundesland = @Bundesland
        AND Regionalkennzeichen = @Regionalkennzeichen
        AND Jahr = @Jahr
        AND Erfassungsart = '1'
    GROUP BY 
        REPORT.Bundesland, REPORT.Regionalkennzeichen,
        REPORT.SGS, REPORT.AC, REPORT.PNR,
        REPORT.Rechnungsnummer, REPORT.Zahldatum,
        REPORT.IKRechnungssteller, REPORT.NameRechnungssteller,
        REPORT.StrasseRechnungssteller, REPORT.PLZRechnungssteller,
        REPORT.OrtRechnungssteller,
        REPORT.IKLeistungserbringer, REPORT.NameLeistungserbringer,
        REPORT.StrasseLeistungserbringer,
        REPORT.PLZLeistungserbringer, REPORT.OrtLeistungserbringer,
        REPORT.Berichtigungsgrund,
        ACAUSVERTRAG.ACAusVertag 
    ORDER BY 
        REPORT.IKLeistungserbringer

参数值来自SSRS报告。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我通过使用临时表而不是表变量来获得解决方案。而且性能的差异令人惊讶,我在不到5秒的时间内得到了结果,而不是2分钟。

这是我的临时表代码:

IF OBJECT_ID('DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMPtest')  


IS NOT NULL DROP TABLE DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMPtest



        SELECT DISTINCT
  STUFF((
          SELECT ',' + T1.ACAusVertrag
          FROM DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMP T1
          WHERE
           --    Erfassungsart = '1'
             T1.IKLeistungserbringer = T2.IKLeistungserbringer
             AND T1.Rechnungsnummer = T2.Rechnungsnummer

             ORDER BY T2.IKLeistungserbringer,T1.ACAusVertrag
             FOR XML path('')
       ),1,1,'') AS ACAusVertrag,
       IKLeistungserbringer,Rechnungsnummer

       INTO DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMPtest 

       FROM DB_DMA.REPORTING.Report_3_1_2_3_RechnungsuebersichtPapier_DTA_Ebene_2_TEMP T2
WHERE T2.Erfassungsart = 1