小编And*_*elt的帖子

用子查询替换长 GROUP BY 列表

这是我在 Stack Overflow 上的问题的转贴。他们建议在这里问:

我在2005 年找到了一篇在线文章,作者声称,许多开发人员使用 GROUP BY 是错误的,您最好将其替换为子查询。

我已经在我的一个查询中对其进行了测试,我需要根据另一个表中连接条目的数量对搜索结果进行排序(更常见的条目应该首先出现)。我最初的经典方法是将两个表连接到一个公共 ID,按选择列表中的每个字段分组,并按子表的计数对结果进行排序。

现在,来自链接博客的 Jeff Smith 声称,您最好使用一个子选择,它执行所有分组,而不是加入该子选择。检查这两种方法的执行计划,SSMS 指出,大组需要 52% 的时间,子选择需要 48%,所以从技术角度来看,子选择方法实际上要快一点。但是,“改进”的 SQL 命令似乎生成了更复杂的执行计划(就节点而言)

你怎么认为?您能否详细说明在这种特定情况下如何解释执行计划,以及哪一个通常是更可取的选择?

SELECT
    a.ID,
    a.ID_AddressType,
    a.Name1,
    a.Name2,
    a.Street,
    a.Number,
    a.ZipCode,
    a.City,
    a.Country
FROM dbo.[Address] a
INNER JOIN CONTAINSTABLE(
    dbo.[Address],
    FullAddress,
    '"ZIE*"',
    5
) s ON a.ID = s.[KEY]
LEFT JOIN dbo.Haul h ON h.ID_DestinationAddress = a.ID
GROUP BY
    a.ID,
    a.ID_AddressType,
    a.Name1,
    a.Name2,
    a.Street,
    a.Number,
    a.ZipCode,
    a.City,
    a.Country,
    s.RANK
ORDER BY s.RANK DESC, COUNT(*) DESC;

SELECT
    a.ID,
    a.ID_AddressType,
    a.Name1, …
Run Code Online (Sandbox Code Playgroud)

join sql-server subquery

8
推荐指数
1
解决办法
1552
查看次数

标签 统计

join ×1

sql-server ×1

subquery ×1