表中的隐式ORDER BY顺序

时间:2013-01-30 14:00:37

标签: sql sql-server-2008 sql-order-by

我有一个带有timestamp列和一些其他char列的表。我已按时间戳排序表中的信息,但由于同一时间戳上有更多记录,我不知道显示的订单是否是表中插入的顺序。

可悲的是,桌子上没有索引,所以除了时间戳之外,我没有其他任何东西可以用来订购它们。

示例:

      Timestamp            |    Foregin table    |    Foreign table value

2012-10-09 19:29:50.000    |       tableA        |   "random string here"
2012-10-09 19:29:50.000    |       tableA        |   "different string here"
2012-10-09 19:29:50.000    |       tableB        |   "another random string here"
2012-10-09 19:29:50.000    |       tableC        |   "string here"
2012-10-09 19:29:50.000    |       tableD        |   "another string here"

我运行的查询是这样的:

SELECT *
FROM TABLE
WHERE Timestamp BETWEEN 'x' and 'y'
ORDER BY Timestamp

查看我的结果我假设,但我不确定,查询返回指定列排序的数据,并继续按下一列/列排序结果,以防有多于一列,升序方式(可能按文字长度或按字母顺序排列)。

请您帮我澄清一下这种情况,因为找出订单非常重要。

3 个答案:

答案 0 :(得分:5)

对于未指定ORDER BY的查询,SQL Server通常没有订单保证。因此SELECT * FROM Tbl基本上可以以任意随机顺序返回行。由于数据存储在磁盘上的方式,如果您有一个空的缓存而服务器上没有其他活动,您将以相当高的概率获得磁盘顺序的数据。如果您的服务器上存在其他并发查询且缓存不为空,则该概率会显着下降。因此,虽然您可能会在测试中观察到特定行为,但您在生产中不会获得相同的行为。

也就是说,如果您需要以特定顺序返回行,则需要指定适当的ORDER BY子句。在上面的情况中,您可以使用ORDER BY [Timestamp], [Foreign table], [Foreign table value]来确保记录始终以相同的顺序返回。如果您的查询包含更多列且其中没有一列是唯一的,则您需要将所有这些列添加到ORDER BY。但请记住,涉及的列越多,排序就越昂贵。

答案 1 :(得分:1)

SQL Server将使用显式ORDER BY子句对结果进行排序,并且不会给出ORDER BY子句中所有列相等的结果顺序的gaurantees。

如果您希望按字母顺序按其中一个char列排序,则需要在ORDER BY子句中指定。可能是您当前的结果集以这种方式排序,但这种情况不太可能无限期地继续下去。

答案 2 :(得分:1)

数据库中的表本质上是无序的。这个答案是对塞巴斯蒂安回答的澄清(澄清对于评论来说太长了)。

退货订单随机。这是武断的。并且,它可以从调用更改为调用。在具有删除和插入的表上,后来的记录可以散布在具有较早记录的数据页上。再一次,在数据表中没有排序的概念。排序只是查询语句的一部分。

比系统上运行的其他查询更重要的因素是多线程(以及不太现存的多个分区)。

如果您有一个空缓存,一个不通过索引访问该表的查询,表中没有删除,一个分区和一个单线程系统,那么通常会按插入顺序返回数据。即使在这种情况下,也没有保证。如果您希望按特定顺序排列数据,请使用order by。如果您不希望性能损失,请包含标识主键并将其用于排序。