使用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 1335048
72057596827664384 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如上标红的地方怎么会是我的数据总量呢?
看上面的分区数据结果,肯定是那里没有做好。
请教下如何正确的 分区恩

解决方案 »

  1.   

    --查看每个分区记录存放数
    select $partition.QuaterDateRangePFN(分区字段) as 分区 ,count(*) as 记录数 
    from 你的表
    group by $partition.QuaterDateRangePFN(分区字段)  --查看全部记录
    select $partition.QuaterDateRangePFN(分区字段) as 分区 ,分区字段,* 
    from 你的表 a 
    order by a.分区字段
      

  2.   

    楼主的这句貌似有问题,分区函数有7个时间点,也就是把表划分为8个时间段,也就是8个表分区.
    但设置分区架构时,把8个表分区都放在[primary]文件组,为何?刚建的[test]文件组为何不用.
    建议一个分区对应到一个文件组(FileGroup),再把文件组放到不同磁盘上,这样才能发挥出优势.--创建分区架构,将分区函数应用到该架构上:
    CREATE PARTITION SCHEME MonthDateRangeScheme 
    AS
    PARTITION MonthDateRange 
    ALL TO ([primary])
      

  3.   


    你的分区肯定是不正确的。--按分区方案创建索引
    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语句(略)楼主,记得结贴哦
      

  4.   

    从无分区表到已分区表的迁移步骤.
    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,[原表名]
      

  5.   


    你觉得哪个正确呢?#7已经把两种转换方法列出来了。建聚集索引分区是最简单快捷的方法,且不会出错。你愿意用导入数据的办法,那就导嘛。as you wish.