You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

子查询含常量时GROUP BY与DISTINCT的性能差异及调优问题

现象说明

我在子查询中引入常量is_issued = 1时,使用GROUP BY和DISTINCT会出现明显性能差异,若移除该常量,两个查询运行效率一致。

GROUP BY版本查询

该查询耗时超过15分钟,代码如下:

/*耗时10分钟以上*/
SELECT ld.[LNum],
       is_lease_insured = CAST(COALESCE(i.is_issued, 0) AS BIT)
FROM [dbo].[snapshot_ld] ld
    LEFT JOIN
    (
        SELECT LNum = value,
               i.snapshot_date,
               is_issued = 1
        FROM [dbo].[snapshot_ip] i
            CROSS APPLY STRING_SPLIT(i.LNum, ',')
        GROUP BY value,
                 i.snapshot_date
    ) i
        ON ld.[LNum] = i.LNum
           AND ld.snapshot_date = i.snapshot_date
WHERE ld.RowIsDeleted = 0
      AND ld.bimonthly_snapshot_date_flag = 1;

DISTINCT版本查询

逻辑与上述查询一致,耗时仅2秒,代码如下:

/*耗时2秒*/
SELECT ld.LNum,
       is_lease_insured = CAST(COALESCE(i.is_issued, 0) AS BIT)
FROM [dbo].[snapshot_ld] ld
    LEFT JOIN
    (
        SELECT DISTINCT
               lno = value, /*添加DISTINCT,移除GROUP BY*/
               i.snapshot_date,
               is_issued = 1
        FROM [dbo].[snapshot_ip] i
            CROSS APPLY STRING_SPLIT(i.LNum, ',')
    --GROUP BY value, i.snapshot_date
    ) i
        ON ld.LNum = i.lno
           AND ld.snapshot_date = i.snapshot_date
WHERE ld.RowIsDeleted = 0
      AND ld.bimonthly_snapshot_date_flag = 1;

疑问

目前不确定是直接选用性能更好的DISTINCT版本承担后续性能波动风险,还是有方案可以对GROUP BY版本进行调优,恳请大家提供相关建议。


内容的提问来源于stack exchange,提问作者Santhoshkumar KB

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 04:57:06