2017-03-07 96 views
0

我有一个表具有主键并以升序索引,但是当我编写select查询时,它不会以升序显示。索引列未按升序排列

when select the table

Index added

但在SQL Server中,主键列将显示在升序排列。为什么不在这里?我错过了什么?

+1

当你写的选择查询,你总是需要使用'ORDER BY'为保证订货行 –

+0

,但在SQLSERVER,为了通过是没有必要的,当我们有主键和索引 –

+1

@King_Fisher它始终是必要的,包括如果您想要*保证*订单,请订购。只是在真正简单的查询中,DBMS最容易给出的顺序是磁盘上的行顺序,这对于集群主键来说很方便。这不是SQL Server曾向你承诺过的,它只是你习惯的一种懒惰的快捷方式。 – IMSoP

回答

4

表中的行没有特定的顺序(好吧,它们可能在下面,但它们不需要,DBMS没有义务告诉你它是什么)。

结果的顺序由您提供的ORDER BY子句指定。如果在查询中不使用ORDER BY子句,则DBMS可以按照它喜欢的任何顺序自由返回结果。对于一个简单的查询,这将是通常是是它们在磁盘上存在的顺序,尽管只要从单个表中超出SELECT *,它可能会完全不同。

你可能在SQL Server中有一个“聚簇索引”,它根本不是一个索引,它是按特定顺序将行存储在磁盘上以便更快访问的一条指令。由于它们通常会按顺序从磁盘中检索,所以没有ORDER BY的(简单)查询通常最终会按照该顺序显示它们。不过这不是你应该依赖的东西。

磁盘上的行顺序在Postgres中特别不太可能有用,因为它使用了一种叫做“MVCC”的方式,在这种情况下更新行实际上会在磁盘上创建一个新记录并将旧记录标记为不活动(这是一种方式在不锁定表的情况下处理交易)。这使得对比度特别明显,但是在任何DBMS中的规则都是相同的:如果要获得特定的结果顺序,请使用ORDER BY

+0

很好,我可以使用order by。我只是想知道为什么它有不同的表现。谢谢 –

+0

@King_Fisher希望,现在你知道了:) – IMSoP

+0

我同意你提到的第四点。这是它显示最后修改的记录,当没有订单时选择 –

1
  • 建立索引时,通常使用默认选项创建索引,索引按升序创建。这通常是
    创建索引的最合理的方式,所以最新的数据或者最小的值在顶部,而最早的或者最大的值在
    的末端。虽然通过这种方式创建索引来搜索索引效果很好,但您是否曾想过要始终返回最近的数据? 有关详细信息,请访问网页:

https://www.mssqltips.com/sqlservertip/1337/building-sql-server-indexes-in-ascending-vs-descending-order/

  • 索引基本上是用来内部数据库进程访问数据 的快捷方式。这不会显示为根据 索引的数据。

  • 用于以升序降序显示记录需要 手动写入。