转载自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. apache http client vs urlconnection

    Google has deprecated HttpClient Choose an HTTP Client Most network-connected Android apps use HTTP ...

  2. BI--SDN上收集到的SAP BI的极好文章的链接

    1)Overviewhttps://www.sdn.sap.com/irj/sdn/go/portal/prtroot/docs/library/uuid/60981d00-ca87-2910-fdb ...

  3. BZOJ 2982 combination

    lucas定理裸题. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  4. 【LeetCode】Best Time to Buy and Sell Stock IV

    Best Time to Buy and Sell Stock IV Say you have an array for which the ith element is the price of a ...

  5. Median Weight Bead_floyd

    Description There are N beads which of the same shape and size, but with different weights. N is an ...

  6. Java 集合深入理解(15):AbstractMap

    点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天来了解下 AbstractMap. 什么是 AbstractMap AbstractMap 是 Map 接口的的实现类 ...

  7. dll强签名的由来和作用

    C# dll强签名介绍 之前基本没有这个概念,直到有一天我们的dll被反编译了,导致我们的代码基本上被看到了,才想起来要保护dll的安全性,因为C#语言的在编译过程中会产生中间语言导致dll很容易被反 ...

  8. 查看linux版本时32位的还是64位的

    一. [root@wuy2 etc]# getconf LONG_BIT [root@wuy2 etc]# getconf WORD_BIT (32位的系统中int类型和long类型一般都是4字节,6 ...

  9. dedecms SQL数据库连接信息注解(借鉴)

    <?php $cfg_dbhost = 'localhost'; //数据库地址,这里的localhost指的是本机$cfg_dbname = 'hunuo'; //数据库名$cfg_dbuse ...

  10. java web目录结构

    转自:http://blog.csdn.net/javaloveiphone/article/details/7828894 Javaweb项目的源文件与字节码文件的目录结构 1.新建项目的源文件目录 ...