swat
swat

Reputation: 79

SQL Server procedure with STUFF taking too much time

I have a simple query in which I am selecting through STUFF and FOR XML PATH and inserting into a temp table.

After that, I am joinig this temp table to the main table to get the desired result based on some parameters, but it is taking too long.

I added a clustered index on the table by which I could get the result of STUFF part of the query little faster than earlier but the overall result is still slow.

Here is my code sample:

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

Parameter values are coming from SSRS Report. Any suggestions please?

Upvotes: 0

Views: 1030

Answers (1)

swat
swat

Reputation: 79

I got the Solution by using the temp Table rather than table variable. And the difference in performance is amazing i got the result in less than 5 seconds instead of 2 minutes.

Here is my code for temp Table:

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

Upvotes: 1

Related Questions