自动维护分区表

其实自动维护分区表很简单主要工作几点:
1. 回收早期分区点,2008 R2默认分区数1000
2. 回收早期数据存储空间,删除老数据释放存储空间
3. 新增分区点,为未来数据提供存储区间
为了快速回收空间,我们需要使用到SWITCH PARTITION
P.S.需要特别注意的是SWITCH PARTITION的条件要求比较严格
1. 要求源表和目标表必须都存在
2. 要求源表和目标表在同一个文件组(个人推荐使用目标表所使用的分区架构)
3. 要求如果是不分区的目标表,则必须为空
4. 要求如果是分区的目标表,则必须是相同的分区字段(个人推荐使用目标表所使用的分区函数)
5. 要求目标表和源表结构一致(不只是字段类型、字段个数、字段顺序、索引,还要求包括ANSI_NULLS 和 QUOTED IDENTIFIER设置)
我们可以将SWITCH PARTITION理解为将源表中的一个分区的存储指针交给另一个表或另一个表的一个分区
 

   
   
   
   
  1. -- 清除目标表  
  2. DROP TABLE [dbo].[USER1_CALL_STAT_History]  
  3. GO  
  4.  
  5. -- 创建和源表相同的目标表  
  6. SET ANSI_NULLS ON 
  7. SET QUOTED_IDENTIFIER ON 
  8. SET ANSI_PADDING OFF 
  9. CREATE TABLE [dbo].[TableName_History](  
  10.   Column1 DataType1,  
  11.   Column2 DataType2  
  12. )  
  13. ON PS_TableName_PartitionColumn([PartitionColumn])  
  14. GO  
  15. SET ANSI_PADDING OFF 
  16. GO  
  17. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descritption' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TableName_History', @level2type=N'COLUMN',@level2name=N'Column1' 
  18. GO  
  19. EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descritption' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TableName_History', @level2type=N'COLUMN',@level2name=N'Column2' 
  20. GO  
  21.  
  22. CREATE NONCLUSTERED INDEX [IX_TableName_Column1] ON [dbo].TableName_History   
  23. (  
  24.     [Column1] DESC 
  25. )ON PS_TableName_PartitionColumn([PartitionColumn])  
  26. GO  
  27.  
  28. ALTER TABLE  TableName_History  
  29. REBUILD WITH (DATA_COMPRESSION = PAGE)  
  30. GO  
  31.  
  32. ALTER INDEX [IX_TableName_Column1] ON dbo.TableName_History  
  33. REBUILD WITH (DATA_COMPRESSION = PAGE)  
  34. GO  
  35.  
  36. --SWITCH_TABLE  
  37. ALTER TABLE dbo.TableName  
  38. SWITCH PARTITION $PARTITION.PF_TableName_PartitionColumn(CONVERT(VARCHAR(10), DATEADD(DD, -31, GETDATE()), 120))  
  39. TO DBO.TableName_History   
  40. PARTITION $PARTITION.PF_TableName_PartitionColumn(CONVERT(VARCHAR(10), DATEADD(DD, -31, GETDATE()), 120))  
  41. GO  
  42.  
  43. --MERGE_RANGE  
  44. ALTER PARTITION FUNCTION PF_TableName_PartitionColumn() MERGE RANGE (CONVERT(VARCHAR(10), DATEADD(DD, -31, GETDATE()), 120))