【问题标题】:Replace XML Path Stuff Query替换 XML 路径材料查询
【发布时间】: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


【解决方案1】:

因为您使用的是 SQL Server 2017,所以您可以简单地使用STRING_AGG

SELECT
  S.LOT_0, 
  VarCode  = STRING_AGG(IT6.ID_0, ', '),
  VarShort = STRING_AGG(IT6.SHODES_0, ', '),
  VarLong  = STRING_AGG(IT6.LNGDES_0, ', ')
FROM TOLOT AS S
LEFT JOIN ETMM I
    (INNER JOIN SICOD6 IT6 ON IT6.ID_0 = I.TSICOD_6)
  ON I.ITMREF_0 = S.ITMREF_0
  AND IT6.LNGDES_0 <> '' AND TSICOD_0 = 'OP'
WHERE S.LOT_0 <> ''
GROUP BY
  S.LOT_0;

【讨论】:

  • 性能差异非常大,但我没有得到相同的值。旧:NULL NULL NULL | GEN01 泛型 泛型 | FUG03 FuggleUK Fuggle, 英国 | FUG03 FuggleUK Fuggle, 英国 | CTZ01 CTZ CTZ
  • 新:(没有更多的空值)GEN01 Generic Generic | FUG03,FUG03 FuggleUK,FuggleUK Fuggle, 英国,Fuggle, 英国 | CTZ01,CTZ01,CTZ01 CTZ,CTZ,CTZ CTZ,CTZ,CTZ |
  • 您可以尝试左连接,已编辑
猜你喜欢
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-13
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多