将子查询转换为 JSON 性能

Convert subquery to JSON performance

我有以下查询,它有效但需要 30 多分钟才能完成 运行。初始外部查询拉回大约 1400 行,然后子查询在某些情况下拉回 100 奇数行。

;WITH products AS (
  SELECT
    PromotionID,
    ProductColourID,
    ProductCode
  FROM dbo.PromotionProducts
)
SELECT
  P.ID,
  P.Code,
  P.Name,
  P.EndDateTime,
  prods = (
    SELECT
      pp.productColourId,
      pp.ProductCode
    FROM products
    FOR JSON PATH
  )
FROM dbo.Promotion P
JOIN products PP ON P.ID = PP.PromotionID
WHERE P.EndDateTime > GETDATE() 

我能做些什么来加快速度吗?

您的查询看起来不正确,因为子查询与外部查询不相关(因此您将在每个外部行上获得整个 table),并且不必要地第二次加入 products .

相反,只做一个相关的子查询:

SELECT
  P.ID,
  P.Code,
  P.Name,
  P.EndDateTime,
  prods = (
    SELECT
      pp.productColourId,
      pp.ProductCode
    FROM dbo.PromotionProducts PP
    WHERE P.ID = PP.PromotionID
    FOR JSON PATH
  )
FROM dbo.Promotion P
WHERE P.EndDateTime > GETDATE();

为了提高性能,您可能需要以下索引

Promotion (EndDateTime) INCLUDE (ID, Code, Name)
PromotionProducts (PromotionID) INCLUDE (productColourId, ProductCode)