Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server过程与占用太多时间的内容_Sql_Sql Server_Reporting Services_Ssrs 2012 - Fatal编程技术网

SQL Server过程与占用太多时间的内容

SQL Server过程与占用太多时间的内容,sql,sql-server,reporting-services,ssrs-2012,Sql,Sql Server,Reporting Services,Ssrs 2012,我有一个简单的查询,在这个查询中,我通过STUFF和FOR XML路径进行选择,并插入到临时表中 在那之后,我将这个临时表连接到主表中,以根据一些参数获得所需的结果,但这需要花费太长的时间 我在表上添加了一个聚集索引,通过它我可以比以前更快地获得查询的结果,但总体结果仍然很慢 以下是我的代码示例: DECLARE @TEMP_ACAusVertarg TABLE (ACAusVertag NVARCHAR(MAX),

我有一个简单的查询,在这个查询中,我通过STUFF和FOR XML路径进行选择,并插入到临时表中

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

我在表上添加了一个聚集索引,通过它我可以比以前更快地获得查询的结果,但总体结果仍然很慢

以下是我的代码示例:

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报告。有什么建议吗?

我通过使用temp表而不是Table变量得到了解决方案。性能上的差异是惊人的,我在不到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

这里有两个问题。你确定哪一个时间最长了吗?嘿@Nick.McDermaid谢谢你的快速回复。第一部分只需要20秒,第二部分需要很长时间与临时表连接,如果我删除连接只需要10秒,那么首先可能尝试一个临时表,并适当索引,看看这是否有帮助。现在是午夜。我明天就来看看你的表现。对不起,尝试使用临时表MyTable而不是表变量@MyTable,然后集中精力进行正确的索引。对于大型数据集,临时表的性能优于变量。