热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[转]SQLServer2005分区表实践——建立分区表(partitiontable)

【鹏城万里】发表于www.sqlstudy.comSQLServer2005分区表实践——建立分区表(partitiontable)问题:

【鹏城万里】 发表于 www.sqlstudy.com

SQL Server 2005 分区表实践——建立分区表(partition table)

问题:有一个订单表 Orders,要转换成分区表,以订单日期 OrderDate 为分区列, 目前含有订单日期为 1996-07-04 ~ 1998-05-06 的数据。可以在 SQL Server 2000 Northwind 数据库中找到 Orders 表,下面是简化了的表结构:

create table dbo.Orders
(OrderID int not null,CustomerID varchar(10) not null,EmployeeID int not null,OrderDate datetime not null,constraint PK_Orders primary key noclustered (OrderID, CustomerID)
)
gocreate clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate)
go

1. 创建分区函数(partition function)

在创建分区函数的时候,我一般这样命名分区函数:'PF' + Table Name + 分区字段名 + 'Range', 例如:'PF_Orders_OrderDateRange',如果字段名较长的话,则可以省略去,可以这样命名: 'PF_Orders_DateRange'

create partition function PF_Orders_OrderDateRange(datetime)
as
range right for values (
'1997-01-01',
'1998-01-01',
'1999-01-01'
)
go

分区函数 'PF_Orders_OrderDateRange' 有 3 个边界值('1997-01-01', '1998-01-01', '1999-01-01'), 这三个边界值(boundary value)组成了 4 个分区(partition),并且 “range right” 表明边界值属于 右边的分区。下面使用存储过程 dbo.sp_show_partition_range 来查看分区范围:

exec dbo.sp_show_partition_range @partition_function = 'PF_Orders_OrderDateRange'

partition_function partition minval value maxval
------------------------- ----------- ------------------------- -------- ------------------------
PF_Orders_OrderDateRange 1 NULL <&#61; val <1997-01-01 00:00:00.000
PF_Orders_OrderDateRange 2 1997-01-01 00:00:00.000 <&#61; val <1998-01-01 00:00:00.000
PF_Orders_OrderDateRange 3 1998-01-01 00:00:00.000 <&#61; val <1999-01-01 00:00:00.000
PF_Orders_OrderDateRange 4 1999-01-01 00:00:00.000 <&#61; val

每个分区的最大值和最小值&#xff0c;一清二楚。获得 dbo.sp_show_partition_range 代码。

2. 创建分区方案&#xff08;partition scheme&#xff09;

分区方案定义了&#xff0c;分区表或者分区索引的每个分区的数据存放在哪个文件组上。试想&#xff0c; 如果没有分区方案的话&#xff0c;如何实现把分区表中不同的分区存放在不同的文件组上&#xff1f; 我们可以看下创建普通数据表的语法&#xff1a;

create table [table name] ... on [filegroup]

显然&#xff0c;普通表整个表的数据&#xff0c;只能存放在同一个文件组上。为了实现分区机制&#xff0c;才 引入了分区方案这个概念。每个分区表只属于一个方案&#xff08;scheme&#xff09;&#xff0c; 因此分区方案可以这样命名&#xff1a;&#39;PS&#39; &#43; Table Name

create partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
to ([primary], [primary], [primary], [primary])
go

分区方案 PS_Orders 规定了&#xff0c;把分区表的 4 个分区分别存放在主文件组 primary 上。 分区方案中指定的文件组数目&#xff0c;不能少于分区函数中划定的分区数目&#xff1b;但可以多于 分区函数中划定的分区数目。多出的第 1 个文件组用来指定当分区表增加分区时&#xff0c; 下一个分区所使用的文件组&#xff1b;多出的其他文件组将被忽略。

下面的例子&#xff0c;分区方案指定了 5 个文件组&#xff08;多出了 1 个文件组&#xff09;。

drop partition scheme PS_Orders
gocreate partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
to ([primary], [primary],[primary], [primary],[primary])
go

Partition scheme &#39;PS_Orders&#39; has been created successfully.
&#39;PRIMARY&#39; is marked as the next used filegroup in partition scheme &#39;PS_Orders&#39;.

下面的例子&#xff0c;分区方案指定了 7 个文件组&#xff08;多出了 3 个文件组&#xff09;。

drop partition scheme PS_Orders
gocreate partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
to ([primary], [primary],[primary], [primary],[primary],[primary],[primary])
go

Partition scheme &#39;PS_Orders&#39; has been created successfully.
&#39;PRIMARY&#39; is marked as the next used filegroup in partition scheme &#39;PS_Orders&#39;.
2 filegroup specified after the next used filegroup are ignored.

