一个程序员的梦

导航

统计

学习mssql2005笔记7--分区表

一、分区的目的: 为了改善大型表的可伸缩性和管理性。

  • 表和索引变得非常大时,分区将数据分成更小、更容易管理的部分。
  • 多个CPU的系统中,分区可以通过并行提高性能。

二、分区发展史

  • SQL 6.5 只能通过设计完成,性能没有大的改善。
  • SQL7  提供分区视图:联合视图的方式,提高了select 的性能,但是数据修改没有任何好处。
  • SQL2000: 提供分区视图

    通过视图修改数据。

    分布式,通过视图来更新数据。

    复杂的分区管理,查询时间随分区增加二增加。

       实现方法:

     step 1 :  按照水平分区来建立基础表。

     step 2 :  连接服务器。

     step 3:   建立分区视图。

     step 4:  通过分区视图来访问数据和更新数据。 

  • SQL2005: 分区表。

三、SQL2005: 分区表

  1.  SQL 2005 提供了在数据库的文件组之间表分区的功能,水平分区允许把表按分区scheme分为多个小的组。表分区用于非常大的,从几百GB到TB、甚至更大数据库。
  2. 通过SQL 2005 中的分区表,可以对表进行设计(使用函数和架构),从而将具有相同分区键的所有行都直接放置到(且总是转到)特定的位置。函数用于定义分区边界以及放置第一个值的分区。在使用LEFT 分区函数时,第一个值将作为第一个分区中的上边界。在使用RIGHT 分区函数时,第一个值将作为第二个分区的下边界。定义函数后即可创建分区架构,分区架构可以将对象映射到一个或多个文件组。为了确定数据的相应物理位置,分区架构将使用了分区函数。根据分区架构创建表。
  3. 实现分区表的步骤:
  • 确定是否应为对象分区
  • 确定分区键和分区数目
  • 确定是否应使用多个文件组
  • 创建文件组
  • 为分区创建分区函数        Create the partition function
  • 创建分区架构           Create the partition scheme
  • 创建分区表          Create the partitioned table

例子:

//SQL2005分区表用例
use master
alter database adventureWorks add filegroup [fg1]
go
alter database adventureWorks add filegroup [fg2]
go
alter database adventureWorks add filegroup [fg3]
go
alter database adventureWorks
add file
(name='fg1',
filename='c:\fg1.ndf',
size=5mb)
to filegroup [fg1]
go
alter database adventureWorks
add file
(name='fg2',
filename='d:\fg2.ndf',
size=5mb)
to filegroup [fg2]
go
alter database adventureWorks
add file
(name='fg3',
filename='e:\fg3.ndf',
size=5mb)
to filegroup [fg3]
go
use adventureWorks
go
create partition function emailPF(nvarchar(50)) as range right for values ('G','N')
go
create partition scheme emailPS as partition emailPF to (fg1,fg2,fg3)
go
create table customermail (custid int, email nvarchar(50)) on emailPS(email)
go

insert customermail values (1, 'ab@test.com.cn')
insert customermail values (2, 'K1@test.com.cn')
insert customermail values (3, 'z1@test.com.cn')
insert customermail values (4, 'g2@test.com.cn')
insert customermail values (5, 'a2@test.com.cn')
insert customermail values (6, 'TT@test.com.cn')

select * from customermail

// 撤销修改,回复原状

drop table customermail
go
drop partition scheme emailPS
go
drop partition function emailPF
go

use master
go
alter database adventureWorks
REMOVE FILE fg1
go
alter database adventureWorks
REMOVE FILEGROUP fg1
go
alter database adventureWorks
REMOVE FILE fg2
go
alter database adventureWorks
REMOVE FILEGROUP fg2
go

alter database adventureWorks
REMOVE FILE fg3
go
alter database adventureWorks
REMOVE FILEGROUP fg3
go

四、分区表分区的迁移、合并、分割、索引操作。

我做了如下设想,希望利用分区表来实现:

       1 我把日常交易流水数据分成2个表存储:Transaction 最近2年内数据,分区存储在[PRIMARY];TransactionArchive 是归档后的数据,保存2年以上历史数据,分区存储[分区1:hist1   分区2:PRIMARY(空的)]。 2个表中数据无交集。

       2 2005年以前数据已经归档到了TransactionArchive 表中,希望存放到hist1文件组中。

      3  分区迁移目的:Transaction2005年的数据迁移到TransactionArchive的分区1中。

实现方法://迁移2005

      1 分区函数定义部分参见上面的事例。

      2 表分区的迁移,必须迁移表的分区和被迁移标的分区在同一文件组中,所以先给TransactionArchivePS2 准备下一个分区的文件组合Transaction的分区2保持一致[PRIMARY]。
ALTER PARTITION SCHEME TransactionArchivePS2 NEXT USED [PRIMARY]

     3  TransactionArchivePF2()  拆分一个新的分区2:2005年度的数据

ALTER PARTITION FUNCTION TransactionArchivePF2() SPLIT RANGE('01/01/2005')

      4  迁移分区Transaction 2到TransactionArchive的分区2。 特别说明: 这一部分迁移限制较多,除了上面的文件组的原因外,主要是索引方面的问题,最好先停止索引文件,然后重新建立索引。
ALTER TABLE Production.TransactionHistory SWITCH PARTITION 2 TO Production.TransactionHistoryArchive PARTITION 2
     5  合并TransactionHistoryArchive分区2到分区1,减少一个分区。所有的数据到集中到文件组hist1上了,实现了我们的设计要求。 (如何察看表到底存储在那各文件组?我没有找到方法,只是通过试验发现的,合并后hist1发生了较大规模的扩展,可见数据实际存放在hist1上)

ALTER PARTITION FUNCTION TransactionArchivePF2() merge RANGE('01/01/2005')
    6  合并TransactionHistory分区1和分区2:2006-01-01以前的数据
ALTER PARTITION FUNCTION TransactionPF1() merge RANGE('01/01/2005')

ALTER PARTITION SCHEME TransactionPS1 NEXT USED [PRIMARY]

ALTER PARTITION FUNCTION TransactionPF1() merge RANGE('01/01/2006')

    7 重新建立索引。

posted on 2006-09-25 16:02 newman0816 阅读(...) 评论(...) 编辑 收藏