• (四)SQL Server分区管理


    一、拆分分区(SPLIT)

    在已有分区上添加一个新分区。

    如下图所示,将分区03拆分成03和04分区,拆分方式先锁定旧03分区的所有数据,后将旧03分区相关数据迁移到分区04,最后删除旧03上的对应分区数据;这种操作大量消耗io,造成的io日志读写是转移数据的四倍。因此在管理分区上,一般提前添加分区;例如当前03分区没有数据的情况下,我们完成04分区的添加。

    添加分区步骤:

    1、指定下一个分区的文件组

    2、拆分分区

    --添加分区
    USE [PartionTest]
    
    ALTER PARTITION SCHEME [pc_PartionTest01] NEXT USED [PartionTest201412]
    
    USE [PartionTest];
    ALTER PARTITION FUNCTION [pf_PartionTest01]() SPLIT RANGE('2014-12-11')

    下图表示分区添加成功:

    二、合并分区(Merge)  

    分区数据的迁移后,需要分区合并,也就是将无用分区删除,分区合并同拆分一样,会造成大量的io消耗;因此通常会将此分区数据切分出去,分区无数据则可以合并相关分区。

    由于合并是将两个分区合并,因此存在是将需要合并的分区界限点往左合并还是往右合并呢?这取决于Range 方式,若Range LEFT 则 往右合并,RANG RIGHT 则往左合并。

    通过以上拆分分区得出的分区4,现将分区4合并,有余Range right分区方式,因此分区4是往左合并,将合并到分区3。以下执行结果可以证明此观点。

    USE [PartionTest];
    ALTER PARTITION FUNCTION [pf_PartionTest01]() Merge RANGE('2014-12-11')
    通过下图可以看出:只剩下分区3

    四、分区切换(SWITCH PARTITION )   

    切换分区可以快速有效的管理数据子集。可以使用ALTER TABLE …SWITCH PARTITION ..语句。在分区移动时,只是修改相关的元数据,并未移动数据;因此切换速度非常快。

    切换分区需要符合以下要求:http://msdn.microsoft.com/zh-cn/library/ms191160(v=sql.105).aspx

    1、原表与目标表结构必须相同,且必须在同一个文件组中。

    2、目标表或者分区必须是空的。

    3、若源表存在聚集分区索引,则要求目标表也需要有同样的聚集分区索引。

    4、源表的所有索引必须与源表分区对齐。

    5、若目标表存在索引,约束,外键,要求源表必须与目标表相同结构的索引,约束,外键。

    6、目标表和源表都不能存在复制分发。

    7、分区依据列是否可为空的约束必须相同。

    一般切换分区可以做如下处理:

    1. 将现有表作为分区分配到现有的已分区表。

      ALTER TABLE [dbname].[dbo].[tablename] SWITCH TO [dbname].[dbo].[staging_tablename] PARTITION source_partition_number_expression

    2. 将分区从一个已分区表切换到另外一个已分区表中。

      ALTER TABLE [dbname].[dbo].[tablename] SWITCH PARTITION source_partition_number_expression TO [dbname].[dbo].[staging_tablename] PARTITION source_partition_number_expression

    3. 将一个分区切换到现有表中。

      ALTER TABLE [dbname].[dbo].[tablename] SWITCH PARTITION source_partition_number_expression TO [dbname].[dbo].[staging_tablename]

    四、$PARTITION         

    为任何指定的分区函数返回分区号,一组分区列值将映射到该分区号中。

    [ database_name. ] $PARTITION.partition_function_name(expression)
    /*返回某个值属于某个分区*/
    SELECT $PARTITION.pf_PartionTest01('2014-12-26 00:00:00.000')
    
    /*查询某个分区的所有值*/
    select * from [dbo].[PartionTest01]
    where $PARTITION.pf_PartionTest01(salesDate)=2

  • 相关阅读:
    4-vim-工作模式-01-职责以及切换模式
    3-vim-打开和新建文件-02-删除交换文件
    poj1011Stick(dfs+剪枝)
    POJ 1251 Jungle Roads (prim)
    poj 2502 Subway
    poj 3624 Charm Bracelet (01背包)
    拦截导弹问题(动态规划)
    Policy Gradient
    深入了解马尔科夫决策过程(Markov Decision Process)
    深度学习中调参对模型容量的影响
  • 原文地址:https://www.cnblogs.com/chhuang/p/4159496.html
Copyright © 2020-2023  润新知