我有一个表,其中包含一个时间戳列和其他几个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回顾我的结果,我假设,但我不确定,查询返回按指定列排序的数据,并继续按下一列或多列以升序方式(可能是按文本长度或按字母顺序)对结果进行排序。
你能帮我弄清楚这件事吗?因为弄清楚订单对我来说很重要。
发布于 2013-01-30 22:17:02
对于未指定ORDER BY的查询,SQL Server通常没有顺序保证。因此,SELECT * FROM Tbl实质上可以以任何随机顺序返回行。由于数据在磁盘上的存储方式,如果您有一个空的缓存,并且服务器上没有正在进行的其他活动,那么您将以相当高的概率获得磁盘上的数据。如果您的服务器上有其他并发查询,并且缓存不为空,则该概率会显着降低。因此,虽然您可能会在测试中观察到特定的行为,但在生产中不会获得相同的行为。
也就是说,如果需要按特定顺序返回行,则需要指定适当的ORDER BY子句。在上面的例子中,你可以使用ORDER BY [Timestamp], [Foreign table], [Foreign table value]来确保记录总是以相同的顺序返回。如果您的查询包含更多列,并且它们都不是惟一的,那么您也需要将所有这些列都添加到ORDER BY中。但请记住,列越多,排序的开销就越大。
发布于 2013-01-30 22:17:06
SQL Server将使用显式ORDER BY子句对结果进行排序,并且不会为ORDER BY子句中所有列都相等的结果的顺序提供任何保证。
如果您希望它按其中一个字符列的字母顺序排序,则需要在ORDER BY子句中指定它。您当前的结果集可能是以这种方式排序的,但这种情况不太可能无限期地持续下去。
发布于 2013-01-30 22:56:58
数据库中的表本质上是无序的。这个答案是对Sebastian的回答的澄清(澄清太长了,无法发表评论)。
返回顺序不是随机的。这是武断的。而且,它可以从一个调用更改为另一个调用。在一个既有deletes又有inserts的表上,后面的记录可以与前面的记录一起散布在数据页上。同样,在数据表中也没有排序的概念。排序只是查询语句的一部分。
与系统上运行的其他查询相比,一个更大的因素是多线程(以及较少存在的多个分区)。
如果您有一个空缓存、一个不通过索引访问表的查询、表中没有删除、单个分区和单线程系统,那么数据通常将按插入顺序返回。然而,即使在这种情况下,也不能保证。如果希望数据按特定顺序排列,请使用order by。如果不想影响性能,可以包含一个标识主键并将其用于排序。
https://stackoverflow.com/questions/14605813
复制相似问题