要回答此问题,请查看两者产生的查询计划。
第一个SELECt是一个简单的表扫描,这意味着它将按分配顺序生成行。由于这是一个新表,因此它与您插入记录的顺序匹配。
第二个SELECT添加了GROUP BY,由于估计的行数非常低,因此SQL Server通过不同的排序来实现GROUP
BY。如果您有更多行或将聚合添加到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.FieldValueFROM FieldValues ACROSS JOIN FieldValues BCROSS JOIN FieldValues CCROSS JOIN FieldValues DCROSS JOIN FieldValues ECROSS JOIN FieldValues FSELECt FieldValueFROM #ValuesGROUP BY FieldValueDROP TABLE #Values
由于行数的原因,这变成了哈希聚合,现在查询计划中没有排序。
如果没有ORDER BY,则SQL Server可以以任何顺序返回结果,并且返回顺序是它认为可以最快地返回数据的方式的副作用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)