SQL Server过程与占用太多时间的内容
我有一个简单的查询,在这个查询中,我通过STUFF和FOR XML路径进行选择,并插入到临时表中 在那之后,我将这个临时表连接到主表中,以根据一些参数获得所需的结果,但这需要花费太长的时间 我在表上添加了一个聚集索引,通过它我可以比以前更快地获得查询的结果,但总体结果仍然很慢 以下是我的代码示例: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),
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,然后集中精力进行正确的索引。对于大型数据集,临时表的性能优于变量。