人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

SQL Server實現(xiàn)自動循環(huán)歸檔分區(qū)數(shù)據(jù)腳本詳解

發(fā)布日期:2021-12-13 03:06 | 文章來源:腳本之家

概述

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

一、創(chuàng)建測試數(shù)據(jù)

----01創(chuàng)建文件組
USE [master]
GO
ALTER DATABASE [chenmh] ADD FILEGROUP [Group1]
GO
ALTER DATABASE [chenmh] ADD FILEGROUP [Group2]
GO
ALTER DATABASE [chenmh] ADD FILEGROUP [Group3]
GO
ALTER DATABASE [chenmh] ADD FILEGROUP [Group4]
GO
USE [master]
GO
ALTER 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]
GO
ALTER 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]
GO
ALTER 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]
GO
ALTER 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創(chuàng)建分區(qū)函數(shù)
USE [chenmh]
GO
CREATE PARTITION FUNCTION [Pt_Range](BIGINT) AS RANGE RIGHT FOR VALUES (1000000, 2000000, 3000000)
GO
----03創(chuàng)建分區(qū)方案,分區(qū)方案對應(yīng)的文件組數(shù)是分區(qū)函數(shù)指定的數(shù)量+1
CREATE PARTITION SCHEME Ps_Range
AS PARTITION Pt_Range
TO (Group1, Group2, Group3, Group4);

---04創(chuàng)建表,指定的分區(qū)列的數(shù)據(jù)類型一定要和分區(qū)函數(shù)指定的列類型一致。
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)
-----創(chuàng)建歸檔分區(qū)表
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)
----插入測試數(shù)據(jù)
DECLARE @id INT 
SET @id=1
WHILE @id<5001000
BEGIN
 INSERT INTO News VALUES(@id,@id%2)
 SET @id=@id+1
END

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

二、自動歸檔分區(qū)腳本

CREATE PROCEDURE Pro_Partition_AutoArchiveData
(@PartitionTable VARCHAR(300),
@SwitchTable VARCHAR(300)
)
AS
BEGIN
DECLARE @FunName VARCHAR(100),@SchemaName VARCHAR(100),@MaxPartitionValue sql_variant
---根據(jù)歸檔表查找對應(yīng)的分區(qū)方案、分區(qū)函數(shù)、最小分區(qū)數(shù)、最大分區(qū)范圍值
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_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
LEFT join sys.partition_range_values prv ON pf.function_id=prv.function_id AND prv.boundary_id=p.partition_number-pf.boundary_value_on_right
LEFT join sys.partition_parameters pp ON prv.function_id=pp.function_id and prv.parameter_id=pp.parameter_id
LEFT join sys.types t ON pp.system_type_id=t.system_type_id and pp.user_type_id=t.user_type_id
WHERE OBJECT_NAME(p.OBJECT_ID)=@PartitionTable

DECLARE @MaxId BIGINT,@MinId BIGINT,@Sql NVARCHAR(MAX),@GroupName VARCHAR(100),@MinPartitionNumber INT
SET @Sql= N'SELECT @MaxId=MAX(id),@MinId=Min(id) FROM '+@PartitionTable
EXEC sp_executesql @Sql,N'@MaxId BIGINT out,@MinId BIGINT out',@MaxId OUT,@MinId OUT
SELECT @FunName AS FunName,@SchemaName AS SchemaName,@MaxPartitionValue AS MaxPartitionValue ,@MaxId AS MaxId,@MinId AS MinId
---判斷當(dāng)前表的最大的id是否已經(jīng)在最大的分區(qū)中
IF @MaxId>=@MaxPartitionValue
 BEGIN
 ----歸檔分區(qū)數(shù)據(jù),根據(jù)表的最小值找到它所屬的分區(qū).
 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)
 ---修改分區(qū)方案,增加新的分區(qū)對應(yīng)的文件組,根據(jù)最小的分區(qū)id找到對應(yīng)的文件組。
 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)
 ---修改分區(qū)函數(shù),增加新的分區(qū),增加新的分區(qū)范圍值,在現(xiàn)有的最大的值的基礎(chǔ)上加100萬(需要和現(xiàn)有的分區(qū)函數(shù)的范圍保持一致)
 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)
 END

END

三、自動歸檔分區(qū)數(shù)據(jù)

1.首次測試

EXEC Pro_Partition_AutoArchiveData 'news','NewsArchived';

注意:每調(diào)用一次歸檔一個最小分區(qū)的數(shù)據(jù)。

分區(qū)表的News分區(qū)1的數(shù)據(jù)被歸檔到了NewsArchived表中,且創(chuàng)建了分區(qū)5,分區(qū)5使用的是已歸檔的分區(qū)1的文件組,達(dá)到了循環(huán)利用文件組的效果。

2.再調(diào)用一次歸檔分區(qū)腳本

當(dāng)分區(qū)表最大的id小于最大的分區(qū)值時自動歸檔分區(qū)腳本就不會生效。所以當(dāng)前的測試表數(shù)據(jù)還可以再歸檔分區(qū)3的數(shù)據(jù)。

3.經(jīng)過一段時間的運行歸檔數(shù)據(jù)可能是這樣的效果

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

四、腳本注意事項

1.@PartitionTable和@SwitchTable表必須使用同名的分區(qū)方案和分區(qū)函數(shù),否則@SwitchTable就需要單獨修改分區(qū)方案和函數(shù),且表結(jié)構(gòu)完全一致。

2.歸檔的表分區(qū)列數(shù)據(jù)類型必須是INT類型,且值是自增規(guī)律.

3.分區(qū)歸檔作業(yè)在備份作業(yè)后執(zhí)行

4.建議使用Right分區(qū),Left分區(qū)會出現(xiàn)有的最后一個分區(qū)文件組不會循環(huán)替換,一直處于分區(qū)的最后,比如Group1,Group2,Group3,Group1,Group2,Group3,Group1,Group4。期望的應(yīng)該是Group1,Group2,Group3,Group4,Group1,Group2,Group3,Group4,Group1

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

總結(jié)

當(dāng)前自動歸檔分區(qū)腳本如果要拷貝去用還是得能完全理解每一段代碼,根據(jù)自己的業(yè)務(wù)做適當(dāng)?shù)男薷模吘箶?shù)據(jù)是無價的?。?!。最后只需要創(chuàng)建一個作業(yè)定期跑作業(yè)就行,重復(fù)執(zhí)行也不影響。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對本站的支持。

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部