一、前言
在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思。这里我就里面的一些概念进行讲解,方便大家的交流。
SQL Server 解读【已分区索引的特殊指导原则】(1)
二、解读
【对唯一索引进行分区】
“对唯一索引(聚集或非聚集)进行分区时,必须从唯一索引键使用的分区依据列中选择分区依据列。此限制将使 SQL Server 只调查单个分区,以确保表中不存在重复的新键值。如果分区依据列不可能包含在唯一键中,则必须使用 DML 触发器,而不是强制实现唯一性。”
你对这段描述是否有自己的理解呢?这段话你可以这样解读:
1) “对唯一索引(聚集或非聚集)”:在创建SQL Server表结构的时候,大家很习惯的把Id值做为主键,这就是说把Id创建为唯一索引,并且是聚集索引,其实在SQL Server中这两者是可以分开的;
2) “对唯一索引(聚集或非聚集)进行分区时,必须从唯一索引键使用的分区依据列中选择分区依据列”,这句翻译的很拗口,我们来看看它的英文原文:When partitioning a unique index (clustered or nonclustered), the partitioning column must be chosen from among those used in the unique index key.假如你想创建一个唯一索引UniqueIndex([SiteId] , [Url]),并想对这个唯一索引进行分区,那么在创建索引ON选项中的分区依据列必须是UniqueIndex([SiteId] , [Url])中[SiteId] 和 [Url]这2个字段的子集([Url]或者[SiteId]或者[Url]+[SiteId])。为什么会有这样的要求呢?请看下面的解读。
3) “此限制将 使 SQL Server 只调查单个分区,以确保表中不存在重复的新键值”,这句的意思是:假设UniqueIndex([SiteId] , [Url])索引是以SiteId作为分区依据列,那么某个SiteId值只会属于某单一的分区中,这样才能保证([SiteId] , [Url])这两个字段在单个分区是唯一就表示了在整个表是也是唯一的;再假设:如果上面的唯一索引UniqueIndex([SiteId] , [Url])是以Id作为分区依据列的,那么你怎么确保各个单个分区里的数据在整个表中是唯一的呢?数据库是没有办法的。SQL Server是想偷懒,它想当判断了某个分区的唯一索引在这个是唯一就可以省事很多,不需要去全局整个表判断,这样是不是省事很多?
4) “如果分区依据列不可能包含在唯一键中,则必须使用 DML 触发器,而不是强制实现唯一性。”上面的所有描述都是有一个前提的,那就是你希望索引与基表对齐,如果在不用对齐的情况下,你可以使用DML触发器,或者单独一个文件组来存放唯一索引,如果这样,你就不能使用分区切换了。
三、参考文献
->已分区索引的特殊指导原则(唯一索引)