Json创作花了一些时间

时间:2018-05-30 06:46:47

标签: sql sql-server join

我正在使用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标记可以更快地运行查询?

1 个答案:

答案 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()进行解决方法。