2017-07-12 18 views
0

STUFFとを選択してテンポラリテーブルに挿入する簡単なクエリがあります。SQL ServerプロシージャSTUFFに時間がかかりすぎる

その後、私はいくつかのパラメータに基づいて望ましい結果を得るために、この一時テーブルをメインテーブルに結合しています。しかし、それはずっと長くかかります。

テーブルのクラスター化されたインデックスを追加しました。クエリの一部が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レポートから来ている:

は、ここに私のコードサンプルです。何か提案してください?

+0

ここに2つのクエリがあります。あなたはどれが一番長いかを確立しましたか? –

+0

ちょっと@Nick.McDermaidは素早い応答に感謝します。最初の部分は20秒しかかからず、2番目の部分はTEMPテーブルとの結合で長時間かかります.10秒かかります。 – swat

+0

最初にテンポラリテーブルを試してみてください。 https://stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server –

答えて

1

私は、TEMP変数ではなくTEMPテーブルを使用して解決策を得ました。パフォーマンスの差は驚くべきことですが、2分ではなく5秒未満で結果が得られました。 ここにTempテーブルのコードです。

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 
関連する問題