每当我在 SQL Server Management Studio 2008(数据库是 SQL Server 2005)的表中手动插入一行时,我的新行就会出现在列表的顶部而不是底部。我正在使用身份列,这会导致诸如
id row
42 first row
1 second row
2 third row
Run Code Online (Sandbox Code Playgroud)
当获取行且未明确排序时。当为 Web 应用提取行并更改TOP 1
查询返回的内容时,这会导致不同的外观。
我知道我可以order by
,但为什么会发生这种情况?我的大部分数据都是通过 Web 应用程序插入的,从该应用程序插入的所有数据都按照先进先出的顺序进行,例如,最新的插入位于底部,因此 ID 都在一行中。服务器或 Management Studio 中是否有某些设置会导致这种不正确的排序?
表Client
字段上有一个聚集索引LastName
。
当我简单地从表中转储所有记录时,它们会按字母顺序出现,除非(nolock)
在相关查询中使用了提示。该提示会更改记录的顺序。应该是?。我很肯定没有其他会话有更改该表的开放事务(至少sp_who2
没有向我显示任何内容)。
如何解释顺序上的差异?
从评论中提取的其他信息:
没有顺序。非聚集索引是否应该强制执行顺序?
即使使用指定聚集索引的索引提示,查询仍然返回不同的顺序。他们应该吗?我想知道为什么nolock
在没有明显改变计划的情况下更改返回记录的顺序。
我对它们做了一个 WinDiff - 除了 [the] (nolock)
[query hint]之外相同。
我们都知道一个简单的语句例如:
SELECT * FROM stuff;
Run Code Online (Sandbox Code Playgroud)
应该不会产生有序的结果。然而,当我试图证明这一点时,它总是以主键顺序出现。
此外还有一个声明,例如:
SELECT thing,whatever FROM stuff
GROUP BY thing,whatever;
Run Code Online (Sandbox Code Playgroud)
似乎总是按GROUP BY
子句中的最后一个字段对事物进行排序,这根本没有帮助。
问题是,在什么情况下 SQL SERVER 会在未询问的情况下对结果进行排序,我该怎么做才能阻止这种情况?
我试图向我的学生证明,除非指定,否则顺序是不确定的,但这对我的情况没有帮助。
我承认我正在处理一小组样本数据。
谢谢