本文演示了 SQL Server 2005 分区表分区切换的三种形式:

1. 切换分区表的一个分区到普通数据表中:Partition to Table; 
2. 切换普通表数据到分区表的一个分区中:Table to Partition; 
3. 切换分区表的分区到另一分区表:Partition to Partition。

并指出了在分区表分区切换过程中的注意事项。

-- 创建分区函数
create partition function PF_Orders_OrderDateRange(datetime)
as
range right for values (
'1997-01-01',
'1998-01-01',
'1999-01-01'
)
go
-- 创建分区方案
create partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
to ([primary], [primary], [primary], [primary])
go
-- 创建分区表
create table dbo.Orders
(
OrderID int not null
,CustomerID varchar(10) not null
,EmployeeID int not null
,OrderDate datetime not null
)
on PS_Orders(OrderDate)
go
-- 创建聚集分区索引
create clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate)
go
-- 为分区表设置主键
alter table dbo.Orders add constraint PK_Orders
primary key (OrderID, CustomerID, OrderDate)
go
-- 导入数据到分区表
insert into dbo.Orders
select OrderID, CustomerID, EmployeeID, OrderDate
from dbo.Orders_From_SQL2000_Northwind --(注:数据来源于 SQL Server 2000 示例数据库)
go
-- 查看分区表每个分区的数据分布情况
select partition = $partition.PF_Orders_OrderDateRange(OrderDate)
,rows = count(*)
,minval = min(OrderDate)
,maxval = max(OrderDate)
from dbo.Orders
group by $partition.PF_Orders_OrderDateRange(OrderDate)
order by partition
go
一、切换分区表的一个分区到普通数据表中:Partition to Table

首先建立普通数据表 Orders_1998,该表用来存放订单日期为 1998 年的所有数据。

create table dbo.Orders_1998
(
OrderID int not null
,CustomerID varchar(10) not null
,EmployeeID int not null
,OrderDate datetime not null
) on [primary]
go
create clustered index IXC_Orders1998_OrderDate on dbo.Orders_1998(OrderDate)
go
alter table dbo.Orders_1998 add constraint PK_Orders_1998
primary key nonclustered (OrderID, CustomerID, OrderDate)
go

开始切换分区表 Orders 第三个分区的数据(1998年的数据)到普通表 Orders_1998

   alter table dbo.Orders switch partition 3 to dbo.Orders_1998

值得注意的是,如果你想顺利地进行分区到普通表的切换,最好满足以下的前提条件:

1. 普通表必须建立在分区表切换分区所在的文件组上。 
2. 普通表的表结构跟分区表的一致; 
3. 普通表上的索引要跟分区表一致。 
4. 普通表必须是空表,不能有任何数据。

二、切换普通表数据到分区表的一个分区中:Table to Partition

上面我们已经把分区表 Orders 第三个分区的数据切换到普通表 Orders_1998 中了,现在我们再切换回来:

   alter table dbo.Orders_1998 switch to dbo.Orders partition 3

但是,此时有错误发生:

Msg 4982, Level 16, State 1, Line 1
ALTER TABLE SWITCH statement failed.
Check constraints of source table 'Sales.dbo.Orders_1998' allow values
that are not allowed by range defined by partition 3 on target table 'Sales.dbo.Orders'.

这就奇怪了,能把数据从分区切换进来却切换不出去。出错信息中提示我们是普通表的 check constraint 跟分区表不一致。于是在普通表上建立 check constraint:

   alter table dbo.Orders_1998 add constraint CK_Orders1998_OrderDate
check (OrderDate>='1998-01-01' and OrderDate<'1999-01-01')

再次进行切换,成功!

看来,切换普通表数据到分区,除了满足上面的 4 个条件外,还要加上一条:

普通表必须加上和分区数据范围一致的 check 约束条件。

三、切换分区表的分区到另一分区表:Partition to Partition

首先建立分区表 OrdersArchive,这个表用来存放订单历史数据。

-- 创建分区函数
create partition function PF_OrdersArchive_OrderDateRange(datetime)
as
range right for values (
'1997-01-01',
'1998-01-01',
'1999-01-01'
)
go
-- 创建分区方案
create partition scheme PS_OrdersArchive
as
partition PF_OrdersArchive_OrderDateRange
to ([primary], [primary], [primary], [primary])
go
-- 创建分区表
create table dbo.OrdersArchive
(
OrderID int not null
,CustomerID varchar(10) not null
,EmployeeID int not null
,OrderDate datetime not null
)
on PS_OrdersArchive(OrderDate)
go
-- 创建聚集分区索引
create clustered index IXC_OrdersArchive_OrderDate on dbo.OrdersArchive(OrderDate)
go
-- 为分区表设置主键
alter table dbo.OrdersArchive add constraint PK_OrdersArchive
primary key (OrderID, CustomerID, OrderDate)
go

然后,切换分区表 Orders 分区数据到 OrdersArchive 分区:

   alter table dbo.Orders switch partition 1  to dbo.OrdersArchive partition 1
alter table dbo.Orders switch partition 2 to dbo.OrdersArchive partition 2
alter table dbo.Orders switch partition 3 to dbo.OrdersArchive partition 3

最后,查看分区表 OrdersArchive 各分区数据分布情况:

-- 查看分区表每个分区的数据分布情况
select partition = $partition.PF_OrdersArchive_OrderDateRange(OrderDate)
,rows = count(*)
,minval = min(OrderDate)
,maxval = max(OrderDate)
from dbo.OrdersArchive
group by $partition.PF_OrdersArchive_OrderDateRange(OrderDate)
order by partition

