gpt4 book ai didi

sql - 为什么 SQL Server 2008 在使用 GROUP BY 并且没有指定顺序时排序?

转载 作者:行者123 更新时间:2023-12-03 18:16:52 24 4
gpt4 key购买 nike

我遇到了一个非常奇怪的问题,我还没有找到任何解释。使用 SQL Server 2008 并使用 GROUP BY,它在没有指定任何 ORDER BY 的情况下对我的列进行排序。这是一个演示这种情况的脚本。

CREATE TABLE #Values ( FieldValue varchar(50) )

;WITH FieldValues AS
(
SELECT '4' FieldValue UNION ALL
SELECT '3' FieldValue UNION ALL
SELECT '2' FieldValue UNION ALL
SELECT '1' FieldValue
)
INSERT INTO #Values ( FieldValue )
SELECT
FieldValue
FROM FieldValues

-- First SELECT demonstrating they are ordered DESCENDING
SELECT
FieldValue
FROM #Values

-- Second SELECT demonstrating they are ordered ASCENDING
SELECT
FieldValue
FROM #Values
GROUP BY
FieldValue

DROP TABLE #Values

第一个 SELECT 将返回
4
3
2
1

第二个 SELECT 将返回
1
2
3
4

根据 MSDN Documentation它指出:“GROUP BY 子句不对结果集进行排序”

最佳答案

要回答这个问题,请查看两者生成的查询计划。

第一个 SELECT 是一个简单的表扫描,这意味着它按分配顺序生成行。由于这是一个新表,它与您插入记录的顺序相匹配。

第二个 SELECT 添加一个 GROUP BY,SQL Server 通过不同的排序实现它,因为估计的行数非常低。如果您有更多行或向 SELECT 添加聚合,则此运算符可能会更改。

例如,尝试:

CREATE TABLE #Values ( FieldValue varchar(50) )

;WITH FieldValues AS
(
SELECT '4' FieldValue UNION ALL
SELECT '3' FieldValue UNION ALL
SELECT '2' FieldValue UNION ALL
SELECT '1' FieldValue
)
INSERT INTO #Values ( FieldValue )
SELECT
A.FieldValue
FROM FieldValues A
CROSS JOIN FieldValues B
CROSS JOIN FieldValues C
CROSS JOIN FieldValues D
CROSS JOIN FieldValues E
CROSS JOIN FieldValues F

SELECT
FieldValue
FROM #Values
GROUP BY
FieldValue

DROP TABLE #Values

由于行数的原因,这变成了散列聚合,现在查询计划中没有排序。

在没有 ORDER BY 的情况下,SQL Server 可以以任何顺序返回结果,并且它返回的顺序是它认为如何最快速地返回数据的副作用。

关于sql - 为什么 SQL Server 2008 在使用 GROUP BY 并且没有指定顺序时排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3938234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com