本文转自:http://www.cnblogs.com/dongpo888/archive/2012/02/16/2355028.html

大凡在应用系统和数据库系统中行走江湖多年的朋友,都会面临数据统计、分析以及归档的问题,企业信息化进程加速了各种数据的极具增长,商务智能(BI)的出现和实施着实给信息工作者和决策者带来了绝妙的体验,但从 OLTP 向 OLAP 系统加载数据是很头疼的事,常常需要数分钟或数小时,解 决这一问题的技术之一便是分区表,一旦实施了分区表,这样的操作往往只需几秒钟,太让人兴奋了。而大型表或索引经过分区后更容易进行管理,因为这样可以快 速高效地管理和访问数据子集,同时维护数据集合的完整性。分区表的数据分布于一个数据库中的多个文件组单元中,数据是按水平方式分区的(数据分区的多种方 式会在分区表前传中阐述),因此一个表的某些行映射到某个分区,而另外一些行映射到另外某个分区,以此类推。当对数据进行查询或更新时,表将被视为单个逻 辑实体,所以在数据访问层你会感觉和访问普通表一样,而好处就在于可以查询想要的某个分区,而不必扫描整个表。有一点必须明白,单个表的所有分区都必须位 于同一个数据库中。
分区表支持和标准表相关的所有属性和功能,包括约束、默认值、标识和时间戳值以及触发器等。决定是否实现分区主要取决于表当前的大小或将来的大小以及对表执行查询和维护操作的完善程度。
通常,如果某个大型表同时满足下列两个条件,则可能适于进行分区:
1,该表包含或将包含以多种不同方式使用的大量数据
2,维护开销超过了预定义的维护期
例如,如果对当前年份或当前月份的数据主要执行 SELECT 、INSERT、UPDATE 和 DELETE 操作,而对以前年份或以前月份的数据主要执行 SELECT 查询,则如果按年份或月份对表进行分区,表的管理要容易些,因为此时对表的维护操作只针对一个数据子集。如果该表没有分区,那么就需要对整个数据集执行这些操作,这样就会消耗大量资源。
所以常常根据日期和分类对表进行分区,当然利用某个标识列ID也是很好的选择。例如,电子商务数据库的某张表可能包含了近6年的数据,但是只定期访问本年度或某个月的数据,那么就可以按年份或月份分区,而另外一张表包含了近几十种类型商品的订单,那么此时可以为每种类型商品分一个区。
一般而言,衡量大型表是以数据为标准的,但对于适合分区的大型表,衡量大型表更重要的是对数据访问的性能,如果对于某些表的访问和维护有较严重的性能问题,就可以视为大型表,就应该考虑通过更好的设计和分区来解决性能问题。
创建分区表必须经过如下三个步骤:
1,  创建分区函数
2,  创建映射到分区函数的分区方案
3,  创建使用该分区方案的分区表
分区函数
 