实际上,分区表分区切换并没有真正去移动数据,而是 SQL Server 在系统底层改变了表的元数据。因此分区表分区切换是高效、快速、灵活的。利用分区表的分区切换功能,我们可以快速加载数据到分区表。卸载分区数据到普通表,然后 truncate 普通表,以实现快速删除分区表数据。快速归档不活跃数据到历史表。

SQL Server 2005 分区表实践——分区切换的更多相关文章

  1. sql server 2005中的分区函数用法(partition by 字段)

    分组取TOP数据是T-SQL中的常用查询, 如学生信息管理系统中取出每个学科前3名的学生.这种查询在SQL Server 2005之前,写起来很繁琐,需要用到临时表关联查询才能取到.SQL Serve ...

  2. SQL Server 2005 分区表创建实例

    --创建一个分区函数(默认为左边界)CREATE PARTITION FUNCTION PARTFUNC1(INT)AS RANGEFOR VALUES(1000,2000,3000,4000,500 ...

  3. Sql Server 2005主机和镜像切换SQL语句

    --1.主备互换 --主机执行: USE master; ALTER DATABASE <DatabaseName> SET PARTNER FAILOVER; --2.主服务器Down掉 ...

  4. SQL Server 2005 中的分区表和索引

    SQL Server 2005 中的分区表和索引 SQL Server 2005          69(共 83)对本文的评价是有帮助 - 评价此主题   发布日期 : 3/24/2005 | 更新 ...

  5. SQL Server 2005中的分区表

    记录笔记: 转自 猪八戒学做网站 SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表? SQL Server 2005中的分区表(二):如何添加.查询.修改 ...

  6. SQL Server 2005中的分区表(六):将已分区表转换成普通表(转)

    我的俄罗斯名叫作“不折腾不舒服斯基”,所以,不将分区表好好折腾一下,我就是不舒服. 在前面,我们介绍过怎么样直接创建一个分区表,也介绍过怎么将一个普通表转换成一个分区表.那么,这两种方式创建的表有什么 ...

  7. SQL Server 查看分区表(partition table)的分区范围(partition range)

    https://www.cnblogs.com/chuncn/archive/2009/02/20/1395165.html SQL Server 2005 的分区表(partition table) ...

  8. 关于SQL Server中分区表的文件与文件组的删除(转)

    在SQL Server中对表进行分区管理时,必定涉及到文件与文件组,关于文件与文件组如何创建在网上资料很多,我博客里也有两篇相关转载文件,可以看看,我这就不再细述,这里主要讲几个一般网上很少讲到的东西 ...

  9. SQL Server 2005 盛宴系列 经典教程

    SQL Server 2005 盛宴系列 经典教程  [复制链接]   发表于 2007-3-27 14:08 | 来自 51CTO网页 [只看他] 楼主     TECHNET  SQL serve ...

随机推荐

  1. 大数据技术之_16_Scala学习_01_Scala 语言概述

    第一章 Scala 语言概述1.1 why is Scala 语言?1.2 Scala 语言诞生小故事1.3 Scala 和 Java 以及 jvm 的关系分析图1.4 Scala 语言的特点1.5 ...

  2. 使用 Maven 来管理项目 & 从 0 开始搭建 Maven 项目

    maven 是 apache 的一个开源软件,纯 Java 编写的,专门用于管理 Java 项目的一个工具. maven 就是一个工具而已,用不用都不耽误你刷刷的敲代码,那为什么我们还要学习它呢? 那 ...

  3. BZOJ.2668.[CQOI2012]交换棋子(费用流zkw)

    题目链接 首先黑白棋子的交换等价于黑棋子在白格子图上移动,都到达指定位置. 在这假设我们知道这题用网络流做. 那么黑棋到指定位置就是一条路径,考虑怎么用流模拟出这条路径. 我们发现除了路径的起点和终点 ...

  4. android 开发 命名规范

    标识符命名法标识符命名法最要有四种: 1 驼峰(Camel)命名法:又称小驼峰命名法,除首单词外,其余所有单词的第一个字母大写. 2 帕斯卡(pascal)命名法:又称大驼峰命名法,所有单词的第一个字 ...

  5. 喵哈哈村的魔法考试 Round #6 (Div.3) 题解

    有任何问题 直接联系QQ:475517977 喵哈哈村的代码传说 第一章 冒泡排序 第一题就是排序嘛,在ACM/OI竞赛中,我只推崇一种排序方法,就是直接调用algorithm里面的sort函数. # ...

  6. 注册Goole 账户 成功注册

    注册谷歌邮箱等Google帐号时提示:此电话号码无法用于进行验证怎么办? 相信很多网友在注册Google帐号的时候需要手机号码验证,比如在遇到过注册Google Gmail到最后一步“验证您的帐号” ...

  7. net自定义安装程序快捷方式

    创建快捷方式对于绝大多数 Windows 用户来说都是小菜一碟了,然而,这项工作却为程序员带来不少麻烦..NET 没有提供简便直接的创建快捷方式的方法,那么在 .NET 中我们如何为应用程序创建快捷方 ...

  8. USBDM RS08/HCS08/HCS12/Coldfire V1,2,3,4/DSC/Kinetis Debugger and Programmer -- Driver Install

    Installation of USBDM USB drivers for Windows There are four installers provided: USBDM_Drivers_x_x_ ...

  9. 在ASP.NET MVC中使用Knockout实践05,基本验证

    本篇体验View Model验证.Knockout的subscribe方法能为View Model成员注册验证规则. @{ ViewBag.Title = "Index"; Lay ...

  10. ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

    本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目 ...