none
SQL SERVER 2008对不断有新增数据写入的表,如何进行分区? RRS feed

  • 问题

  • 如题,环境大致是Windows Server 2003 SP2 + SQL SERVER 2008 SP1。基于这个环境目前我在对表拆分的情况进行一些测试,如果可以满足我们对性能上的要求的话未来一部分数据可能会采用分区的方式进行存储。

    截止到昨天为止一切还比较顺利,不过今天我遇到了个问题:数据表中大约有5亿左右的数据,用一个DATE型的字段作为分区依据,每个月视为一个分区;每个分区保存在一个单独的文件组上,每个文件组对应一个单独的文件。数据表中存在聚集索引(非唯一),索引创建时与表的分区策略保持一致,作为分区依据的日期字段是聚集索引中的其中一列。具体的建表语句可参考如下SQL:

    CREATE PARTITION FUNCTION [PF_myTable_AddDateRange](DATE)
    AS
    RANGE LEFT FOR VALUES
    ('2010-12-31',
    '2011-01-31',
    '2011-02-28')

    ALTER DATABASE myDB ADD FileGroup [myDB201101];
    ALTER DATABASE myDB ADD FileGroup [myDB201102];
    ALTER DATABASE myDB ADD FileGroup [myDB201103];

    ALTER DATABASE myDB ADD FILE
    (NAME = N'myDB201101', FILENAME = N'D:\DB\myDB201101.ndf', SIZE=5MB, FILEGROWTH = 5MB) TO FILEGROUP [myDB201101];

    ALTER DATABASE myDB ADD FILE
    (NAME = N'myDB201102', FILENAME = N'D:\DB\myDB201102.ndf', SIZE=5MB, FILEGROWTH = 5MB) TO FILEGROUP [myDB201102];

    ALTER DATABASE myDB ADD FILE
    (NAME = N'myDB201103', FILENAME = N'D:\DB\myDB201103.ndf', SIZE=5MB, FILEGROWTH = 5MB) TO FILEGROUP [myDB201103];

    CREATE PARTITION SCHEME PS_AddDate
    AS
    PARTITION PF_myTable_AddDateRange TO ([myDB201101],[myDB201102],[myDB201103],[PRIMARY])

    CREATE TABLE [myTable]
    (
     [MemberId] [int] NOT NULL,
     [ProductId] [int] NOT NULL,
     [AddDate] [date] NOT NULL,
     [PositionId] [int] NOT NULL,
     [DealerId] [int] NOT NULL
    )
    ON PS_AddDate(AddDate)

    CREATE CLUSTERED INDEX clu_myTable_MemberId_AddDate_ProductId ON [myTable] (
     [MemberId] ASC,
     [AddDate] DESC,
     [ProductId] ASC
    )

    那么当4月到来时,我需要在分区函数中新增一个日期的划分区间,所以在创建了新的文件组和信的文件之后,我执行如下操作:

    ALTER PARTITION FUNCTION [PF_myTable_AddDateRange]()
    SPLIT RANGE (N'2011-03-31')

    但是这样将会导致执行时间很长,大约40分钟。而如果不修改分区函数又会使主文件组中的数据慢慢多于其它文件组中的数据,也就起不到分区的效果了。所以想请问各位,对于目前的这种情况,应该如何进行表分区的扩展呢?是不是说我应该在当月结束之后(比如4月结束之后)再将历史数据划分到新的分区之中?但是那样又感觉主文件组和新创建的文件组中包含重复的数据,是不是在分区完成之后还需要进行删除操作?感谢各位

    2011年4月13日 9:07

答案

  • In your case, all data of March are in primary filegroup. Once you added new filegroup for March and do partition split, sql will move March's data to new filegroup.

    • 已标记为答案 Ai-hua Qiu 2011年4月22日 7:09
    2011年4月14日 13:41

全部回复

  • It's because you put each partition in its own filegroup, there's lot of data movement when do partion split/merge in this case.
    2011年4月13日 13:01
  • 感谢指导,之前我也一直怀疑是这个问题。不过后来我对照了一下我的测试数据,当修改分区函数的时候,所指定的边界(即“2011-03-31”)右侧没有数据,或者说不存在大于等于2011年4月1日的数据。所以为什么会出现数据移动的情况也着实令我觉得很奇怪
    2011年4月14日 5:25
  • In your case, all data of March are in primary filegroup. Once you added new filegroup for March and do partition split, sql will move March's data to new filegroup.

    • 已标记为答案 Ai-hua Qiu 2011年4月22日 7:09
    2011年4月14日 13:41