SQL Server 자동 순환 압축 파일 분할 데이터 스 크 립 트 상세 설명 실현

개술
많은 업무 장면 에서 우 리 는 기 록 량 이 비교적 많은 시 계 를 구분 해 야 한 다 는 것 을 잘 알 고 있 을 것 이다.또한 성능 을 확보 하기 위해 서 는 오래된 데 이 터 를 압축 해 야 한다.분 구 표 가 많은 상황 에서 매번 압축 파일 에 인공 적 으로 관여 해 야 한다 면 공 사 량 이 비교적 많 고 오류 가 발생 하기 쉽다.다음은 자신 이 작성 한 자동 압축 파일 파 티 션 데 이 터 를 공유 하 는 스 크 립 트 입 니 다.원 리 는 파 티 션 시트 와 압축 파일 시트 가 같은 파 티 션 방안 을 사용 하고 현재 파일 그룹 을 순환 적 으로 이용 하 는 것 입 니 다.더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 해 보 겠 습 니 다.
1.테스트 데이터 생 성

----01     
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      
USE [chenmh]
GO
CREATE PARTITION FUNCTION [Pt_Range](BIGINT) AS RANGE RIGHT FOR VALUES (1000000, 2000000, 3000000)
GO

----03      ,                     +1
CREATE PARTITION SCHEME Ps_Range
AS PARTITION Pt_Range
TO (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=1
WHILE @id<5001000
BEGIN
 INSERT INTO News VALUES(@id,@id%2)
 SET @id=@id+1

END

현재 총 4 개의 파 티 션 이 있 는 것 을 볼 수 있 습 니 다.각 파 티 션 이 정의 하 는 범위 구간 은 100 만 입 니 다.파 티 션 4 는 제 가 의도 적 으로 200 만 여 개의 데 이 터 를 더 삽입 하여 자동 압축 파일 파 티 션 을 검증 합 니 다.
2.자동 압축 파일 파 티 션 스 크 립 트

CREATE PROCEDURE Pro_Partition_AutoArchiveData
(@PartitionTable VARCHAR(300),
@SwitchTable VARCHAR(300)
)
AS
BEGIN
DECLARE @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_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

---         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)

 END


END
3.자동 압축 파일 분할 데이터
1.첫 테스트

EXEC Pro_Partition_AutoArchiveData 'news','NewsArchived';
메모:압축 파일 의 최소 파 티 션 데 이 터 를 호출 할 때마다.


파 티 션 표 의 뉴스 파 티 션 1 의 데 이 터 는 뉴스 아 카 이브 표 에 압축 되 었 고 파 티 션 5 를 만 들 었 으 며 파 티 션 5 는 압축 된 파 티 션 1 의 파일 그룹 을 사용 하여 파일 그룹 을 순환 적 으로 이용 하 는 효 과 를 거 두 었 다.
2.압축 파일 파 티 션 스 크 립 트 를 다시 호출 합 니 다.

파 티 션 시트 의 가장 큰 id 가 가장 큰 파 티 션 값 보다 작 을 때 자동 으로 파 티 션 스 크 립 트 를 압축 하면 적용 되 지 않 습 니 다.그래서 현재 테스트 표 데 이 터 는 파 티 션 3 의 데 이 터 를 다시 압축 할 수 있 습 니 다.
3.압축 파일 데 이 터 를 일정 시간 실행 하면 이러한 효과 가 있 을 수 있 습 니 다.

Group1→Group4→Group1→.......
4.스 크 립 트 주의사항
      1.@Partition Table 과@SwitchTable 표 는 같은 이름 의 파 티 션 방안 과 파 티 션 함 수 를 사용 해 야 합 니 다.그렇지 않 으 면@SwitchTable 은 파 티 션 방안 과 함 수 를 따로 수정 하고 표 구조 가 완전히 일치 해 야 합 니 다.
      2.압축 파일 의 표 분할 열 데이터 형식 은 INT 형식 이 어야 하고 값 은 자체 증가 규칙 입 니 다.
      3.파 티 션 압축 파일 작업 은 백업 작업 후 수행
      4.Right 파 티 션 을 사용 하 는 것 을 권장 합 니 다.Left 파 티 션 에 나타 나 는 마지막 파 티 션 파일 그룹 은 순환 되 지 않 고 파 티 션 의 마지막 에 있 습 니 다.예 를 들 어 Group 1,Group 2,Group 3,Group 1,Group 4 등 입 니 다.그룹 1,그룹 2,그룹 3,그룹 4,그룹 1,그룹 2,그룹 3,그룹 4,그룹 1 을 원 합 니 다.
      5.현재 나의 각 파 티 션 크기 는 100 만 과 파 티 션 함수 가 일치 하 는 것 을 주의 하 십시오.범위 값 이 다 르 면 마지막 코드 의'파 티 션 함수 수정'코드 를 수정 해 야 합 니 다.
총결산
현재 자동 압축 파일 파 티 션 스 크 립 트 를 복사 하려 면 모든 코드 를 완전히 이해 하고 자신의 업무 에 따라 적당 한 수정 을 해 야 합 니 다.데 이 터 는 값 이 없 기 때 문 입 니 다!!!마지막 으로 하나의 작업 만 만 들 고 정기 적 으로 작업 을 하면 되 며 중복 집행 에 도 영향 을 주지 않 습 니 다.
자,이상 이 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가치 가 있 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.
<!--.feedbackCon a {border-bottom: 1px dotted #333;}-->

좋은 웹페이지 즐겨찾기