数据库分区

a:什么是表分区
一般情况下,我们建立数据库表时,表数据都存放在一个文件里。但是如果是分区表的话,表数据就会按照你指定的规则分别放到不同的
文件里,把一个大的数据文件拆分成多个小文件,还可以把这些小文件放在不同的磁盘下由多个CPU进行处理,这样文件的大小随着拆分而
减小,自然对我们操作数据时大大有利的。
所以 大数据量的数据表,对分区的需要还是有必要的,因为它可以提高select效率,还可以对历史数据经行区存档等,但如果数据量少就不要
这么整了,因为会产生不必要的开销

跟着做:
分区是要把一个表数据拆分为若干个子集,也就是把一个数据文件拆分到多个数据文件中,然而这些文件的存放可以依托一个文件组或者多个
文件组,由于多个文件组可以提高数据库的访问并发量,还可以把不同的分区配置到不同的磁盘中提高效率,所以创建时建议分区跟文件组
个数相同


1:创建一个或者多个文件组来持有分区(我理解的文件组就是创建几个文件夹来存放数据用的)
2: 在分区过程中使用的每个文件组
3:使用CREATE PARTITION FUNCTION 命令来决定表中的数据如何分区(啪 提神;分开的意思)
4:使用CREATE PARTITION SCHEME 命令来绑定PARTITION FUNCTION到指定文件组(死 给母;方案的意思)
5:创建表,绑定某个分区列到PARTITION SCHEME


实践:1:创建一个数据库AdventureWorks
create database AdventureWorks;

 2: 为这个数据库加入新的文件组
  alter database AdventureWorks add filegroup hitfg1;
alter database AdventureWorks add filegroup hitfg2;
alter database AdventureWorks add filegroup hitfg3;
alter database AdventureWorks add filegroup hitfg4;

 3: 对于创建的每个文件组,向其中加入一个新的数据库文件
  alter database AdventureWorks
add file(
name=awhitfg1,
filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\aw_hitfgl.ndf',
size=1MB
)
to filegroup hitfg1
go
alter database AdventureWorks
add file(
name=awhitfg2,
filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\aw_hitfg2.ndf',
size=1MB
)
to filegroup hitfg2
go
alter database AdventureWorks
add file(
name=awhitfg3,
filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\aw_hitfg3.ndf',
size=1MB
)
to filegroup hitfg3
go
alter database AdventureWorks
add file(
name=awhitfg4,
filename='C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\aw_hitfg4.ndf',
size=1MB
)
to filegroup hitfg4
go

4:创建分区函数,他定义了分区函数的分区边界和期望的分区列类型数据,我们选择了datetime数据类型,然后定义了分区函数的值域,通过年份
来创建分区,可以定义多大999个分区,你选择n个值就会得到n+1个分区,你还可以选择left或right,他定义了所定义的值属于哪个边界
如果是left则包含‘1/1/2006’,如果是right则为'12/31/2005 12:59:59';一旦创建了分区函数,他就能用于一个或多个分区方案
create partition function HitDateRange(datetime) as range left for values('1/1/2006','1/1/2007','1/1/2008')

5:创建分区方案来绑定分区函数到新的文件组;分区方案把分区函数中定义的分区映射到实际的文件组中。新的分区方案的第一行定义了分区方案的名字
第二行定义了分区方案绑定的分区函数,to子句按照分区序列的次序定义了哪些文件组映射到分区函数中定义的4个分区,创建了分区方案后,就能把他绑定到
表中
create partition scheme HitDateRangeScheme as partition HitDateRange to (hitfg1,hitfg2,hitfg3,hitfg4)

6:最后,create table在on子句使用HitDate列来创建一个使用这个分区方案的表;在create table语句的on子句中指出了分区方案,并在圆括号内指定了要分区的列
注意:主键由WebSiteHitID和HitDate组成,分区的键列(HitDate)必须是主键的一部分
create table dbo.WebSiteHits
(
WebSiteHitID bigint NOT NULL identity(1,1),
webSitePage varchar(255) NOT NULL,
HitDate datetime NOT NULL,
CONSTRAINT PK_WebSiteHits
PRIMARY KEY(WebSiteHitID,HitDate)
)
on [HitDateRangeScheme](HitDate)

b: 确定数据在分区中的位置
首先插入数据:
insert dbo.WebSiteHits(WebSitePage,HitDate) VALUES('Home page','10/22/2007')
insert dbo.WebSiteHits(WebSitePage,HitDate) VALUES('Home page','10/2/2006')
insert dbo.WebSiteHits(WebSitePage,HitDate) VALUES('Sales page','5/9/2008')
insert dbo.WebSiteHits(WebSitePage,HitDate) VALUES('Sales page','3/4/2000')
其次,因为分区操作在后台发生,所以不能直接查询各个分区。要确定数据属于哪个分区,可以使用$PARTITION函数,语法如下:
$PARTITION.partition_function_name(expression);其中 partition_function_name表示“用于划分表的分区函数名”,expression表示“作为分区键的列”
执行以下语句:
select HitDate,$PARTITION.HitDateRange(HitDate) Partition from dbo.WebSiteHits;就可以查看数据的分区情况
 
   c:增加新的分区
