表中的隐式ORDER BY顺序

Rad*_*hiu 2 sql sql-order-by sql-server-2008

我有一个带有时间戳列和一些其他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"
Run Code Online (Sandbox Code Playgroud)

我运行的查询是这样的:

SELECT *
FROM TABLE
WHERE Timestamp BETWEEN 'x' and 'y'
ORDER BY Timestamp
Run Code Online (Sandbox Code Playgroud)

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

能否帮我澄清一下这种情况,因为找到订单对我来说非常重要.

Seb*_*ine 6

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

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