转载自CSDN地址:http://bbs.csdn.net/topics/330087045

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) ) go

create 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                      <= val <  1997-01-01 00:00:00.000 PF_Orders_OrderDateRange  2           1997-01-01 00:00:00.000   <= val <  1998-01-01 00:00:00.000 PF_Orders_OrderDateRange  3           1998-01-01 00:00:00.000   <= val <  1999-01-01 00:00:00.000 PF_Orders_OrderDateRange  4           1999-01-01 00:00:00.000   <= val <  NULL

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

2. 创建分区方案(partition scheme) 分区方案定义了,分区表或者分区索引的每个分区的数据存放在哪个文件组上。试想,如果没有分区方案的话,如何实现把分区表中不同的分区存放在不同的文件组上?我们可以看下创建普通数据表的语法:

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

显然,普通表整个表的数据,只能存放在同一个文件组上。为了实现分区机制,才引入了分区方案这个概念。每个分区表只属于一个方案(scheme),因此分区方案可以这样命名:'PS' + Table Name

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

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

下面的例子,分区方案指定了 5 个文件组(多出了 1 个文件组)。

drop partition scheme PS_Orders go

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

Partition scheme 'PS_Orders' has been created successfully. 'PRIMARY' is marked as the next used filegroup in partition scheme 'PS_Orders'.

下面的例子,分区方案指定了 7 个文件组(多出了 3 个文件组)。

drop partition scheme PS_Orders go

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

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

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

drop partition scheme PS_Orders go

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

3. 创建分区表(partition table) 创建了分区函数和分区方案,准备工作做完了,现在终于可以开始创建分区表了。创建分区表和普通表的语法大致相同,不同之处:普通表需要指定所存放的文件组,分区表需要指定分区方案。

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 范围条件来查询的特点,我们最好在 Orders.OrderDate 列上建立聚集索引(clustered index)。为了便于进行分区切换(partition swtich),大多数情况下,建议在分区表上建立分区索引。下面建立聚集分区索引:

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

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

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

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

如果不指定 OrderDate 的话,则会出现错误:1908

Msg 1908, Level 16, State 1, Line 1 Column 'OrderDate' is partitioning column of the index 'PK_Orders'. 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 上的索引:

exec sp_helpindex 'dbo.Orders'

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, OrderDate   from dbo.Orders_From_SQL2000_Northwind

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

5. 查看分区表各分区数据情况(数据行数,最大最小 OrderDate 值) 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

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)

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

本文由 www.sqlstudy.com 原创,版权所有,转载请注明作者和出处!

本文链接:http://www.sqlstudy.com/sql_article.php?id=2008071101

SQL Server数据库表分区操作过程由三个步骤组成:

  1. 创建分区函数

  2. 创建分区架构

  3. 对表进行分区

  下面将对每个步骤进行详细介绍。

  步骤一:创建一个分区函数

  此分区函数用于定义你希望SQL Server如何对数据进行分区的参数值(<span style="text-decoration: underline;">how</span>)。这个操作并不涉及任何表格,只是单纯的定义了一项技术来分割数据。

  我们可以通过指定每个分区的边界条件来定义分区。例如,假定我们有一份Customers表,其中包含了关于所有客户的信息,以一一对应的客户编号(从1到1,000,000)来区分。我们将通过以下的分区函数把这个表分为四个大小相同的分区:  

CREATEPARTITIONFUNCTIONcustomer_partfunc(int)   ASRANGERIGHT   FORVALUES(250000,500000,750000)

  这些边界值定义了四个分区。第一个分区包括所有值小于250,000的数据,第二个分区包括值在250,000到49,999之间的数据。第三个分区包括值在500,000到7499,999之间的数据。所有值大于或等于750,000的数据被归入第四个分区。

  请注意,这里调用的"RANGE RIGHT"语句表明每个分区边界值是右界。类似的,如果使用"RANGE LEFT"语句,则上述第一个分区应该包括所有值小于或等于250,000的数据,第二个分区的数据值在250,001到500,000之间,以此类推。

  步骤二:创建一个分区架构

  一旦给出描述如何分割数据的分区函数,接着就要创建一个分区架构,用来定义分区位置(<span style="text-decoration: underline;">where</span>)。创建过程非常直截了当,只要将分区连接到指定的文件组就行了。例如,如果有四个文件组,组名从"fg1"到"fg4",那么以下的分区架构就能达到想要的效果:  

CREATEPARTITIONSCHEMEcustomer_partscheme   ASPARTITIONcustomer_partfunc   TO(fg1,fg2,fg3,fg4)

  注意,这里将一个分区函数连接到了该分区架构,但并没有将分区架构连接到任何数据表。这就是可复用性起作用的地方了。无论有多少数据库表,我们都可以使用该分区架构(或仅仅是分区函数)。

  步骤三:对一个表进行分区

  定义好一个分区架构后,就可以着手创建一个分区表了。这是整个分区操作过程中最简单的一个步骤。只需要在表创建指令中添加一个"ON"语句,用来指定分区架构以及应用该架构的表列。因为分区架构已经识别了分区函数,所以不需要再指定分区函数了。

  例如,使用以上的分区架构创建一个客户表,可以调用以下的Transact-SQL指令:  

