设为首页 收藏本站
查看: 713|回复: 0

[经验分享] SQL SERVER 分区表的总结--分区表的维护和管理

[复制链接]

尚未签到

发表于 2015-6-28 18:05:06 | 显示全部楼层 |阅读模式
SQL SERVER 分区表的总结--分区表的维护和管理

  在依据需求建立好分区表之后,就要实现对分区表的管理维护。主要内容就是两点:
  1.  利用滑动窗口方案(Sliding Window Scenario),实现分区表与数据移动中间表的互切。
  2.  分区表本身的结构变更管理。
  当然以上两点,都是理论上的点。我工作中主要是遇到两种需求:
  1.  过时分区数据的快速归档管理:即把某些不活跃分区的数据切到数据归档的表中去。
  2.  分区表由于数据增长需要添加新分区来处理数据:即已分区的表它所有的数据都会处于活动状态,需要新的分区来承载新增的数据。
  这两种需求将会在下面的代码体现出来。分区表沿用我上一篇中的表Product,但是这里称为Products。因为上一篇中的表,测试系统在用,我不能移动数据,就只好克隆出一张表。
  创建一张表结构主键聚集索引跟Products一模一样的表Products_Tmp(用来做数据移转的中间临时表);这张表还必须跟要移出的分区位于同一个文件组(否则将不能应用Partition Switch进行快速切换)。
  首先在新文件组上创建存档表Products_Archive,用于存档后面中间临时表的数据。



USE [master]
GO
ALTER DATABASE [TEST]
ADD FILEGROUP [FG_TEST_Products_Archive]
GO
ALTER DATABASE [TEST]
ADD FILE ( NAME = N'FG_TEST_Products_Archive_data_1',
          FILENAME = N'D:\Data\FG_TEST_Products_Archive_data_1.ndf' ,
          SIZE = 50MB ,
          FILEGROWTH = 10% )
TO FILEGROUP [FG_TEST_Products_Archive]
GO

USE TEST
GO
CREATE TABLE [dbo].[Products_Archive](
    [ID] [int] NOT NULL,
    [PName] [nvarchar](100) NULL,
    [AddDate] [datetime2](3) NULL
)ON [FG_TEST_Products_Archive];
GO
  
  接下来,就是移转数据的操作了。封装成存储过程,方便调用。本来是想把导数据也写在里面,可是考虑到生产环境数据量较大,会采用其它的导数据方案,就舍弃了。



CREATE PROCEDURE usp_TransferPartitionData_ForArchive
  @PartitonNumber INT --要移转分区编号

AS
DECLARE @filegroup NVARCHAR(100)=N'',   --要移转分区所在文件组

        @SQL NVARCHAR(4000)=N'',        --创建中间临时表的动态语句

        @rangeValue INT;                --要移转分区边界值上限


SET @rangeValue=(SELECT CAST(VALUE AS INT) FROM sys.partition_range_values WHERE boundary_id=@rangeValue);
--这里的赋值,使用我上篇中的自定义函数fn_GetFileForPartition.

SET @filegroup=(SELECT [FILEGROUP_NAME] FROM dbo.fn_GetFileForPartition(N'Sch_Product_ID',@rangeValue));
SET @SQL=N'CREATE TABLE [dbo].[Products_Tmp](
            [ID] [int] NOT NULL,
            [PName] [nvarchar](100) NULL,
            [AddDate] [datetime2](3) NULL,
          CONSTRAINT [PK_Products_Tmp] PRIMARY KEY CLUSTERED
         (
            [ID] ASC
         )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON)
         )ON '+QUOTENAME(@filegroup);
        
IF OBJECT_ID('dbo.Products_Tmp') IS NOT NULL
  RAISERROR('已经存在数据库对象Products_Tmp!',16,1);
ELSE
BEGIN
    --PRINT @SQL;

  EXEC(@SQL);
  --把指定分区中的数据切到Products_Tmp

  ALTER TABLE dbo.Products
   SWITCH PARTITION @PartitonNumber
   TO dbo.Products_Tmp;
END
--因为数据量少又是堆表,直接使用INSERT INTO导入数据。

--如果是大数据量的话可能就会使用BULK+BCP或者SSIS来做。

--INSERT INTO [dbo].[Products_Archive]

--([ID],[PName],[AddDate])

-- SELECT [ID],[PName],[AddDate] FROM [dbo].[Products_Tmp];


--DROP TABLE [dbo].[Products_Tmp

GO

--移转数据,并删除Products_Tmp。

EXEC usp_TransferPartitionData_ForArchive 1;--指定移转第一个分区

--因为数据量少又是堆表,直接使用INSERT INTO导入数据。

--如果是大数据量的话可能就会使用BULK+BCP或者SSIS来做。

INSERT INTO [dbo].[Products_Archive]
([ID],[PName],[AddDate])
SELECT [ID],[PName],[AddDate] FROM [dbo].[Products_Tmp];
DROP TABLE [dbo].[Products_Tmp];
  
  现在旧数据移出去了,但是每天还有新数据进来,最后一个分区越来越大,所以我们要加入新文件组来承接这个分区。但是这里,就不新建文件组,而是使用在上面移转数据时”空”出来的PRIMARY文件组。
  首先分区既然空了,就要从分区表中移除它。然后再将其做为新文件组加进分区表。其实下面的代码也可以整合到上面的SP里去的。



DECLARE @rangeValue INT, --要删除分区边界值的上限

        @splitValue INT,--要分割给新分区用的边界值下限

        @filegroup NVARCHAR(100)=N'',   --要合并的分区所属的文件组

        @SQL NVARCHAR(4000);--动态语句


--合并空分区,也就是删除分区。   

SET @rangeValue=80000;
ALTER PARTITION FUNCTION fn_Partition_Product_ID()
MERGE RANGE (@rangeValue);

--修改架构,添加文件组

SET @filegroup=(SELECT [FILEGROUP_NAME] FROM dbo.fn_GetFileForPartition(N'Sch_Product_ID',80000));
SET @SQL=N'ALTER PARTITION SCHEME Sch_Product_ID
             NEXT USED '+QUOTENAME(@filegroup)+N';';
--PRINT @SQL;

EXEC(@SQL);

--增加新分区,来接受新数据

SET @splitValue=380000;
ALTER PARTITION FUNCTION fn_Partition_Product_ID()
  SPLIT RANGE (@splitValue);
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81294-1-1.html 上篇帖子: 在连接到SQL Server2005时,在默认的设置下SQL Server不允许进行远程连接可能会导致此失败--的解决 下篇帖子: SQL Sever 各版本下载 SQL Server 2012下载SQL Server 2008下载SQL Server 2005 下载SQL Server 2
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表