分区函数是数据库中的一个独立对象,它将表的行映射到一组分区,所以分区函数解决的是HOW的问题,即表如何分区的问题。创建分区函数时,必须指明数据分区的边界点以及分区依据列,这样便知道如何对表或索引进行分区。分区函数的创建语法如下:
CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )
AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )
[ ; ]
分区函数语法的相关解释:
1,  创建一个分区函数和创建一个普通的数据库对象(例如表)没什么区别。所以根据标准语法走就OK了。
2,  partition_function_name是分区函数的名称。分区函数名称在数据库内必须唯一,并且符合标识符的规则。
3,  input_parameter_type是用于分区的列的数据类型,习惯把它称为分区依据列。当用作分区列时,除 text、ntext、image、xml、timestamp、varchar(max)、nvarchar(max)、varbinary(max)、别名数据类型或 CLR 用户定义数据类型外,其他所有数据类型均有效。分区依据列是在 CREATE TABLE 或 CREATE INDEX 语句中指定的。
4,  boundary_value [ ,...n ]中的boundary_value是边界值(或边界点的值),n代表可以最多有n个边界值,即n指定 boundary_value 提供的值的数目,但n不能超过 999。所创建的分区数等于 n + 1。不必按顺序列出各值。如果值未按顺序列出,则 Database Engine 将对这些边界值进行排序,创建分区函数并返回一个警告,说明未按顺序提供值。如果 n 包括任何重复的值,则数据库引擎将返回错误。边界值的取值一定是和分区依据列相关的,所以只能使用 CREATE TABLE 或 CREATE INDEX 语句中指定的一个分区列。
5,  LEFT | RIGHT 指定boundary_value [ ,...n ] 的每个boundary_value属于每个边界值间隔的哪一侧(左侧还是右侧)。如果未指定,则默认值为 LEFT。
例如我们可以依据某个表的int列来创建分区函数:
create partition function MyPF1(int)
range left    --默认是left,所以可以省略left
for values(500000,1000000,1500000)
很明显,这个分区函数创建了4个分区,因为此时n=3,所以分区总数是n+1=4。而那个int分区依据列表明将要分区的那个表里面一定有一列是int类型,是分区依据列。这个分区函数我们用的是range left,各个分区的取值范围如下表:
分区
取值范围
1
(负无穷,500000]
2
[500001,1000000]
3
[1000001,1500000]
4
[1500001,正无穷)
如果换成range right,即创建分区函数时代码如下:
create partition function MyPF1(int)
range right
for values(500000,1000000,1500000)
那么各个分区的取值范围如下表:
分区
取值范围
1
(负无穷,499999]
2
[500000,999999]
3
[1000000,1499999]
4
[1500000,正无穷)
我们还可以根据日期列创建分区函数,例如:
create partition function MyPF2(datetime)
range right
for values('2008/01/01', '2009/01/01')
这个分区函数非常适合查询和归档某一年的数据。各个分区的取值范围如下表:
分区
取值范围
1
<=2007/12/31
2
[2008/01/01,2008/12/31]
3
>=2009/01/01
当然我们也可以根据月份分区,而分区依据列支持的数据类型非常多,参照项目的实际情况选择最能表示分区的列类型。
分区方案
对表和索引进行分区的第二步是创建分区方案。分区方案定义了一个特定的分区函数将使用的物理存储结构(其实就是文件组),或者说是分区方案将分区函数生成的分区映射到我们定义的一组文件组。所以分区方案解决的是Where的问题,即表的各个分区在哪里存储的问题。分区方案的创建语法如下:
CREATE PARTITION SCHEME partition_scheme_name
AS PARTITION partition_function_name
[ ALL ] TO ( { file_group_name | [ PRIMARY ] } [ ,...n ] )
[ ; ]
分区方案语法的相关解释:
1,  创建分区方案时,根据分区函数的参数,定义映射表分区的文件组。必须指定足够的文件组来容纳分区数。可以指定所有分区映射到不同文件组、某些分区映射到单个文件组或所有分区映射到单个文件组。如果您希望在以后添加更多分区,还可以指定其他“未分配的”文件组。在这种情况下,SQL Server 用 NEXT USED 属性标记其中一个文件组。这意味着该文件组将包含下一个添加的分区。一个分区方案仅可以使用一个分区函数。但是,一个分区函数可以参与多个分区方案。
2,  partition_scheme_name 是分区方案的名称。分区方案名称在数据库中必须是唯一的,并且符合标识符规则。
3,  partition_function_name 是使用当前分区方案的分区函数的名称。分区函数所创建的分区将映射到在分区方案中指定的文件组。partition_function_name 必须已经存在于数据库中。
4,  ALL 指定所有分区都映射到在 file_group_name 中提供的同一个文件组,或映射到主文件组(如果指定了 [PRIMARY])。如果指定了 ALL,则只能指定一个 file_group_name。
5,  file_group_name | [ PRIMARY ] [ ,...n] 代表n个文件组。和分区函数中的各个分区对应。文件组必须已经存在于数据库中。 如果指定了 [PRIMARY],则分区将存储于主文件组中。如果指定了 ALL,则只能指定一个 file_group_name。分区分配到文件组的顺序是从分区 1 开始,按文件组在 [,...n] 中列出的顺序进行分配。在 [,...n] 中,可以多次指定同一个文件组。如果 n 不足以拥有在分区函数中指定的分区数,则 CREATE PARTITION SCHEME 将失败,并返回错误。
6,  如果分区函数生成的分区数少于创建分区方案时提供的文件组数,则分区方案中第一个未分配的文件组将被标记为 NEXT USED,并且出现显示命名 NEXT USED 文件组的信息。如果指定了 ALL,则单独的文件组将为该分区函数保持它的NEXT USED 属性。如果在 ALTER PARTITION FUNCTION 语句中创建了一个分区,则 NEXT USED 文件组将再接收一个分区。若要再创建一个未分配的文件组来拥有新的分区,请使用 ALTER PARTITION SCHEME。
分区方案例子1:下面的代码先创建一个分区函数,然后再创建这个分区函数使用的分区方案,这个分区方案将每个分区映射到不同文件组。代码如下:
create partition function MyPF1(int)
as range left
for values(500000,1000000,1500000)
go
create partition scheme MyPS1
as partition MyPF1
to (fg1, fg2, fg3, fg4)
文件组、分区和分区边界值范围之间的关系如下表:
文件组
分区
取值范围
fg1
1
(负无穷,500000]
fg2
2
[500001,1000000]
fg3
3
[1000001,1500000]
fg4
4
[1500001,正无穷)
分区方案例子2:下面的代码先创建一个分区函数,然后再创建这个分区函数使用的分区方案,这个分区方案将多个分区映射到同一个文件组。代码如下:
create partition function MyPF2(int)
as range left
for values(500000,1000000,1500000)
go
create partition scheme MyPS2
as partition MyPF2
to (fg1, fg1, fg1, fg2)
文件组、分区和分区边界值范围之间的关系如下表:
文件组
分区
取值范围
fg1
1
(负无穷,500000]
Fg1
2
[500001,1000000]
Fg1
3
[1000001,1500000]
Fg2
4
[1500001,正无穷)
分区方案例子3:下面的代码先创建一个分区函数,然后再创建这个分区函数使用的分区方案,这个分区方案将所有分区映射到同一个文件组。代码如下:
create partition function MyPF3 (int)
as range left
for values(500000,1000000,1500000)
go
create partition scheme MyPS3
as partition MyPF3
all to (fg1)
文件组、分区和分区边界值范围之间的关系如下表:
文件组
分区
取值范围
fg1
1
(负无穷,500000]
Fg1
2
[500001,1000000]
Fg1
3
[1000001,1500000]
Fg1
4
[1500001,正无穷)
分区方案例子4:下面的代码先创建一个分区函数,然后再创建这个分区函数使用的分区方案,这个分区方案指定了“NEXT USED”文件组。代码如下:
create partition function MyPF4(int)
as range left
for values(500000,1000000,1500000) --4个分区
go
create partition scheme MyPS4
as partition MyPF4
to (fg1, fg2, fg3, fg4, fg5)   --5个文件组
那么文件组fg5将自动被标记为“NEXT USED”文件组。
分区方案例子5:下面的代码先创建一个分区函数,然后再创建这个分区函数使用的分区方案,这个分区方案指定了“[primary]”文件组。代码如下:
create partition function MyPF5(datetime)
range right
for values('2008/01/01', '2009/01/01')
go
create partition scheme MyPS5
as partition MyPF5
to([primary], fg1, fg2)
最后必须明白一点,一张表最多只能有1000个分区。
分区表
 