CREATETABLEcustomers(FirstNamenvarchar(40),LastNamenvarchar(40),CustomerNumberint)   ONcustomer_partscheme(CustomerNumber)

MSSQL中建立分区表(转载备忘)的更多相关文章

  1. ECMAScript 5(ES5)中bind方法简介备忘

    一直以来对和this有关的东西模糊不清,譬如call.apply等等.这次看到一个和bind有关的笔试题,故记此文以备忘. bind和call以及apply一样,都是可以改变上下文的this指向的.不 ...

  2. [转载]备忘:oh my zsh 的安装、更新、删除

    备忘:oh my zsh 的安装.更新.删除 傅易君 关注  0.8 2016.09.25 00:56* 字数 68 阅读 14920评论 0喜欢 4 查看系统当前 shell $ cat /etc/ ...

  3. ASP.NET MVC中在Action获取提交的表单数据方法总结 (4种方法,转载备忘)

    有Index视图如下: 视图代码如下: <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Mas ...

  4. CSS转载备忘

    原文地址:http://www.cnblogs.com/coffeedeveloper/p/3145790.html#html 转载内容: 对CSS中的Position.Float属性的一些深入探讨 ...

  5. 用机器名访问和用Localhost访问时在IE中的区别(备忘)

    meta中未指定文档模式的时候, localhost访问文档模式默认是Edge 机器名访问时文档模式默认是IE7 <head>中添加 <meta http-equiv="X ...

  6. 关于在linux下清屏的几种技巧(转载-备忘)

    原文地址:http://www.cnblogs.com/5201351/p/4208277.html 在windows的DOS操作界面里面,清屏的命令是cls,那么在linux 里面的清屏命令是什么呢 ...

  7. js-new、object.create、bind的模拟实现【转载备忘】

    //创建Person构造函数,参数为name,age function Person(name,age){ this.name = name; this.age = age; } function _ ...

  8. ubuntu中使用gensim+word2vec[备忘]

    python版本: 2.7.12 0. 安装python和pip 1. 用pip依次安装: numpy, cython,scipy,pattern,word2vec 五个工具包 2. 用pip安装ge ...

  9. jquery中的ajax方法(备忘)

    参考:https://www.cnblogs.com/tylerdonet/p/3520862.html w3school:http://www.w3school.com.cn/jquery/ajax ...

随机推荐

  1. 走进科学之WAF(Web Appllication Firewall)篇

    小编P.S:文章非常详尽对WAF领域进行了一次科普,能有让人快速了解当前WAF领域的相关背景及现状,推荐所有WAF领域的同学阅读本文. 1. 前言 当WEB应用越来越为丰富的同时,WEB 服务器以其强 ...

  2. php大力力 [033节] 随便看看:PHP程序员学习C++

    php大力力 [033节] 随便看看:PHP程序员学习C++ 2014 兄弟连高洛峰 PHP教程14.1.7 在PHP脚本中操作MySQL数据库4 观看 - 56.com http://www.med ...

  3. 升级IOS 9 和 XCode 7 引起的问题

    问题一: 升级xcode 7最低的系统配置要求 升级了ios9 后使用 xcode 6.1 已经不能用了,必须升级 xcode 7才行,原先的系统是OSX 10.10.1 版本.而xcode 7.0 ...

  4. IOS 使用block完成网络请求的自定义类BlockURLConnection

    一,头文件 #import <Foundation/Foundation.h>//定义下载中block类型typedef void(^ProcessBlock) (NSURLRespons ...

  5. Windows 2008 R2防火墙,允许被ping

    netsh firewall set icmpsetting 8 1.         准备 1)         原因 出于安全因素考虑,在Windows 2008 R2上是不允许从外部对其Ping ...

  6. 【转】使用Xcode 6将你的项目本地化

    原文转自:http://www.cocoachina.com/ios/20141004/9827.html iOS和OSX支持40种语言的本地化,Xcode无疑为这一过程提供了强有力的支持.苹果将这一 ...

  7. Azure Automation:存储帐户之间blob拷贝

    在两个存储帐户之间进行blob拷贝,在客户端,使用Azue PowerShell脚本, 用存储帐户上下文(New-AzureStorageContext)来获取某个StorageAccount中的Co ...

  8. LeetCode Sum Root to Leaf Numbers(DFS)

    题意: 给一棵二叉树,每个节点上有一个数字,范围是0-9,将从根到叶子的所有数字作为一个串,求所有串的和. 思路: 普通常规的DFS. /** * Definition for a binary tr ...

  9. 什么是JavaScript闭包终极全解之一——基础概念

    本文转自:http://www.cnblogs.com/richaaaard/p/4755021.html 什么是JavaScript闭包终极全解之一——基础概念 “闭包是JavaScript的一大谜 ...

  10. VS2010 安装使用STLPort

    VS2010 安装使用STLport 1.本机环境 win7 64位 visual studio 2010 中文旗舰版 STLport-5.2.1.tar.bz2 2.下载STLport http:/ ...