• (三)索引分区知识详解


    一、与表分区对齐

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

    对于已分区的与表对齐的分区索引,在排序的时候,将一次性在内存或者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. 新建包含非唯一非聚集索引,将不会再添加分区依据列为索引键列。
  • 相关阅读:
    【BZOJ3144】切糕(HNOI2013)-最小割
    【BZOJ1934】善意的投票(SHOI2007)-最小割
    【BZOJ2125】最短路-圆方树+倍增LCA
    【BZOJ4868】期末考试(六省联考2017)-三分
    【BZOJ1951】古代猪文(SDOI2010)-数论大集合
    【BZOJ2257】瓶子和燃料(JSOI2009)-裴蜀定理+排序
    【BZOJ1485】有趣的数列(HNOI2009)-卡特兰数+线性筛
    【51Nod1952】栈-单调栈+单调队列
    【BZOJ4517】排列计数(SDOI2016)-组合数学:错排
    【BZOJ2111】排列计数(ZJOI2010)-DP+Lucas定理
  • 原文地址:https://www.cnblogs.com/chhuang/p/4159345.html
Copyright © 2020-2023  润新知