在分区函数和分区方案创建完成后,创建分区表的准备工作已经完成。我们看一个完整的例子,代码如下:
--创建分区函数
create partition function MyPF(datetime)
range right
for values('2007-1-1', '2008-1-1')
go
--创建分区方案
create partition scheme MyPS
as partition MyPF
to(fg1, fg2, fg3)
go
--创建分区表
create table orders
(
OrderID int identity(1,1) primary key,
OrderDate datetime,
CustID varchar(10)
)
on MyPS(OrderDate)
原文转载:http://blog.csdn.net/pt1314917/article/details/4435083

[转]sqlserver 创建分区表相关推荐

  1. 分区表--SQLServer创建分区表

    分区表的定义大体上分为三个步骤: 1)定义分区函数 2)定义分区构架 3)定义分区表 4)修改分区表... ************* 以下为测试代码 ************* USE [maste ...

  2. SQL SERVER 性能优化四: 创建分区表

    1.整体介绍 1.1 分区表概念:分区表值得是逻辑上是一个表,物理上被存储到不同的磁盘文件中. 1.2 优势:提高查询性能:提高稳定性:便于管理:对于大数据量表备份更方便. 1.3 建立分区表主要包含 ...

  3. oracle创建表分区表,oracle创建分区表

    这里的第一种方式创建分区表是最近更改程序时学会的,哈哈 -- 通过create table tablename as select * from tablename (指定分区) create tab ...

  4. 创建分区表+分区表的分类+创建散列分区表+查看散列分区表分区中的数据+创建列表分区表+查看列表分区表分区中的数据...

    创建分区表 分区表的分类 范围分区:对数据表的某个值的范围进行分区,需要使用partition by range字句. 散列分区: 1通过hash算法均匀分布数据的一种分区类型. 2通过在I/O设备上 ...

  5. 如何使用Data Lake Analytics创建分区表

    前言 Data Lake Analytics (后文简称DLA)提供了无服务化的大数据分析服务,帮助用户通过标准的SQL语句直接对存储在OSS.TableStore上的数据进行查询分析. 在关系型数据 ...

  6. Hive的基本操作-创建分区表

    分区表 在大数据中,最常用的一种思想就是分治,我们可以把大的文件切割划分成一个个的小的文件,这样每次操作一个小的文件就会很容易了,同样的道理,在hive当中也是支持这种思想的,就是我们可以把大的数据, ...

  7. hive创建分区表 指定分隔符_HIVE 对于分区表的操作

    CREATE EXTERNAL TABLE IF NOT EXISTS data_zh( ROWKEY STRING, STATION INT, YEAR INT, MONTH INT, DAY IN ...

  8. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?...

    如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...

  9. sqlserver创建程序集

    sqlserver创建程序集 适用对象: SQL ServerAzure SQL 数据库Azure SQL 数据仓库并行数据仓库 托管数据库对象(如存储过程或触发器)先经过编译,然后部署到称为程序集的 ...

最新文章

  1. mysql 5.7 安装错误提示总结
  2. Android 打印方法调用堆栈
  3. linux 界面工具 qt,Qt主窗口中的工具栏
  4. 虚拟化、完全虚拟化、半虚拟化和准虚拟化技术区别
  5. 脚本启动Tomcat
  6. java教学楼的属性_java设计一个父类建筑物building,由它派生出教学楼类classroom,然后采用一些数据进行测试....
  7. java day_Java_Day7(上)
  8. Java实现二维码生成
  9. 使用.NET Core进行Linux编程3:简介和第2章
  10. php 小程序生成海报,轻松生成小程序分享海报
  11. 德生收音机创始人梁伟(华工杰出校友)的无线电之梦
  12. gdb打印超长字符串或数组
  13. 基于图片的三维重建深度图与原图
  14. php写前端还是nodejs,javascript - 新手想在短期内写一个个人博客,是用php还是用nodejs?...
  15. [Invariance Matters: Exemplar Memory for Domain Adaptive Person Re-identification 魔改代码
  16. 用这个工具,让人抓狂的领导驾驶舱报表五步搞定
  17. 办公用计算机的配置,各取所需硬道理 办公用电脑配置如何选
  18. 电脑主机选购---内存条,光驱
  19. 免费网站源码分享平台 有哪些好的源码网站
  20. 案例分析——快手百万在线直播

热门文章

  1. HTML5移动Web开发(六)——定义一个内容策略
  2. IIS启用.net2.0
  3. Bolt XML和JQBolt Lua代码自动补全插件配置教程
  4. 温州动车事故中受伤的“我”,还好吗?
  5. Spring3 MVC注解Hello World
  6. ansible的命令操作模块6
  7. 巩固shell基础知识
  8. 这一回,我们聊聊恐惧
  9. IntelliJ IDEA 14 license key gen
  10. 谷歌Apps vs.微软Office