2012-02-08 5 views
2

매 시간마다 삽입/업데이트해야하는 비정규 화 테이블을 만들었습니다. 이 프로세스는 데이터 관점에서 오히려 관련되어 있으므로 사용자를 방해하지 않고 테이블을 업데이트하는 권장 방법을 찾고 있습니다.한 테이블에서 다른 테이블로 테이블 행을 가장 효율적으로 이동하는 방법

내 프로세스가 삽입/업데이트 한 번 완료되면 별도의 테이블을 가지고 생각 중이므로 변경 사항을 실제 프로덕션 테이블로 푸시해야합니다.

도움이 될 것입니다.

+0

SQL Server의 버전/버전은 무엇입니까? –

+0

SQL Server 2008 – Marco

+0

2008 또는 2008 R2? 어느 판? 표준, 데이터 센터, 웹, 개발자 등을 의미하는 –

답변

4

또 다른 해결책은 여러 스키마를 사용하여 스위치-A-루를 재생하는 것입니다. 필자는 작업에서이 트릭을 사용했기 때문에이 방법을 선호하기 때문에 개체 이름 바꾸기에 대한 경고 메시지는 내 기록 로그를 채우는 것입니다. 기본적으로 두 개의 추가 스키마가 필요합니다 (테이블 사본을 임시로 보관하는 사본과 캐시 사본을 보유하는 사본).

CREATE SCHEMA cache AUTHORIZATION dbo; 
CREATE SCHEMA hold AUTHORIZATION dbo; 

지금은 캐시 스키마에있는 테이블의 모방을 만듭니다

SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0; 
-- then create any indexes etc. 

을 지금은 데이터 새로 고침 시간을 때 : 이론적으로

-- step 1: 
TRUNCATE TABLE cache.table; 
-- (if you need to maintain FKs you may need to delete) 
INSERT INTO cache.table SELECT ... 

-- step 2: 
-- this transaction will be almost instantaneous, 
-- since it is a metadata operation only: 

BEGIN TRANSACTION; 
    ALTER SCHEMA hold TRANSFER dbo.table; 
    ALTER SCHEMA dbo TRANSFER cache.table; 
    ALTER SCHEMA cache TRANSFER hold.table; 
COMMIT TRANSACTION; 

를 이동할 수있는 이 두 번째 전송 후에 dbo.table의 새 복사본을 쿼리 할 수 ​​있기 때문에 트랜잭션이 마지막으로 전송되지만, 내가 말했듯이 이것은 almos입니다. 동시성에 차이가 있다면 즉시 놀라워 질 것입니다.

여기서도 cache.table을 다시 잘라낼 수도 있지만 항상 데이터가 채워져 데이터 변경 사항을 비교하거나 문제가있는 경우 문제를 해결할 수 있습니다. 1 단계에서 소요되는 시간에 따라 처음부터 다시 채우기보다 역방향으로 전송을 수행하는 것이 더 빠릅니다.

이름 바꾸기와 마찬가지로 실제 테이블로 이동하면 통계가 손실되는 등이 프로세스에서 이상한 것을 얻을 수 있습니다. 이름을 고수하지 않습니다. 이름 바꾸기와 마찬가지로 테스트 해보고 싶을 것입니다. 보고 테이블에 액세스하기위한 RCSI.

2

한 가지 해결책은 언급 한 임시 테이블을 사용하여 수행 한 다음 프로덕션 테이블 이름으로 이름을 변경하는 것입니다 (하지만 먼저 프로덕션 테이블을 다른 것으로 이름을 바꿉니다). 그 후, 이전 생산 테이블을 삭제할 수 있습니다. 물론, 트랜잭션 내에서 모든 작업을 수행해야합니다.

그래서, 그것은 다음과 같습니다

-- Fill tmpTable 
-- 

-- Do renaming 
begin tran t1; 
execute sp_rename 'productionTable', 'productionTableBackup'; 
execute sp_rename 'tmpTable', 'productionTable'; 
commit tran t1;