我正在使用SQL Server 2016
我在下面的查询中使用了View - VW_Merchant
select * from VW_Merchant需要1秒钟才能加载近18k的所有记录
我想从该视图中创建记录中的自定义json。 我创建了以下查询 -
在下面的查询中有一个名为: - PayerName,它是json中的数组
DECLARE @Merch_Uid AS UNIQUEIDENTIFIER ='SOMEUID'
SELECT DISTINCT MerchId, DisplayOrder, TimeStamp ,MerchName,
(
SELECT DISTINCT ISNULL(PayerName,'') PayerName FROM
VW_Merchant WHERE
Merch_Uid=@Merch_Uid AND
MerchId = M.MerchId
FOR Json PATH ) AS PayerName
FROM VW_Merchant M
WHERE Merch_Uid=@Merch_Uid
上面的查询给了我完整的记录集,但唯一的问题是加载json需要15秒。
如果我删除PayerName标记,它会将其减少到5秒。
使用PayerName标记可以更快地运行查询?
答案 0 :(得分:1)
这是您的查询:
DECLARE @Merch_Uid AS UNIQUEIDENTIFIER ='SOMEUID'
SELECT DISTINCT MerchId, DisplayOrder, TimeStamp, MerchName,
(SELECT DISTINCT COALESCE(m2.PayerName, '') as PayerName
FROM VW_Merchant m2
WHERE m2.Merch_Uid = @Merch_Uid AND
m2.MerchId = M.MerchId
FOR Json PATH
) AS PayerName
FROM VW_Merchant M
WHERE m.Merch_Uid = @Merch_Uid;
我会把它重写为:
SELECT MerchId, DisplayOrder, TimeStamp, MerchName,
(SELECT DISTINCT COALESCE(m2.PayerName, '') as PayerName
FROM VW_Merchant m2
WHERE m2.Merch_Uid = @Merch_Uid AND
m2.MerchId = M.MerchId
FOR Json PATH
) AS PayerName
FROM (SELECT DISTINCT MerchId, DisplayOrder, TimeStamp, MerchName
FROM VW_Merchant M
WHERE m.Merch_Uid = @Merch_Uid;
) M;
然后,我将确保视图具有索引以利用WHERE
过滤。优化视图可能是性能的最佳选择。
如果您使用的是SQL Server 2017,我建议使用string_agg()
进行解决方法。