Sql-Server

是否可以在 SQL Server 2016 中使用不同分區上的聚集索引和非聚集索引進行分區?

  • November 27, 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';

在您的情況下可能有更多優點的第二個選項是過濾索引,您可以將其添加到表的舊部分並包含大量列,以便它涵蓋您對錶的舊部分執行的查詢(這將有助於加快對錶舊部分的讀取,但不會減慢最近部分的寫入)。

引用自:https://dba.stackexchange.com/questions/156463