2010-07-02 6 views
2

매일 데이터베이스에 백만 개의 행이 추가되는 데이터베이스가 있습니다. 매일 나는 백만 개의 가장 오래된 행을 꺼내 (데이터베이스에 약 1 천만을 남겨두고) 쿼리를 실행 한 다음이를 아카이브 데이터베이스로 옮기고 싶습니다.한 SQL Server 데이터베이스에서 다른 SQL Server 데이터베이스로 수백만 개의 행을 복사하는 가장 좋은 방법은 무엇입니까?

SQL Server (bcp, openrowset 등)에서이 작업을 수행하는 방법은 잘 설명되어 있지만, 모든 메소드에서 데이터 파일의 모든 행을 가져옵니다. 행의 하위 집합 만 복사하려는 경우 빠른 수행 방법을 찾을 수 없습니다.

+0

다른 서버 또는 동일한 서버에 있습니까? 또한 소스에서 데이터를 삭제 하시겠습니까? – Anon246

답변

2

SSIS 패키지를 고려하는 것이 좋습니다. 복사 할 행을 정확히 제어 할 수 있으며 선택한 트랜잭션 크기로 수행 할 수 있으며 빠른 대량 삽입을 수행합니다.

2

이 작업을 수행하는 가장 쉬운 방법은이 "기반 덩어리"를 수행하는 것이 더 많은 양의 데이터를 복사하기 위해 완전한 이름

INSERT INTO ArchiveDatabase..TableName 
SELECT * 
FROM ProductionDatabase..TableName 
WHERE EntryDate <= dateadd(mm, -6, current_timestamp) 

를 사용하는 쿼리입니다. 순수 TSQL에서이 작업을 수행하는 가장 쉬운 방법은 다음과 같이이다 :

DECLARE @rowcount int 
    SET @rowcount = 1 
    WHILE @rowcount <> 0 
    BEGIN 
     INSERT INTO ArchiveDatabase..TableName 
     SELECT TOP (100000) * 
     FROM ProductionDatabase..TableName 
     WHERE EntryDate <= dateadd(mm, -6, current_timestamp) 
     SET @rowcount = @@ROWCOUNT 
    END 

는 기본적으로 SELECT TOP() 절 100,000 행에 쿼리를 제한하고 더 이상 기록이 복사되지 않을 때까지 반복 유지한다. ( @@ROWCOUNT은 영향을받는 레코드 수를 반환합니다.)

데이터베이스가 다른 SQL Server에있는 경우 "링크 된 서버"를 설정하고 서버 참조를 개체 이름에 추가 할 수 있습니다. 정규화 된 객체 이름의 형식은 <Server>.<Database>.<Owner>.<Object>

관련 문제