2

我有一个带有时间戳列和其他一些字符列的表。我已按时间戳对表中的信息进行排序,但由于同一时间戳上有更多记录,我不知道显示的顺序是否是它们插入表中的顺序。

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

例子:

      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

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

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

4

3 回答 3

8

对于未指定ORDER BY. 所以 aSELECT * FROM Tbl基本上可以以任何随机顺序返回行。由于数据在磁盘上的存储方式,如果您有一个空缓存并且服务器上没有其他活动,您将以相当高的概率按磁盘顺序获取数据。如果您的服务器上有其他并发查询并且缓存不为空,则该概率会大大降低。因此,虽然您可能会在测试中观察到特定行为,但在生产中不会得到相同的行为。

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

于 2013-01-30T14:17:02.333 回答
1

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

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

于 2013-01-30T14:17:05.973 回答
1

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

退货顺序不是随机的。这是任意的。而且,它可以从调用变为调用。在具有删除和插入的表上,以后的记录可以散布在具有较早记录的数据页上。再一次,在数据表中没有排序的概念。排序只是查询语句的一部分。

与系统上运行的其他查询相比,一个更大的因素是多线程(以及较少存在的多个分区)。

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

于 2013-01-30T14:56:58.013 回答