我有一个简单的查询,我通过STUFF
和FOR 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报告。有什么建议吗?
答案 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