SQL Serve已分区索引的特殊指导原则(1)- 索引对齐
一、前言
在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 FUNCTION Fun_TestUnique_Id(INT) AS RANGE RIGHT FOR VALUES(10000000,20000000) --4.创建分区方案 CREATE PARTITION SCHEME Sch_TestUnique_Id AS PARTITION Fun_TestUnique_Id TO([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 FUNCTION Fun_TestUnique_SiteId(INT) AS RANGE RIGHT FOR VALUES(10000000,20000000) --4.创建分区方案 CREATE PARTITION SCHEME Sch_TestUnique_SiteId AS PARTITION Fun_TestUnique_SiteId TO([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 (编辑:源码网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |