我有一个包含超过 200 亿行的 SQL Server 表,最后一个分区中有 130 亿行。
该表目前按“时间”字段分为 6 种方式:
2011
2012
2013
2014
2015
2016/2017/2018
2016/2017/2018分区需要拆分成各自的分区所以就有了2016、2017、2018分区。
如何做到这一点并在此过程中避免大量日志文件增长?数据库处于简单恢复中,目前每个分区都在其自己的一组磁盘上的单独文件组中。
CREATE TABLE [dbo].[Log](
[RefNo] [nchar](7) NOT NULL,
[DevID] [nvarchar](7) NOT NULL,
[Time] [datetime] NOT NULL,
[summary] [float] NULL,
[staging] [float] NULL,
[position] [float] NULL,
CONSTRAINT [PK_Log] PRIMARY KEY CLUSTERED
(
[RefNo] ASC,
[DevID] ASC,
[Time] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 96)
)
下面是创建新的年度分区的示例脚本。您可能需要为您的实际分区函数名称和新文件组名称调整脚本。此方法假设操作是在维护窗口中执行的,此时表中没有插入内容,并且查询不需要 2016 年及以后的数据。
脚本执行的步骤总结如下:
您应该注意现有表分区的几个问题。由于该
RANGE LEFT
函数,恰好是一年中第一天午夜的日期时间值将被放置在错误的分区中。例如,Time
值为“2012-01-01T00:00:00”的行将与 2011 年数据一起位于分区 1 中,而不是根据需要与 2012 年剩余数据一起位于分区 2 中。除非您按分区清除数据,否则这可能不是问题。请注意,如果
RANGE LEFT
函数永远无法删除,则最后一个分区。这意味着最后一个分区的文件组是使用该函数的分区方案的永久部分。在您的情况下,文件组Year6FileGroup
将始终是psYearlyPartition_Log
方案的最后一个文件组,尽管它也可以用于另一个分区,例如此处的 2016 年。脚本运行后的分区如下所示,预计最后一个分区将为空(假设您没有未来年份的数据)。您应该在年初之前创建明年的分区,以避免拆分非空分区或避免再次跳过这些箍。
我通常建议
RANGE RIGHT
在对像日期时间这样的增量值进行分区时使用函数,因为这种行为更直观。有关此问题和其他注意事项,请参阅表分区最佳实践。