首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL Server 唯一約束自動排序原理:索引特性導致資料順序變更

     編輯:程式設計綜合問答

現象

建立主鍵(叢集索引)後,對另一欄位加 UNIQUE 約束,該欄位資料自動按遞增排序顯示。

根本原因

  • UNIQUE CONSTRAINT 在 SQL Server 內部以 唯一非叢集索引 實作。
  • 索引(叢集或非叢集)的本質是有序資料結構(B+ 樹)。
  • 查詢無 ORDER BY 時,最佳化器可能直接掃描該唯一索引回傳資料,呈現索引順序(即該欄位排序後順序)。
  • 主鍵叢集索引決定資料實際儲存順序,非叢集索引僅含索引鍵 + 書籤,掃描它自然按索引鍵排序。

驗證方法


-- 查看執行計畫
SET SHOWPLAN_TEXT ON;
SELECT col FROM table;
SET SHOWPLAN_TEXT OFF;
-- 會看到 Index Scan 使用該唯一索引

解決方案

  1. 明確指定排序:SELECT col FROM table ORDER BY id;(主鍵順序)或 ORDER BY col DESC。
  2. 不要依賴無 ORDER BY 的順序:關聯式資料庫理論上不保證順序,除非有 ORDER BY。
  3. 若需插入順序:增加 insert_time DATETIME2 DEFAULT SYSDATETIME() 欄位並建立索引,查詢時 ORDER BY insert_time。

原答案核心

「unique約束是通過索引來實現的,而索引的特點就是順序... 直接從唯一索引中取數了,所以數據就會按照這個唯一索引來排序。」

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved