亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQL Server > 正文

SQL Server實現自動循環歸檔分區數據腳本詳解

2024-08-31 01:05:07
字體:
來源:轉載
供稿:網友

概述

大家應該都知道在很多業務場景下我們需要對一些記錄量比較大的表進行分區,同時為了保證性能需要將一些舊的數據進行歸檔。在分區表很多的情況下如果每一次歸檔都需要人工干預的話工程量是比較大的而且也容易發生紕漏。接下來分享一個自己編寫的自動歸檔分區數據的腳本,原理是分區表和歸檔表使用相同的分區方案,循環利用當前的文件組,話不多說了,來一起看看詳細的介紹吧。

一、創建測試數據

sql;">----01創建文件組USE [master]GOALTER DATABASE [chenmh] ADD FILEGROUP [Group1]GOALTER DATABASE [chenmh] ADD FILEGROUP [Group2]GOALTER DATABASE [chenmh] ADD FILEGROUP [Group3]GOALTER DATABASE [chenmh] ADD FILEGROUP [Group4]GOUSE [master]GOALTER DATABASE [chenmh] ADD FILE ( NAME = N'datafile1', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/datafile1.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [Group1]GOALTER DATABASE [chenmh] ADD FILE ( NAME = N'datafile2', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/datafile2.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [Group2]GOALTER DATABASE [chenmh] ADD FILE ( NAME = N'datafile3', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/datafile3.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [Group3]GOALTER DATABASE [chenmh] ADD FILE ( NAME = N'datafile4', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL12.MSSQLSERVER/MSSQL/DATA/datafile4.ndf' , SIZE = 8192KB , FILEGROWTH = 65536KB ) TO FILEGROUP [Group4]GO----02創建分區函數USE [chenmh]GOCREATE PARTITION FUNCTION [Pt_Range](BIGINT) AS RANGE RIGHT FOR VALUES (1000000, 2000000, 3000000)GO----03創建分區方案,分區方案對應的文件組數是分區函數指定的數量+1CREATE PARTITION SCHEME Ps_RangeAS PARTITION Pt_RangeTO (Group1, Group2, Group3, Group4);---04創建表,指定的分區列的數據類型一定要和分區函數指定的列類型一致。CREATE TABLE [dbo].[News]( [id] [bigint] NOT NULL, [status] [int] NULL, CONSTRAINT [PK_News] 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 [Ps_Range](id)) ON [Ps_Range](id)-----創建歸檔分區表CREATE TABLE [dbo].[NewsArchived]( [id] [bigint] NOT NULL, [status] [int] NULL, CONSTRAINT [PK_NewsArchived] 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 [Ps_Range](id)) ON [Ps_Range](id)----插入測試數據DECLARE @id INT SET @id=1WHILE @id<5001000BEGIN INSERT INTO News VALUES(@id,@id%2) SET @id=@id+1END

sqlserver,分區,sql,server自動歸檔,server,歸檔

可以看到當前總共有4個分區,每一個分區定義的范圍區間是100萬,分區4我故意多插入了200多萬的數據來驗證自動歸檔分區。

二、自動歸檔分區腳本

CREATE PROCEDURE Pro_Partition_AutoArchiveData(@PartitionTable VARCHAR(300),@SwitchTable VARCHAR(300))ASBEGINDECLARE @FunName VARCHAR(100),@SchemaName VARCHAR(100),@MaxPartitionValue sql_variant---根據歸檔表查找對應的分區方案、分區函數、最小分區數、最大分區范圍值SELECT DISTINCT@FunName=MAX(pf.name),@SchemaName=MAX(ps.name), @MaxPartitionValue=max(isnull(prv.value,0))FROM sys.partitions p inner join sys.indexes i ON p.object_id=i.object_id and p.index_id=i.index_idinner join sys.partition_schemes ps ON i.data_space_id=ps.data_space_idinner join sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id and dds.destination_id=p.partition_numberinner join sys.data_spaces ds ON dds.data_space_id=ds.data_space_idinner join sys.partition_functions pf ON ps.function_id=pf.function_idLEFT join sys.partition_range_values prv ON pf.function_id=prv.function_id AND prv.boundary_id=p.partition_number-pf.boundary_value_on_rightLEFT join sys.partition_parameters pp ON prv.function_id=pp.function_id and prv.parameter_id=pp.parameter_idLEFT join sys.types t ON pp.system_type_id=t.system_type_id and pp.user_type_id=t.user_type_idWHERE OBJECT_NAME(p.OBJECT_ID)=@PartitionTableDECLARE @MaxId BIGINT,@MinId BIGINT,@Sql NVARCHAR(MAX),@GroupName VARCHAR(100),@MinPartitionNumber INTSET @Sql= N'SELECT @MaxId=MAX(id),@MinId=Min(id) FROM '+@PartitionTableEXEC sp_executesql @Sql,N'@MaxId BIGINT out,@MinId BIGINT out',@MaxId OUT,@MinId OUTSELECT @FunName AS FunName,@SchemaName AS SchemaName,@MaxPartitionValue AS MaxPartitionValue ,@MaxId AS MaxId,@MinId AS MinId---判斷當前表的最大的id是否已經在最大的分區中IF @MaxId>=@MaxPartitionValue BEGIN ----歸檔分區數據,根據表的最小值找到它所屬的分區. SET @Sql= N'SELECT @MinPartitionNumber=$PARTITION.'+@FunName+N'('+CONVERT(VARCHAR(30),@MinId)+N')'; EXEC sp_executesql @Sql,N'@MinPartitionNumber INT out',@MinPartitionNumber OUT SET @Sql=N'ALTER TABLE ' +@PartitionTable+ N' SWITCH PARTITION '+CONVERT(VARCHAR(10),@MinPartitionNumber)+ N' TO ' +@SwitchTable+ N' PARTITION ' +CONVERT(VARCHAR(10),@MinPartitionNumber); --PRINT @Sql EXEC (@Sql) ---修改分區方案,增加新的分區對應的文件組,根據最小的分區id找到對應的文件組。 SELECT  DISTINCT @GroupName=ds.name FROM sys.partitions p inner join sys.indexes i ON p.object_id=i.object_id and p.index_id=i.index_id inner join sys.partition_schemes ps ON i.data_space_id=ps.data_space_id inner join sys.destination_data_spaces dds ON ps.data_space_id=dds.partition_scheme_id and dds.destination_id=p.partition_number inner join sys.data_spaces ds ON dds.data_space_id=ds.data_space_id inner join sys.partition_functions pf ON ps.function_id=pf.function_id WHERE pf.name=@FunName AND ps.name=@SchemaName AND p.partition_number=@MinPartitionNumber SET @Sql=N'ALTER PARTITION SCHEME '+@SchemaName+N' NEXT USED '+@GroupName --PRINT @Sql EXEC (@Sql) ---修改分區函數,增加新的分區,增加新的分區范圍值,在現有的最大的值的基礎上加100萬(需要和現有的分區函數的范圍保持一致) SET @MaxPartitionValue=CONVERT(BIGINT,@MaxPartitionValue)+1000000 SET @Sql=N'ALTER PARTITION FUNCTION '+@FunName+N'('+N')'+N' SPLIT RANGE ('+CONVERT(VARCHAR(30),@MaxPartitionValue)+N')' --PRINT @Sql EXEC (@Sql) ENDEND

三、自動歸檔分區數據

1.首次測試

EXEC Pro_Partition_AutoArchiveData 'news','NewsArchived';

注意:每調用一次歸檔一個最小分區的數據。

sqlserver,分區,sql,server自動歸檔,server,歸檔

sqlserver,分區,sql,server自動歸檔,server,歸檔

分區表的News分區1的數據被歸檔到了NewsArchived表中,且創建了分區5,分區5使用的是已歸檔的分區1的文件組,達到了循環利用文件組的效果。

2.再調用一次歸檔分區腳本

sqlserver,分區,sql,server自動歸檔,server,歸檔

當分區表最大的id小于最大的分區值時自動歸檔分區腳本就不會生效。所以當前的測試表數據還可以再歸檔分區3的數據。

3.經過一段時間的運行歸檔數據可能是這樣的效果

sqlserver,分區,sql,server自動歸檔,server,歸檔

Group1→Group4→Group1→.......

四、腳本注意事項

      1.@PartitionTable和@SwitchTable表必須使用同名的分區方案和分區函數,否則@SwitchTable就需要單獨修改分區方案和函數,且表結構完全一致。

      2.歸檔的表分區列數據類型必須是INT類型,且值是自增規律.

      3.分區歸檔作業在備份作業后執行

      4.建議使用Right分區,Left分區會出現有的最后一個分區文件組不會循環替換,一直處于分區的最后,比如Group1,Group2,Group3,Group1,Group2,Group3,Group1,Group4。期望的應該是Group1,Group2,Group3,Group4,Group1,Group2,Group3,Group4,Group1

      5.注意我當前的每個分區大小是100萬和分區函數保持一致,如果范圍值不同,需要修改最末尾代碼的"修改分區函數"處代碼.

總結