要增加一个新的分区,可以使用alter partition scheme和alter partition function 命令,要想为一个既有的分区函数创建新的分区,首先必须准备一个文件组来
保存新分区的数据(新的或者已有的文件组都行)。第一步是使用alter partition scheme来指定下一个分区文件组,命令如下
alter partition scheme partition_scheme_name next used [filegroup_name];其中‘partition_scheme_name’指定了需要修改的分区方案名,next used [filegroup_name]
next used 关键字把下一个文件组列入使用队列,让任何新的分区使用;在增加了下一个文件组的引用后,使用alter partition function 来创建(分割)新的分区(移除/合并分区也一样)。
alter partition 的语法如下:
alter partition function partition_function_name()
{
split range(boundary_value)
 | merge range(boundary_value)
}
参数如下:
partition_function_name   这个参数指定了要从中添加或移除分区的分区函数名
split range(boundary_value)| merge range(boundary_value)    split range 通过定义一个新的边界值来创建一个新的分区。merge range用于移除一个既有的分区
例:这个示例演示如何创建(分割)一个新的分区。第一步就是新建一个为新分区所用的文件组,在本例中,使用primary文件组
alter partition scheme HitDateRangeScheme next used [primary]
接着,修改分区函数来创建新的分区,定义边界为2009年1月1日:
alter partition function HitDateRange() split range('1/1/2009')
在新分区创建后,插入一个新行来测试新分区:
insert dbo.WebSiteHits(WebSitePage,HitDate) values ('Sales Page','3/4/2009')
使用$PARTITION来查询表
select HitDate,$PARTITION.HitDateRange(HitDate) Partition from dbo.WebSiteHits;

d:移除分区
前面的技巧介绍了alter partition function 的语法,包括用于移除既有分区的merge range功能的描述,移除一个分区本质上是把两个分区合并成一个,行重新分配到目标合并的分区中
这个示例演示从HitDateRange分区函数中移除1/1/2007分区
alter partition function HitDateRange() merge range('1/1/2007')
然后使用$PARTITION函数查询已分区的表
select HitDate,$PARTITION.HitDateRange(HitDate) Partition from dbo.WebSiteHits;
每一次执行alter partition function只可以合并一个分区,并且不能使用alter partition function 把一个已分区的表转化为一个不分区的表---只能把分区的数量减少到一个分区

e:把分区移动到不同的表
使用sql server的分区功能,可以用最少的工作或最小的开销在不同的表之间转移分区。可以使用alter table...switch在表之间转移分区。转移能以3种方式进行:
1:从一个已分区的表转移一个分区到另外一个已分区的表(都需要对同一列进行分区)
2:转移整个未分区的表到一个已分区的表
3:从一个已分区的表移动一个分区到一个未分区的表
注意:sql server2005中,不能在绑定了架构的视图中引用分区表,也不允许使用索引视图,sql server2008支持架构绑定和分区索引视图
在表之间切换分区的基本语法如下:
alter table tableName switch[PARTITION source_partition_number_expression] to [schema_name] target_table [PARTITION target_partition_number_expression]
参数如下:
tableName 要移动分区的源表
source_partition_number_expression              要重新分配的分区号
[schema_name] target_table 接收分区的目标表
PARTITION target_partition_number_expression    目标分区号
接下来这个示例在dbo.WebSiteHits表和dbo.WebSiteHistory的新表之间移动分区,第一步就是创建一个新表来保存历史网站点击信息
create table dbo.WebSiteHitsHistory
( WebSiteHitID bigint not null identity(1,1),
WebSitePage varchar(255) not null,
HitDate datetime not null,
constraint pk_WebSiteHistory
primary key (WebSiteHitID,HitDate))
on [HitDateRangeScheme](HitDate)
然后使用alter table 把dbo.WebSiteHits表的3个分区转移到新表dbo.WebSiteHistory的3个分区中:
alter table dbo.WebSiteHits switch partition 3 to dbo.WebSiteHitsHistory partition 3
接着,使用$PARTITION查询转移到新表中的数据
select HitDate,$PARTITION.HitDateRange(HitDate) Partition from dbo.WebSiteHitsHistory;

f:移除分区函数和分区方案
如果尝试删除一个绑定到既有表或索引的分区函数或分区方案,就会得到一个错误信息。也不能直接移除一个绑定到表的分区方案或分区函数(除非删除整个表,本技巧将这么做),
使用下面的语法删除一个分区方案
drop partition scheme partition_scheme_name  这个命令接受要删除的分区方案名作为参数。
使用下面的语法删除一个分区函数
drop partition function partition_function_name 同样的,这个命令只接受要删除的分区函数作为参数
这个示例演示了如何删除一个分区函数和分区方案,假设在这种情况下可以删除源表(在正式应用 下通常不能这样做)
drop table dbo.WebSiteHitsHistory
drop table dbo.WebSiteHits
---删除分区方案和分区函数
drop partition scheme HitDateRangeScheme
drop partition function HitDateRange

你可能感兴趣的:(数据库)