将子查询转换为 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)
我有以下查询,它有效但需要 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)