SQL Serve已分区索引的特殊指导原则(1)- 索引对齐2014-08-02一、前言在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思。这里我就里面的一些概念进行讲解,方便大家的交流。二、解读“索引要与其基表对齐,并不需要与基表参与相同的命名分区函数。但是,索引和基表的分区函数在实质上必须相同,即:1) 分区函数的参数具有相同的数据类型;2) 分区函数定义了相同数目的分区;3) 分区函数为分区定义了相同的边界值。”下面我们进行测试:
--1.创建文件组ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_Id_01]ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_Id_02]ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_Id_03]--2.创建文件ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_Id_01_data",FILENAME = N"E:DataBaseFG_TestUnique_Id_01_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_Id_01];ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_Id_02_data",FILENAME = N"E:DataBaseFG_TestUnique_Id_02_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_Id_02];ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_Id_03_data",FILENAME = N"E:DataBaseFG_TestUnique_Id_03_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_Id_03];--3.创建分区函数CREATE PARTITION FUNCTIONFun_TestUnique_Id(INT) ASRANGE RIGHTFOR VALUES(10000000,20000000)--4.创建分区方案CREATE PARTITION SCHEMESch_TestUnique_Id ASPARTITION Fun_TestUnique_IdTO([FG_TestUnique_Id_01],[FG_TestUnique_Id_02],[FG_TestUnique_Id_03])
上面的SQL脚本创建了分区函数:Fun_TestUnique_Id(INT)和分区方案:[Sch_TestUnique_Id]。下面我们创建类似的分区函数:Fun_TestUnique_SiteId(INT)和分区方案:[Sch_TestUnique_SiteId]。这两个函数完全符合上面提到的3个条件:1) 分区函数的参数具有相同的数据类型;(都是Int类型)2) 分区函数定义了相同数目的分区;(都是3个分区)3) 分区函数为分区定义了相同的边界值。”(边界值都是10000000,20000000)
--1.创建文件组ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_SiteId_01]ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_SiteId_02]ALTER DATABASE [Test]ADD FILEGROUP [FG_TestUnique_SiteId_03]--2.创建文件ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_SiteId_01_data",FILENAME = N"E:DataBaseFG_TestUnique_SiteId_01_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_SiteId_01];ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_SiteId_02_data",FILENAME = N"E:DataBaseFG_TestUnique_SiteId_02_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_SiteId_02];ALTER DATABASE [Test]ADD FILE(NAME = N"FG_TestUnique_SiteId_03_data",FILENAME = N"E:DataBaseFG_TestUnique_SiteId_03_data.ndf",SIZE = 1MB, FILEGROWTH = 1MB )TO FILEGROUP [FG_TestUnique_SiteId_03];--3.创建分区函数CREATE PARTITION FUNCTIONFun_TestUnique_SiteId(INT) ASRANGE RIGHTFOR VALUES(10000000,20000000)--4.创建分区方案CREATE PARTITION SCHEMESch_TestUnique_SiteId ASPARTITION Fun_TestUnique_SiteIdTO([FG_TestUnique_SiteId_01],[FG_TestUnique_SiteId_02],[FG_TestUnique_SiteId_03])
接下来创建一个以这个分区方案进行分区的表[TestUnique];这个表的聚集索引是创建在分区方案:[Sch_TestUnique_Id]上的。接着创建一个唯一索引:[IX_TestUnique_SiteIdUrl]是创建在分区方案[Sch_TestUnique_SiteId]上的。那么这个唯一索引跟基表是对齐的嘛?
--5.创建分区表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--6.创建唯一索引CREATE NONCLUSTERED INDEX [IX_TestUnique_SiteIdUrl] ON [dbo].[TestUnique] ([SiteId] ASC,[Url] ASC)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [Sch_TestUnique_SiteId]([SiteId])GO