2017-03-07 97 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/

  • 索引基本上是用來內部數據庫進程訪問數據 的快捷方式。這不會顯示爲根據 索引的數據。

  • 用於以升序降序顯示記錄需要 手動寫入。