Sql server,对表上的一个简单的select语句总是按照它们插入的顺序返回行吗?

时间:2015-08-20 17:37:50

标签: sql sql-server

我有一个简单的表,用于存储在另一个表上执行的所有操作的历史记录。到目前为止,我们没有通过此历史记录表进行任何特殊订单,只是获取了记录。

我们需要按照在主表上执行操作的顺序在历史记录表中获取这些记录。我们的select语句中没有按时间戳使用任何订单。

碰巧它总是以插入的顺序返回结果,这是执行操作的顺序。

这总是会发生,还是只是巧合?

1 个答案:

答案 0 :(得分:1)

如果没有ORDER BY子句,行顺序永远不会保证。

如果没有ORDER BY子句,服务器将以其选择的任何方式返回记录。这通常是记录保存在磁盘上的值,因为这是最方便的,并且它通常会在大多数设计中将记录添加到表的末尾。但是,订单记录保存在磁盘上是一个实现细节,不能保证查询引擎的行为。在大多数RDBMS中,当删除和添加记录时,您将看到返回的订单记录相对任意。

如果SQL Server中有CLUSTERED索引,它将根据索引按顺序将记录存储在磁盘上以帮助搜索。如果您有一个IDENTITY()值,该值在每个记录上递增,并且该列上的CLUSTERED索引(常见配置),服务器将按照添加顺序大致存储记录,但这可以被覆盖(参见IDENTITY_INSERT },DBCC CHECKIDENT),所以无法保证这种行为。任何一致的行为都应视为设计的附带行为,而不是特征。这不是保证。它不应被视为可靠。服务器正在做最少的努力,而不是尝试与记录顺序保持一致。同样,如果没有ORDER BY,则无法保证返回的记录顺序。

根据关系模型的定义和设计,数据库中记录的顺序并不重要。默认情况下,记录彼此不相关。除非作为开发人员以某种方式存储与RDBMS中所需订单相关的信息,否则无法确定订单记录的添加。

如果订单很重要,您必须使用ORDER BY。如果您需要建立该订单,则必须在选择要存储的数据时自行完成。