如果分区表所有的分区都将分配在同一个文件组 [primary] 上&#xff0c;那么可以使用下面更简洁的方法&#xff1a;

drop partition scheme PS_Orders
gocreate partition scheme PS_Orders
as
partition PF_Orders_OrderDateRange
all to ([primary])
go

3. 创建分区表&#xff08;partition table&#xff09;

创建了分区函数和分区方案&#xff0c;准备工作做完了&#xff0c;现在终于可以开始创建分区表了。 创建分区表和普通表的语法大致相同&#xff0c;不同之处&#xff1a;普通表需要指定所存放的文件组&#xff0c; 分区表需要指定分区方案。

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

根据订单表 Orders 查询时经常使用 OrderDate 范围条件来查询的特点&#xff0c;我们最好 在 Orders.OrderDate 列上建立聚集索引&#xff08;clustered index&#xff09;。为了便于进行分区切换&#xff08;partition swtich&#xff09;&#xff0c; 大多数情况下&#xff0c;建议在分区表上建立分区索引。下面建立聚集分区索引&#xff1a;

create clustered index IXC_Orders_OrderDate on dbo.Orders(OrderDate)
on PS_Orders(OrderDate)

如果没有指定 “on PS_Orders(OrderDate)”&#xff0c;默认建立的聚集索引和分区表的分区方案相同。

另外 Orders 分区表需要在&#xff08;OrderID, CustomerID&#xff09;上建立主键。我们知道主键实际上是个 唯一索引&#xff0c;但分区表在建立唯一索引&#xff08;分区索引&#xff09;的时候&#xff0c;分区列必须是唯一索引的一部分。 为什么要这样子呢&#xff1f;因为 SQL Server 不但要保证索引在各个分区是唯一的&#xff0c;还要保证在 整个表中是唯一的。

alter table dbo.Orders add constraint PK_Orders primary key (OrderID, CustomerID, OrderDate)

如果不指定 OrderDate 的话&#xff0c;则会出现错误&#xff1a;1908

Msg 1908, Level 16, State 1, Line 1
Column &#39;OrderDate&#39; is partitioning column of the index &#39;PK_Orders&#39;.
Partition columns for a unique index must be a subset of the index key.Msg 1750, Level 16, State 0, Line 1
Could not create constraint. See previous errors.

查看分区表 Orders 上的索引&#xff1a;

exec sp_helpindex &#39;dbo.Orders&#39;

index_name index_description index_keys
--------------------- ------------------------------------------------------ ------------------------------
IXC_Orders_OrderDate clustered located on PS_Orders OrderDate
PK_Orders nonclustered, unique, primary key located on PS_Orders OrderID, CustomerID, OrderDate

4. 向分区表中填充数据

insert into dbo.Orders
select OrderID, CustomerID, EmployeeID, OrderDatefrom dbo.Orders_From_SQL2000_Northwind

数据表 dbo.Orders_From_SQL2000_Northwind&#xff0c;是从 SQL Server 2000 中 Northwind.Orders 迁移过来的。

5. 查看分区表各分区数据情况&#xff08;数据行数&#xff0c;最大最小 OrderDate 值&#xff09;

select partition &#61; $partition.PF_Orders_OrderDateRange(OrderDate),rows &#61; count(*),minval &#61; min(OrderDate),maxval &#61; max(OrderDate)from dbo.Ordersgroup by $partition.PF_Orders_OrderDateRange(OrderDate)order by partition

partition rows minval maxval
----------- ----------- ----------------------- -----------------------
1 152 1996-07-04 00:00:00.000 1996-12-31 00:00:00.000
2 408 1997-01-01 00:00:00.000 1997-12-31 00:00:00.000
3 270 1998-01-01 00:00:00.000 1998-05-06 00:00:00.000(3 row(s) affected)

从以上结果集中可以看出&#xff1a;分区表 Orders 的 3 个分区中已经填入了数据。 这里要注意 $partition.partition_function_name(expression) 这个函数&#xff0c; 或许像我一样&#xff1a;一辈子没见过这样的函数&#xff1a;&#xff09;


本文链接&#xff1a;http://www.sqlstudy.com/sql_article.php?id&#61;2008071101


转载于:https://www.cnblogs.com/joe-yang/archive/2011/03/10/1979992.html


推荐阅读
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 生成对抗式网络GAN及其衍生CGAN、DCGAN、WGAN、LSGAN、BEGAN介绍
    一、GAN原理介绍学习GAN的第一篇论文当然由是IanGoodfellow于2014年发表的GenerativeAdversarialNetworks(论文下载链接arxiv:[h ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
author-avatar
mobiledu2502858037
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有