使用sqlserver2005 的表分区功能。
有个疑问,网上的资料都是针对任何去建立一个表分区的。
但是我的需求是要对已经有几千万数据的表进行分区,并不是一张新表进行分区。请问如何实现?保证数据的完整性。
我的分区步骤是这样的--建立新的文件组
ALTER DATABASE dbxx ADD FILEGROUP [test]--创建分区
CREATE PARTITION FUNCTION MonthDateRange(datetime)
AS RANGE LEFT FOR VALUES
(
'20071231 23:59:59.997',
'20081231 23:59:59.997',
'20091231 23:59:59.997',
'20101231 23:59:59.997',
'20111231 23:59:59.997',
'20121231 23:59:59.997',
'20131231 23:59:59.997'
)
--创建分区文件
--使用系统存在的
--创建分区架构,将分区函数应用到该架构上:
CREATE PARTITION SCHEME MonthDateRangeScheme ASPARTITION MonthDateRange ALL TO ([primary])
--按分区方案创建索引
create index IDX_L_TESTRESULT_MEASURETIME
on wcmdocument(CsTIME)
on MonthDateRangeScheme(CsTIME)
然后查询分区结果
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('tableXXX')
select * ,$PARTITION.MonthDateRange(CsTIME) from wcmdocument where CsTIME>='2010-11-01'
结果如下
72057596827140096 389576426 1 1 72057596827140096 1335048
72057596827205632 389576426 3 1 72057596827205632 1335048
72057596827271168 389576426 4 1 72057596827271168 1335048
72057596827336704 389576426 18 1 72057596827336704 1335048
72057596827402240 389576426 31 1 72057596827402240 1335048
72057596827467776 389576426 33 1 72057596827467776 1335048
72057596827533312 389576426 34 1 72057596827533312 1335048
72057596827598848 389576426 36 1 72057596827598848 133504872057596827664384 389576426 37 1 72057596827664384 68
72057596827729920 389576426 37 2 72057596827729920 359422
72057596827795456 389576426 37 3 72057596827795456 569009
72057596827860992 389576426 37 4 72057596827860992 406549
72057596827926528 389576426 37 5 72057596827926528 0
72057596827992064 389576426 37 6 72057596827992064 0
72057596828057600 389576426 37 7 72057596828057600 0
72057596828123136 389576426 37 8 72057596828123136 0如上标红的地方怎么会是我的数据总量呢?
看上面的分区数据结果,肯定是那里没有做好。
请教下如何正确的 分区恩
有个疑问,网上的资料都是针对任何去建立一个表分区的。
但是我的需求是要对已经有几千万数据的表进行分区,并不是一张新表进行分区。请问如何实现?保证数据的完整性。
我的分区步骤是这样的--建立新的文件组
ALTER DATABASE dbxx ADD FILEGROUP [test]--创建分区
CREATE PARTITION FUNCTION MonthDateRange(datetime)
AS RANGE LEFT FOR VALUES
(
'20071231 23:59:59.997',
'20081231 23:59:59.997',
'20091231 23:59:59.997',
'20101231 23:59:59.997',
'20111231 23:59:59.997',
'20121231 23:59:59.997',
'20131231 23:59:59.997'
)
--创建分区文件
--使用系统存在的
--创建分区架构,将分区函数应用到该架构上:
CREATE PARTITION SCHEME MonthDateRangeScheme ASPARTITION MonthDateRange ALL TO ([primary])
--按分区方案创建索引
create index IDX_L_TESTRESULT_MEASURETIME
on wcmdocument(CsTIME)
on MonthDateRangeScheme(CsTIME)
然后查询分区结果
SELECT * FROM SYS.PARTITIONS WHERE OBJECT_ID = OBJECT_ID('tableXXX')
select * ,$PARTITION.MonthDateRange(CsTIME) from wcmdocument where CsTIME>='2010-11-01'
结果如下
72057596827140096 389576426 1 1 72057596827140096 1335048
72057596827205632 389576426 3 1 72057596827205632 1335048
72057596827271168 389576426 4 1 72057596827271168 1335048
72057596827336704 389576426 18 1 72057596827336704 1335048
72057596827402240 389576426 31 1 72057596827402240 1335048
72057596827467776 389576426 33 1 72057596827467776 1335048
72057596827533312 389576426 34 1 72057596827533312 1335048
72057596827598848 389576426 36 1 72057596827598848 133504872057596827664384 389576426 37 1 72057596827664384 68
72057596827729920 389576426 37 2 72057596827729920 359422
72057596827795456 389576426 37 3 72057596827795456 569009
72057596827860992 389576426 37 4 72057596827860992 406549
72057596827926528 389576426 37 5 72057596827926528 0
72057596827992064 389576426 37 6 72057596827992064 0
72057596828057600 389576426 37 7 72057596828057600 0
72057596828123136 389576426 37 8 72057596828123136 0如上标红的地方怎么会是我的数据总量呢?
看上面的分区数据结果,肯定是那里没有做好。
请教下如何正确的 分区恩
select $partition.QuaterDateRangePFN(分区字段) as 分区 ,count(*) as 记录数
from 你的表
group by $partition.QuaterDateRangePFN(分区字段) --查看全部记录
select $partition.QuaterDateRangePFN(分区字段) as 分区 ,分区字段,*
from 你的表 a
order by a.分区字段
但设置分区架构时,把8个表分区都放在[primary]文件组,为何?刚建的[test]文件组为何不用.
建议一个分区对应到一个文件组(FileGroup),再把文件组放到不同磁盘上,这样才能发挥出优势.--创建分区架构,将分区函数应用到该架构上:
CREATE PARTITION SCHEME MonthDateRangeScheme
AS
PARTITION MonthDateRange
ALL TO ([primary])
你的分区肯定是不正确的。--按分区方案创建索引
create index IDX_L_TESTRESULT_MEASURETIME
on wcmdocument(CsTIME)
on MonthDateRangeScheme(CsTIME)
--你的上述语句只是在wcmdocument表上建了个分区索引,wcmdocument表仍然是未分区表.要将一个未分区的表转成分区表,有两个办法。
--1.建立聚集分区索引。
create clustered index pk_TESTRESULT_MEASURETIME
on wcmdocument(CsTIME)
on MonthDateRangeScheme(CsTIME)
--2.使用alter table ... switch .. to语句(略)楼主,记得结贴哦
1. 建立文件组(FileGroup),最好对应到不同磁盘.
2. 建立分区函数(PARTITION FUNCTION).
3. 建立分区架构(PARTITION SCHEME).
4. 建立分区表(PARTITION TABLE),表名暂取temptable
5. 迁移数据,建议系统闲时进行,且分批导入,会产生有锁.
select * into temptable from [原表名] where ...
6. 调换表名 sp_rename [原表名],[原表名2] --可能会在瞬间找无表
7. 调换表名 sp_rename temptable,[原表名]
你觉得哪个正确呢?#7已经把两种转换方法列出来了。建聚集索引分区是最简单快捷的方法,且不会出错。你愿意用导入数据的办法,那就导嘛。as you wish.