日期:2014-05-18  浏览次数:20536 次

关于分区问题的请教
目前业务系统有一张表PriceDetail 一年的数据量大概在3000W左右,现在想根据ddate(发生日期 如:2012-01-05)
字段来进行分区(以年度分区),以前没有做过分区方面的这种业务 ,求大侠们帮忙写一个分区的方案。。。。


------解决方案--------------------
先建立partition function神码的,按照年份分区,key是ddate,设一个起始range,保证最后一个partition是空的
然后新的一年的数据插入时,就split最后的那个空partition分成2个空partition,新数据就插到新的partition里,再次保证最后有一个空的partition以便插入下一年数据。

如果是已有的几年的数据想要有效率的转换为partition,可以先把每年的数据放到一个pseudo table(和主表结构相同),然后switch到主表中。

具体可以参考msdn的partition whitepaper
------解决方案--------------------
SQL code
--分区函数
CREATE PARTITION FUNCTION [myPF] (datetime)
AS RANGE RIGHT FOR VALUES ('20080101', '20090101', '20100101',
               '20110101', '20120101', '20130101', '20140101');

--分区方案
CREATE PARTITION SCHEME myPS
AS PARTITION myPF
TO (fg1, fg2, fg3, fg4, fg5, fg6, fg7, fg8);

--创建表               

CREATE TABLE PriceDetail  (
DDATE DATETIME ,
col1 int
, col2 char(10)
...
)
ON myPS (DDATE) ;
GO

------解决方案--------------------
仅供楼主参考:
第一步:创建文件组,用于存储表分区的数据文件。
第二步:创建一个分区函数。为每个分区确定边界。特别注意,在指定分区函数的时候,只能按单个值分区,也就是分区只能按照一个统一的条件。
RANGE RIGHT:分区所依据的值所在行在边界右边的分区。
RANGE LEFT:分区所依据的值所在行在边界左边的分区。
例:
CREATE PARTITION FUNCTION YearFunction(orderdate)
AS RANGE RIGHT FOR VALUES ('2006-01-01','2007-01-01','2008-01-01')
上面的代码中使用了RANGE RIGHT选项,表示按日期分4组,第一组为NULL值到'2005-12-31',第二组为'2006-01-01'到'2006-12-31',第三组为'2007-01-01'到'2007-12-31',第四组为'2008-01-01'值INFITITY。也就是将'2006-01-01'所在行放到第二组,将'2007-01-01'放到第三组,将'2008-01-01'放到第四组。
如果选择了RANGE LEFT选项,也就是将'2006-01-01'所在行放到第一组,将'2007-01-01'放到第二组,将'2008-01-01'放到第三组。
第三步:创建分区方案。分区方案用于确定分区的物理存放位置。在定义分区方案时,指定的文件组数必须与分区函数中定义的分区数相同。
例:
CREATE PARTITION SCHEME YearScheme
AS PARTITION YearFunction 
TO (文件组1,文件组2,文件组3,文件组4)
一共4个文件组,对应4个分区表,每个文件组放一张分区表。
如果想将所有分区都存储在一个文件组中,有两个选项:
1. 对每个分区重复使用同一个文件组名;
2. 对单个文件组使用ALL TO选项,例如ALL TO([PRIMARY])。
也可以在最后一个文件组指定一个额外的文件组,这个文件组会被标记为“下一”文件组,可在创建另一个分区的时候使用。
第四步:创建实际分区表并将数据从原表中移至分区表中。
删除时,按照分区表、分区方案、分区函数的顺序执行:
DROP TABLE 分区表
DROP PARTITION SCHEME YearScheme
DROP PARTITION FUNCTION YearFunction