當前自動歸檔分區腳本如果要拷貝去用還是得能完全理解每一段代碼,根據自己的業務做適當的修改,畢竟數據是無價的?。?!。最后只需要創建一個作業定期跑作業就行,重復執行也不影響。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到MSSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品狼人色视频一区| 亚洲欧美日韩在线高清直播| 国产亚洲综合久久| 亚洲精品不卡在线| 亚洲福利视频久久| 2019中文字幕在线| 揄拍成人国产精品视频| 久久精品福利视频| 国产欧美日韩亚洲精品| 亚洲国产小视频在线观看| 久久精品91久久久久久再现| 亚洲自拍高清视频网站| 日韩少妇与小伙激情| 亚洲а∨天堂久久精品喷水| 亚洲激情电影中文字幕| 欧美专区第一页| 久国内精品在线| 亚洲欧美激情精品一区二区| 亚洲免费视频观看| 欧洲日本亚洲国产区| 欧美国产日韩中文字幕在线| 91精品视频免费观看| 伊人av综合网| 成人精品久久av网站| 欧美激情一级欧美精品| xvideos亚洲人网站| 2019中文字幕在线| 精品自拍视频在线观看| 欧美一区二区三区四区在线| 亚洲老头老太hd| 欧洲精品毛片网站| 国产精品精品久久久| 亚洲欧洲国产伦综合| 久久久亚洲福利精品午夜| 日本91av在线播放| 午夜精品免费视频| 欧美三级欧美成人高清www| 久久久久久久久久国产| 久久久久国产精品免费| 久久久久久久国产精品| 国产亚洲一区二区精品| 国产又爽又黄的激情精品视频| 国产精品入口日韩视频大尺度| 中文字幕欧美视频在线| 国产成人在线精品| 精品福利在线视频| 91精品国产91久久| 国产精品亚洲欧美导航| 久久久久久久av| 国产精品高清在线观看| 国产精品视频男人的天堂| 国产精品免费在线免费| 亚洲欧美激情在线视频| 91精品啪aⅴ在线观看国产| 国产成人jvid在线播放| 国产亚洲欧洲高清一区| 日韩av中文字幕在线播放| 精品中文字幕视频| 色偷偷88888欧美精品久久久| 欧美专区日韩视频| 日韩欧美精品在线观看| 岛国精品视频在线播放| 成人国内精品久久久久一区| 亚洲人成绝费网站色www| 最近2019免费中文字幕视频三| 国产精品99久久久久久白浆小说| 日韩精品欧美激情| 欧美精品www在线观看| 亚洲美女性生活视频| 欧美日韩免费看| 国产精品www网站| 国产精品福利在线观看| 亚洲一区二区三区久久| 欧美黑人性视频| 亚洲成人黄色网址| 中文字幕亚洲专区| 国产精品久久久久久av下载红粉| 91免费看片网站| 国产精品免费一区| 奇米4444一区二区三区| 国产成人精品电影久久久| 日韩欧美亚洲成人| 欧美一级免费看| 亚洲丁香婷深爱综合| 日韩精品中文字幕视频在线| 亚洲欧美国产日韩天堂区| 欧美日韩国产91| 欧美视频在线看| 91精品国产91久久久久久最新| 在线色欧美三级视频| 国产精品观看在线亚洲人成网| 91精品国产综合久久久久久蜜臀| 日韩国产激情在线| 亚洲最大成人网色| 中文字幕综合在线| 久久视频在线播放| 久久男人av资源网站| 成人两性免费视频| 久久久91精品国产一区不卡| 日韩亚洲欧美中文高清在线| 精品久久久av| 久久久人成影片一区二区三区| 国产精品久久久久久av福利| 国产综合久久久久久| 欧美精品在线极品| 亚洲人午夜精品免费| 欧美主播福利视频| 91精品国产91久久久久久吃药| 亚洲成人av在线| 91久久久久久久一区二区| 亚洲成人国产精品| 亚洲欧美国产另类| 国产成人精品视频在线| 亚洲片在线资源| 国产一级揄自揄精品视频| 51久久精品夜色国产麻豆| 亚洲美女av在线播放| yellow中文字幕久久| 久久成人精品电影| 欧美有码在线观看视频| 欧洲精品在线视频| 欧美国产日韩视频| 亚洲a一级视频| 国产一级揄自揄精品视频| 国产成+人+综合+亚洲欧美丁香花| 亚洲精品中文字| 欧美日本亚洲视频| 成人久久久久久| 国产不卡在线观看| 成人性生交大片免费看小说| 久久久久国产精品免费| 奇米一区二区三区四区久久| 国产精品成人品| 欧美激情小视频| 欧美性69xxxx肥| 精品国内产的精品视频在线观看| 亚洲最大福利网站| 这里只有精品视频在线| 欧美福利视频在线观看| 91天堂在线视频| 福利微拍一区二区| 久久亚洲精品视频| 成人写真福利网| 尤物99国产成人精品视频| 91久久夜色精品国产网站| 91精品91久久久久久| 国产精品福利观看| 国产精品免费久久久久影院| 国产999精品久久久影片官网| 国产成人精品久久二区二区91| 国产精品久久久久久一区二区| 亚洲第一二三四五区| 亚洲精品自在久久| 亚洲免费高清视频| 日韩麻豆第一页| 亚洲欧美制服另类日韩| 国产精品丝袜视频| 亚洲第一精品夜夜躁人人爽| 欧美在线视频免费观看| 亚洲аv电影天堂网| 国产97在线|日韩| 91美女片黄在线观看游戏| 久久夜精品香蕉| 国产精品91久久久久久|