NEWID()是否会影响记录的排序?

时间:2009-07-05 07:00:56

标签: sql sql-server tsql

这个问题只是为了知识。我没有任何实际的实现。

我发了一个像

这样的查询
SELECT RAND() RANDOMCOLUMNS,COL1

FROM tblY 

ORDER BY RANDOMCOLUMNS

输出:

RANDOMCOLUMNS        COL1
================================
0.567773034904758   1

0.567773034904758   2

0.567773034904758   3

0.567773034904758   4

当我使用NEWID()触发相同的查询时,我得到以下输出

RANDOMCOLUMNS                           COL1
===========================================
B953F9A9-BE22-4651-8669-5CC6A5269911    4

50293D75-4139-4A75-883F-81DAA91ED4E6    1

0A9B1D56-68FD-4060-AA6B-89791DAF8924    3

4C3A2765-4EA2-493B-8AA9-EBA414D7AAC2    2

正如您所看到的,COL1的值顺序已经改变。

问题是为什么以及如何发生的?

据我所知,NEWID()生成唯一的GUID。它是否必须对列排序做任何事情?

提前致谢

2 个答案:

答案 0 :(得分:3)

在第一个示例中,您按RANDOMCOLUMNS排序。但由于每行中的值相同,因此订单未被修改。在第二个示例中,您将按每列具有不同值的列进行排序。 SQL Server中的Sorting by GUID is strange,但仍然按该列排序,因为它在您的ORDER BY子句中。

答案 1 :(得分:2)

  • 在查询1中,您对常量(每 SELECT )RAND()值进行排序
  • 在查询2中,您要对动态(每)NEWID()值进行排序

在两个查询中,Col1输出顺序无关紧要,因为您没有提及它。由于优化器决定从表中读取数据,因此在查询1中按顺序排列Col1只是纯属巧合。

除非使用ORDER BY子句,否则无法保证输出顺序。您没有在Col1上指定任何排序,因此这是标准行为。