这是我在 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)