【发布时间】:2021-11-05 11:46:10
【问题描述】:
由于存在性能问题,我想替换以下查询。由于 Table Spool 操作员(Lazy Spool),执行计划给了我很多重新处理
SELECT DISTINCT LOT_0,
VarCode = STUFF(
(
SELECT DISTINCT ', ' + IT6.ID_0
FROM TOLOT S
INNER JOIN ETMM I ON I.ITMREF_0=S.ITMREF_0
INNER JOIN SICOD6 IT6 ON IT6.ID_0=I.TSICOD_6
WHERE IT6.LNGDES_0 <>'' AND LOT_0 <> '' AND TSICOD_0 = 'OP'
AND S.LOT_0=S2.LOT_0
FOR XML PATH (''), TYPE).value ('.[1]', 'nvarchar(max)'), 1, 2, ''
),
VarShort = STUFF(
(
SELECT DISTINCT ', ' + IT6.SHODES_0
FROM TOLOT S
INNER JOIN ETMM I ON I.ITMREF_0=S.ITMREF_0
INNER JOIN SICOD6 IT6 ON IT6.ID_0=I.TSICOD_6
WHERE IT6.LNGDES_0 <>'' AND LOT_0 <> '' AND TSICOD_0 = 'OP'
AND S.LOT_0=S2.LOT_0
FOR XML PATH (''), TYPE).value ('.[1]', 'nvarchar(max)'), 1, 2, ''
)
,VarLong = STUFF(
(
SELECT DISTINCT ', ' + IT6.LNGDES_0
FROM TOLOT S
INNER JOIN ETMM I ON I.ITMREF_0=S.ITMREF_0
INNER JOIN SICOD6 IT6 ON IT6.ID_0=I.TSICOD_6
WHERE IT6.LNGDES_0 <>'' AND LOT_0 <> '' AND TSICOD_0 = 'OP'
AND S.LOT_0=S2.LOT_0
FOR XML PATH (''), TYPE).value ('.[1]', 'nvarchar(max)'), 1, 2, ''
)
FROM TOLOT AS S2
GROUP BY LOT_0
我会很感激你的想法
【问题讨论】:
-
假设您使用的是 SQL Server 的最新(支持)版本,然后使用
STRING_AGG。 -
如果没有,我没有,但你需要那些
DISTINCTs;我怀疑你的连接有问题(显式或横向)。 -
您的外部查询也有一个
DISTINCT和一个GROUP BY;一个问题的明确迹象。您的数据已经位于不同的集合中,因此DISTINCT要么是多余的(只会导致性能下降),要么您的GROUP BY是错误的。我建议前者。 -
您使用的是什么版本的 SQL Server (
select @@version)? -
@Larnu 我会做出改变,我会带着结果回来。
标签: sql tsql for-xml-path stuff