2011-11-24 2 views
0

저는 Book이라는 정말 큰 테이블 (약 1300 만 행)이 있습니다. Book 테이블의 열에 기본 키를 설정하려고하지만 매우 큰 테이블이므로 업데이트하는 동안 서버가 중단됩니다. 그것은 메모리가 부족합니다. 그래서 저는 BookTemp 테이블을 만들었습니다.이 빈 테이블에 모든 기본 키를 설정하고 BookTemp 테이블에 데이터를 삽입하려고합니다. 그러나 나는 그것을 즉시하면 다시 메모리가 부족합니다. 그래서 나는 매번 10,000 행을 삽입하고 RAM을 지우려면 커서를 사용하려고 생각했지만 그 점에서 커서가 정말 새로 워서 도움이 필요합니다.커서를 사용하여 한 테이블에서 다른 테이블로 데이터 복사

나는 SQL 서버 2008 R2는

+1

서버가 다운 되니? 나는 정말로 그것을 상상할 수 없다. 어쩌면 반응이 없어지 겠지만, 가장 확실하게 추락하지는 않을 것입니다. 기본 키를 추가하기 전에 [데이터베이스 복구 모델] (http://msdn.microsoft.com/en-us/library/ms189275.aspx)을 "Simple"로 전환 해보십시오 (안전을 위해 전체 백업을 수행하십시오).). 이렇게하면 작업이 기록되지 않고 더 빨리 수행되어야합니다. 모든 트리거를 비활성화하는 것도 좋은 방법입니다. – Tomalak

답변

1

나는 당신의 임시 테이블을 반복하는 while 루프를 사용하는 것이 좋습니다 것입니다 사용합니다. 예제 here을 시작해야합니다.

아니면 그냥이를 수정할 수 :

DECLARE @counter AS INT = 0; 
DECLARE @batch_size AS INT = 10000; 
WHILE (@counter < (SELECT MAX(id) FROM temp_table)) 
BEGIN 
    INSERT INTO the_table 
    SELECT * FROM temp_table 
    WHERE id BETWEEN @counter AND (@counter + @batch_size - 1); 

    SET @counter = @counter + @batch_size; 
END 
0

캐시를 청소하여 SQL Server에 대한 메모리를 확보 할 세 가지 명령 다음 실행.

DBCC FREESYSTEMCACHE 
DBCC FREESESSIONCACHE 
DBCC FREEPROCCACHE 

그러나, 메모리가 위의 DBCC 명령을 실행하여 삭제 된 각 10000을 삽입 한 후, 그래서 타격 쿼리를 참조하십시오 작업을 예정에 사용할 수 있습니다.

DECLARE @counter INT = 1 
DECLARE cur_Data_Transfer CURSOR FOR -- Cursor declared 
SELECT column1, column2 -- select desired columns 
FROM Book 

OPEN cur_Data_Transfer --Opening Cursor 
FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2 --Put values to variable 

WHILE @@FETCH_STATUS = 0 -- Faching is success 
BEGIN 
     INSERT INTO BookTemp (column1, column2) -- Inserting to temptable 
      VALUES(@column1, @column2) 
     IF @counter = 10000 
     BEGIN  
     DBCC FREESYSTEMCACHE -- Clear System Cache 
     DBCC FREEPROCCACHE -- Clear Proc Cache 
     SET @counter = 0  -- Restarting counter 
     END 
     FETCH NEXT FROM cur_Data_Transfer INTO @column1, @column2 
     SET @counter = @counter + 1 
END 
CLOSE cur_Data_Transfer -- Closing cursor 
DEALLOCATE cur_Data_Transfer -- De-allocating 
관련 문제