(四)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

时间: 2024-10-09 01:35:09

(四)SQL Server分区管理的相关文章

SQL Server分区详解

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区.SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体,简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据管理

SQL Server分区详解Partition

一.SQL Server分区介绍 在SQL Server中,数据库的所有表和索引都视为已分区表和索引,默认这些表和索引值包含一个分区:也就是说表或索引至少包含一个分区. SQL Server中数据是按水平方式分区,是多行数据映射到单个分区.已经分区的表或者索引,在执行查询或者更新时,将被看作为单个逻辑实体: 简单说来利用分区将一个表数据分多个表来存储,对于大数据量的表,将表分成多块查询,若只查询某个分区数据将降低消耗提高效率.需要注意的是单个索引或者表的分区必须位于一个数据库中. 在使用大量数据

(二)SQL Server分区创建过程

虽然分区有很多好处(一)SQL Server分区详解Partition,却不能随意使用:且不说分区管理的繁琐,只是跨分区带来的负面影响就需要我们好好分析是否有必要使用分区.一般分区创建的业务特点:用于统计.历史数据少使用.数据自增长.可能数据冗余大.数据量庞大插入量大.在确定是否合适使用分区前,需了解分区是如何创建的,分区的创建包括: 1.新建分区函数 2.新建文件和文件组 3.新建分区架构 4.新建分区表或者分区索引 如下图所示:分区函数定义了分区的具体方式,分区架构使用分区函数和文件组,确定

sql server 分区

 一.分区发展历程      基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能.追溯到逻辑分区表和手动分区表的功能. 二.为什么要进行分区 为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. 大型表除了大小以数百 GB 计算,甚至以 TB 计算的指标外,还可以是无法按照预期方式运行的数据表,运行成本或维护成本超出预定要求.例如发生性能问题.阻塞问题.备份. 三.创建分区实现 在test库 添加四个文件组 1 --第一步:创建四个文件组 2 alter databas

sql server 分区(上)

原文:sql server 分区(上) 分区发展历程      基于表的分区功能为简化分区表的创建和维护过程提供了灵活性和更好的性能.追溯到逻辑分区表和手动分区表的功能. 二.为什么要进行分区 为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性. 大型表除了大小以数百 GB 计算,甚至以 TB 计算的指标外,还可以是无法按照预期方式运行的数据表,运行成本或维护成本超出预定要求.例如发生性能问题.阻塞问题.备份. 三. 分区的概念 分区范围 分区范围是指在要分区的表中,根据业务选择表中的关

目录:SQL Server 2014 管理与维护指南

<SQL Server 2014 安装与配置指南> 章节目录 <SQL Server 2014管理与维护> 第1章  实现数据完整性和一致性 1.1  数据完整性 1.2  数据一致性 1.3  阻塞和死锁 第2章  包含数据库 2.1  包含的概念 2.2  实现包含数据库 2.3  包含数据库的排序规则 2.4  迁移到包含数据库 第3章  管理数据库 3.1  修改数据库选项 3.2  数据库的文件类型 3.3  数据库的触发器 第4章  数据库的组织结构 4.1  文件组

学习 Sql Server 内存管理之术语理解

在学习sql server 内存管理时,看到一些term:memory node,memory clerk,memory object,非常迷惑,在此将自己的理解记录下来,以便后续学习 1,NUMA架构和memory node 内存节点基于硬件 NUMA 创建,memory node是Numa node内的内存块,属于server物理内存的一部分.Memory Node的作用是使得内存的分配由Windows移交到SQL Server OS层面执行. 查看memory node select *

SQL SERVER分区具体例子详解

在日常工作中,我们会遇到以下的情况,一个表每日数万级的增长,而查询的数据通常是在本月或今年,以前的数据偶尔会用到,但查询和插入的效率越来越慢,用数据库分区会有助于解决这个问题.关于分区的理论知识网上很多我这里就不在累赘,我从一个实际例子出发,看如何将一个已经运行了很长时间的普通表进行分区. 回到目录 提出问题 需解决问题:有一个数据表数据很大,我们通常的查询是在一个季度中.我们需要将以往年份的数据按不同年份存在文件组里,当年的数据分为4个季度存,如果到了新的一年,将之前4个季度的合并到一年中,新

Sql Server 分区演练 【转】

Sql Server 分区演练 [转] 代码加注释,希望对初学者有用. USE [master]GOif exists (select * from sys.databases where name = 'Test_1')drop database Test_1GO--创建新库,要演练分区所以我们会多创建两个文件组Test_A,Test_B,以便在后面的分区方案中使用.CREATE DATABASE [Test_1] ON  PRIMARY ( NAME = N'test_1', FILENAM