3

나는 자동 아카이브를 매일하고 싶은 테이블을 가지고있다. 그래서 매일 매일 내가 생성 한 정보를 다른 아카이브 테이블이 아닌 다른 파티션 (같은 테이블에 있음)으로 옮기고 싶습니다. 이전 데이터를 새로운 쿼리와 동일한 쿼리로 액세스 할 수 있기를 원하기 때문입니다.SQL Server에서 자동 데이터 보관을 수행하는 방법은 무엇입니까?

SQL Server 2005를 사용하고 있는데 http://msdn.microsoft.com/en-us/library/ms345146(SQL.90).aspx 문서를 읽었지만 내 요구 사항을 만족시키기 위해 어떻게 분할 함수를 작성해야하는지 알 수 없습니다.

따라서 해결책이 더 이상 간섭 할 필요가없는 한 시간 구성이어야합니다. 의견 있으십니까?

+0

당신은 아마 serverfault.com에서 더 많은 답변을 얻을 것이다 - 시스템 관리자 및 데이터베이스 관리자가 놀고 곳 .... –

+0

또는 dba.stackexchange.com – idstam

답변

3

쉽게 파티셔닝 된 테이블을 사용하여이 작업을 수행 할 수 있습니다. 아래 예제 스크립트 - 임시 db TestDB를 생성합니다. 당신이 그것을 사용하고 싶지 않다면 데이터베이스를 다른 것으로 바꾸십시오. 그것은 결국 자체를 청소합니다 스크립트를 그대로 실행하는 경우 데이터베이스를 만듭니다. 은 비트를 기반으로 분할 기능을 추가합니다. 테이블 TestTable을 만듭니다. 파티션 기능과 함께 적용 Inerts 테이블에 3 개의 "라이브"행 sys.partitions에서 세부 정보를 선택하여 3 개의 행이 모두 하나의 테이블에 있음을 표시합니다. THEN이 레코드를 업데이트하여 아카이브하도록합니다. 정보를 다시 선택합니다. sys.partitions은 레코드가 두 번째 스키마로 이동되었음을 나타냅니다.

레코드를 보관 처리하는 과정을 설정하기 만하면됩니다.

USE master; 
GO 
--- Step 1 : Create New Test Database with two different filegroups. 
IF EXISTS (
SELECT name 
FROM sys.databases 
WHERE name = N'TestDB') 
DROP DATABASE TestDB; 
GO 
CREATE DATABASE TestDB 
ON PRIMARY 
(NAME='TestDB_Part1', 
FILENAME= 
'c:\sqldata\TestDB_Part1.mdf', 
SIZE=3, 
MAXSIZE=100, 
FILEGROWTH=1), 
FILEGROUP TestDB_Part2 
(NAME = 'TestDB_Part2', 
FILENAME = 
'c:\sqldata\TestDB_Part2.ndf', 
SIZE =3, 
MAXSIZE=100, 
FILEGROWTH=1); 
GO 



USE TestDB; 
GO 
--- Step 2 : Create Partition Range Function 
CREATE PARTITION FUNCTION TestDB_PartitionRange (Bit) 
AS RANGE right FOR 
VALUES (1); 
GO 

CREATE PARTITION SCHEME TestDB_PartitionScheme 
AS PARTITION TestDB_PartitionRange 
TO ([PRIMARY], TestDB_Part2); 
GO 


CREATE TABLE TestTable 
(Archived Bit NOT NULL, 
Date DATETIME) 
ON TestDB_PartitionScheme (Archived); 
GO 


INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-01-01'); 
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-02-01'); 
INSERT INTO TestTable (Archived, Date) 
VALUES (0,'2010-03-01'); 
GO 

SELECT * FROM TestTable; 


SELECT * FROM sys.partitions 
WHERE OBJECT_NAME(OBJECT_ID)='TestTable'; 

update TestTable 
set Archived = 1 where Date = '2010-03-01' 

SELECT * FROM sys.partitions 
WHERE OBJECT_NAME(OBJECT_ID)='TestTable'; 


use master 
go 
drop database testdb 
+0

이 있지만 같은 그래, 내가 구현 한 솔루션 매일의 작업을 실행하여 오래된 행을 파티션 분할 테이블로 변경하고 싶지는 않습니다. SQL Server가 자동으로 새 파티션을 만들거나 다른 것을 사용하여 하나의 구성을 갖고 싶습니다. 가능한가? – giolekva

+0

IM은 직원을 어떻게 보관하고 있는지 잘 모릅니다. 위의 예제는 플래그를 아카이브로 설정할 때마다 파티션을 이동시킵니다. 아카이브 된 데이터에 대해 일정한 간격의 파티션을 원한다면 (나는 40k를 가질 수 있다고 생각합니다); 파티션 기능을 사전에 일년에 미리 작성해야하며 (그리고 수년 내에 업데이트하여) 날짜별로 분할되도록해야합니다. 1000 초의 분할로 인해 단편화 문제가 발생할 수 있지만 색인 정책을 수행 한 후에는 색인 정책을 검토해야합니다. – u07ch