(三)索引分区知识详解

一、与表分区对齐

在了解索引分区之前,需先了解下分区索引与表对齐的概念,若分区与表使用相同的分区架构和相同分区依据列,则说明分区与表的分区方式相同,我们称为对齐,反之则不对齐。

对于已分区的与表对齐的分区索引,在排序的时候,将一次性在内存或者tempdb中生成排序表;若是不与分区表对齐,将在每个分区同时生成排序表,因此所需内存空间会更多。每个排序表占用最小40KB空间,对齐索引分区将只是占用40kb,非对齐若有100个分区将占用40*100kB空间。因此是否对齐将直接影响排序性能。

同时对于不对齐的索引,将无法完成分区切换的动作,无法实现分区的子集快速管理。

新建PartionTest01以下分区表进行索引测试:

--新建测试表
CREATE TABLE PartionTest01(logid int identity(1,1),orderid int,salesDate datetime) ON pc_PartionTest01([salesDate])--指定分区方案

--查询分区情况
SELECT Object_name(p.object_id) AS [object_name],
id.name AS index_name,
ps.name partition_scheme,
ds.name filegroup,
pf.name partition_function,
pf.type_desc+':'+case when pf.boundary_value_on_right=0 then 'Left' else 'Rigth' end function_type,
p.partition_number,
Isnull(prv.VALUE,'') AS boundy_value,
p.rows
FROM sys.indexes id
JOIN sys.partition_schemes ps ON ps.data_space_id = id.data_space_id
JOIN sys.destination_data_spaces dds ON ps.data_space_id = dds.partition_scheme_id
JOIN sys.data_spaces ds ON ds.data_space_id = dds.data_space_id
JOIN sys.partitions p ON p.object_id = id.object_id AND p.index_id = id.index_id AND dds.destination_id = p.partition_number
JOIN sys.partition_functions pf ON ps.function_id = pf.function_id
LEFT JOIN sys.partition_range_values prv ON prv.function_id = pf.function_id AND prv.boundary_id = p.partition_number - pf.boundary_value_on_right
WHERE Object_name(id.object_id) = 'PartionTest01'
查询结果如下:

二、聚集索引分区

测试一:对于非唯一聚集索引分区时,若未在聚集键明确指定分区列,默认将在聚集索引键列表中添加分区依据列

测试二:对于唯一聚集索引分区时,必须添加分区依据列,如下报错。添加分区依据列之后新建成功,只有添加了分区依据列才能在单个分区保证唯一。

三、非聚集索引分区

测试一:非唯一非聚集索引,自动包含分区依据列为键列。

测试二:唯一非聚集,仍然需要指定分区依据列。

测试三:指定包含分区依据列,可成功

结论

  1. 新建唯一索引都需要明确指定分区依据列,以确保表中不存在重复的键值。
  2. 新建非唯一索引若未明确指定分区依据列,则会自动将分区依据列指定为索引键列
  3. 新建包含非唯一非聚集索引,将不会再添加分区依据列为索引键列。
posted @ 2014-12-12 11:26  阿传说  阅读(1358)  评论(0编辑  收藏  举报