二、背景
我有一个表TestUnique,这个表使用分区方案[Sch_TestUnique_Id],它是以Id做为分区依据列的,这个Id也是一个聚集索引,表中其它索引是跟分区对齐的(创建其它非聚集索引的时候使用了分区方案或者不指定-默认就是分区方案),而且我我这个表很大,我需要定时的进行交换分区(SWITCH PARTITION、滑动窗口、切换分区),表分区的相关信息可参考:SQL Server 表分区实战系列(文章索引)
--创建测试表
CREATE TABLE [dbo].[TestUnique](
[Id] [int] IDENTITY(600000000,1) NOT FOR REPLICATION NOT NULL,
[SiteId] [int] NULL,
[Url] [nvarchar](420) NULL,
[PublishOn] [datetime] NULL,
[AddOn] [datetime] NULL,
CONSTRAINT [PK_Archive] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = ON, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [Sch_TestUnique_Id]([Id])
) ON [Sch_TestUnique_Id]([Id])
GO
现在需要创建SiteId+Url做为一个唯一索引,本来以为这个唯一索引是可以进行分区对齐的,但是却在创建索引的时候遇到错误了。
三、分析
1. 对分区表创建索引时,SQL Server 将使用与该表相同的分区方案和分区依据列自动对索引进行分区。因此,索引的分区方式实质上与表的分区方式相同。这将使索引与表“对齐”。创建唯一索引有下面三种方式:
--方式1
CREATE UNIQUE NONCLUSTERED INDEX [IX_TestUnique_SiteIdUrl]
ON [TestUnique] (SiteId,Url)
消息1908,级别16,状态1,第1 行
列'Id' 是索引'IX_TestUnique_SiteIdUrl' 的分区依据列。唯一索引的分区依据列必须是索引键的子集。