Sql-Server
是否可以在 SQL Server 2016 中使用不同分區上的聚集索引和非聚集索引進行分區?
假設我有一個包含 10 億行的股票定價表。我需要能夠與大量客戶端保持一致性、高速讀寫。
我想要的是一個將表分成兩部分的分區。一個“歸檔分區”,它有一個聚集索引並且有舊的(按時間)90% 的數據。我還想要一個“最近的分區”,其中包含最近的 10% 和非聚集索引。
我不確定這是否可能。
我的問題是:SQL Server 2016 中的分區是否可以在不同分區上同時具有聚集索引和非聚集索引?
我不認為這是可能的。這個概念似乎與我們所知道的關於分區和聚集索引的一切背道而馳,但我可能錯了。
一種可能性是對兩張表的分區視圖,一張帶有聚集索引,一張作為堆。我為此提供了一個展示腳本,但它確實有一些可能很關鍵的限制:
- inserts 似乎需要顯式地插入每一列
- 堆表仍然需要一個包含分區列的主鍵(即使主鍵沒有聚集)
- 將數據從“最近”移動到“存檔”涉及從一個表移動到另一個表
總體而言,您的情況可能足夠複雜,需要進行更深思熟慮的分析。
Use tempdb; Create Table TestOld ( id int, partition_column char(1) Constraint chk_partition_old Check (partition_column = 'O'), other_column char(100), Constraint pTestOld Primary Key Clustered (partition_column, id)); Create Table TestNew ( id int, partition_column char(1) Constraint chk_partition_new Check (partition_column = 'N'), other_column char(100), Constraint pTestNew Primary Key Nonclustered (partition_column, id)); Go Create View Test As Select id, partition_column, other_column From TestOld Union All Select id, partition_column, other_column From TestNew; Go Insert Into Test (id, partition_column, other_column) Values (1, 'O', ''), (2, 'N', ''); Select * From Test Where partition_column = 'N';
在您的情況下可能有更多優點的第二個選項是過濾索引,您可以將其添加到表的舊部分並包含大量列,以便它涵蓋您對錶的舊部分執行的查詢(這將有助於加快對錶舊部分的讀取,但不會減慢最近部分的寫入)。