在分區表上建立的索引分為:分區對齊索引(Aligned Index)和非對齊索引。對齊索引是指索引結構的分區和基礎表的分區相同,這意味着,在表的一個分區上建立的索引,索引結構也在同一個分區中。索引結構在每個分區中都是獨立存儲和維護的,如果索引結構和表結構在同一個分區(也就是在同一個檔案組上),那麼索引是與基礎表對齊的索引。建立對齊索引,并不意味着必須使用相同名稱的分區scheme,隻要分區schem使用的分區邊界和每個分區存儲的檔案組相同,這兩個分區schem是等價的,使用等價的分區scheme建立的索引和基礎表是對齊的。
索引對齊能夠提升查詢性能,能夠實作分區的隔離和分區的切換(switch)操作,分區的隔離能夠避免分區列上的競争,進而有效避免死鎖;通過分區的切換和資料表的截斷(TRUNCATE TABLE)這一操作組合,使得在删除海量資料表上的一個分區時,能夠瞬間完成,而分區對齊的好處不止如此,建議建立對齊索引。
在分區表上建立索引,如果沒有使用ON子句指定檔案組,那麼,預設建立的索引是分區索引,分區scheme和基礎表相同,索引的每一個分區和基礎表對應的分區存儲在同一個檔案組,這就是所謂的對齊索引。另外一種情況,基礎表是沒有分區的,而索引是分區的,在這種情況下建立分區索引時,需要在CREATE INDEX的ON子句中指定分區scheme。
在分區表上建立對齊索引,分區列必須包含在聚集索引鍵,唯一索引鍵(唯一索引,主鍵限制,唯一限制)中;對于對齊的非聚集索引(不是唯一索引),分區列可以是包含列,也可以是索引鍵。
一,對齊的非聚集索引
建立分區函數,分區scheme,分區表和分區索引:

View Code
在分區表上建立非聚集索引,在預設情況下,建立的是對齊索引:
在分區表上建立輔助索引(不是唯一索引和聚集索引)時,預設建立的是對齊索引。如果索引鍵中包含分區列,并且使用相同的分區scheme,那麼建立的索引就是和基礎表對齊的索引。如果沒有顯式指定分區scheme,或者索引鍵中沒有包含分區列,SQL Server自動向輔助索引中添加分區列,作為包含列。
二,對齊的聚集索引
在建立聚集索引時,SQL Server保證分區列是聚集索引鍵。如果沒有顯式指定分區列為聚集索引鍵,那麼SQL Server會自動添加分區列作為索引列,注意:聚集索引沒有包含列。
在建立聚集索引的語句中,如果沒有顯式指定分區列和分區scheme,那麼SQL Server 使用基礎表上的分區列和分區scheme建立聚集索引,SQL Server自動把分區列添加到索引鍵中。
建立聚集索引的目的是為了從實體上組織資料表的存儲結構,由于,對表分區影響表的實體結構,使得表的資料按照實體存儲順序存儲,是以,SQL Server内部強制分區列必須是聚集索引的一列。
三,對齊的唯一索引
在建立唯一索引(唯一索引和唯一限制)時,唯一索引鍵中必須顯式包含分區列,SQL Server 強制每個分區上的索引列都是唯一的。這意味着,在建立對齊的唯一索引時,不管建立的是聚集索引還是非聚集索引,必須在唯一索引鍵中顯式指定分區列。
由于唯一限制在底層使用唯一索引來保證唯一性,是以,在分區表上建立的唯一限制,必須顯式包含分區列。
如果沒有顯式指定分區列,SQL Server會抛出錯誤消息:
Column 'ID' is partitioning column of the index 'xxx'. Partition columns for a unique index must be a subset of the index key.
四,對齊的主鍵限制
在SQL Server 内部,主鍵限制(Primary Key)自動建立唯一索引(unique index),隻不過索引列必須是非空的(not null),是以,在建立主鍵限制時,不管建立的是聚集索引還是非聚集索引,主鍵必須顯式包含分區列。
Column 'ID' is partitioning column of the index 'PK__xxxx'. Partition columns for a unique index must be a subset of the index key.
五,非對齊索引
也可以在分區表上建立非對齊索引,所謂非對齊索引,是指索引的分區scheme和基礎表的分區scheme不同,其實體存儲結構也不同。在預設情況下,SQL Server在分區表上建立的是對齊索引,是以,要建立非對齊索引,必須在CREATE INDEX指令中顯式指定索引結構存儲的資料空間,資料空間是檔案組,或者跟基礎表不同的分區scheme。這意味着,非對齊索引存儲在特定的檔案組上,或者跟其基礎表有不同的分區scheme。
六,檢視索引的中繼資料
使用系統視圖:sys.indexes 檢視索引的中繼資料: