2014-11-07 2 views
0

우리는 한 번에 여러 테이블에 수천 개의 행을로드하는 SQL Server 2008R2-SP1에서 가져 오기 저장 프로 시저를 실행하고 있습니다. tempDBtransaction log 크기에 문제가 있습니다. 이 같은sql server free tempdb

뭔가 :

CREATE PROCEDURE spReallyHugeImportDataProcedure 
    @id int 
AS 
BEGIN 
    CREATE TABLE #temp(...) 

    INSERT INTO #temp 
    SELECT * 
    FROM AlotOfJoins 

    INSERT INTO FinalTable 
    SELECT * FROM AlotOfJoins 

    DROP #tempTable 

    INSERT INTO #temp 
    SELECT * 
    FROM AlotOfJoins 

    INSERT INTO FinalTable 
    SELECT * FROM AlotOfJoins 

    DROP #tempTable 

    INSERT INTO #temp 
    SELECT * 
    FROM AlotOfJoins 

    INSERT INTO FinalTable 
    SELECT * FROM AlotOfJoins 

    DROP #tempTable 

    -- And so on.... 

END 

우리는 작은 데이터 세트에 대해 여러 번 전체 프로세스를 분할하고 실행하려고합니다. 이처럼

:

CREATE PROCEDURE spReallyHugeImportDataProcedure 
    @id int 
AS 
BEGIN 

    DECLARE @SomeSortOfCounter int = 100 
    WHILE(@SomeSortOfCounter <> 0) 
    BEGIN 
     -- TRY TO START A NEW TRANSACTION 
     BEGIN TRAN 

     CREATE TABLE #temp(...) 

     INSERT INTO #temp 
     SELECT * 
     FROM AlotOfJoins 
     WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter 

     INSERT INTO FinalTable 
     SELECT * FROM AlotOfJoins 

     DROP #tempTable 

     INSERT INTO #temp 
     SELECT * 
     FROM AlotOfJoins 
     WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter 

     INSERT INTO FinalTable 
     SELECT * FROM AlotOfJoins 

     DROP #tempTable 

     INSERT INTO #temp 
     SELECT * 
     FROM AlotOfJoins 
     WHERE SomeFileterWorkinWithTheCounter = @SomeSortOfCounter 

     INSERT INTO FinalTable 
     SELECT * FROM AlotOfJoins 

     DROP #tempTable 

     -- And so on.... 

     -- TRY TO RELASE TEMP OBJECTS, 
     -- OR GIVE TO THE SERVER THE OPORTUNITY TO DO IT 
     COMMIT 

     SET @SomeSortOfCounter = @SomeSortOfCounter - 1 
    END 
END 

는 SQL Server 엔진이 그 내부 거래 사이에 작업 할 수 있습니까?

+0

임시 테이블을 사용하는 이유는 왜 직접 메인 테이블에 삽입 할 수 없는지입니다. 삽입 할 열을 알고 있기 때문에 문제가되지 않아야합니다. –

+0

감사합니다 @Pradeep, 우리는 그 부분을 찾고 있습니다 만, 지금 당장 필요한 부분을 말하게하십시오. 우리가 직면하고있는 문제는 tempDB의 공간 부족 때문에 SQLServer 작업 시간을 줄이는 방법을 찾고 있습니다. – GBrian

+0

temp db가 켜져 있고 가득 차있는 디스크의 크기는 얼마입니까? 임시 DB가 전용 드라이브에 있습니까? 서버 또는 로컬 컴퓨터에 있습니까? RDP/Management Studio를 통해 수행되는 서버이거나 로컬 컴퓨터에서 원격으로 실행되는 서버입니까? – Tanner

답변

1

옵션 1 : 사용자 데이터베이스에서 테이블을 사용

당신이 정말로, 임시 테이블에 데이터를 저장 (DB 예를 들어, 또는 목적지에 ImportTemp)를 사용자 데이터베이스에서 해당 테이블을 구축해야하는 경우 tempdb 대신 사용하십시오. 이 경우 SQL Server는 TempDB에서 많은 공간을 사용하지 않아야하며 데이터는 영구적으로 저장됩니다.> 재사용 할 수 있고 로더 쿼리를 여러 배치로 나눌 수 있습니다.

선택적으로이 테이블을 다른 파일 그룹으로 이동하여 동시 쓰기를 방지하고 다른 프로세스와의 간섭 가능성을 낮출 수 있습니다. 이 경우

, 단계는 다음과 같습니다

  1. 를 드롭 '온도'는
  2. 가 (사용자 데이터베이스)
  3. 채우기를 '임시'테이블 만들기 존재 경우 테이블 필요한 데이터가있는 'temp'테이블
  4. 지속되는 'temp'테이블에서 대상 테이블로드
  5. 'temp'테이블 삭제 당신은 단지 전과 후를자를 수,
  6. 가 선택적으로 데이터를 축소하고 상대적으로 자주 임포트 테이블을 사용하는 경우 '임시'테이블

관련 로그 파일을 데이터 파일에 공간을 확보하기 위해 그것을 삭제하고 재 작성하는 대신에 사용하십시오.

옵션 2 :

가 배치/버퍼의 데이터를 처리 할 수있는 ETL 도구를 사용 ETL 도구를 사용하여. SQL Server Standard 이상을 사용하는 경우 SSIS (SQL Server Integration Services) 옵션을 사용할 수 있습니다.

DBCC SHRINKFILE

당신은 데이터에서 사용하지 않는 공간을 해제하고 DBCC SHRINKFILE 명령을 사용하여 파일을 기록 할 수 있습니다 :

USE [YourDatabase] 

DBCC SHRINKFILE 
(
    { file_name | file_id } 
    { [ , EMPTYFILE ] 
    | [ [ , target_size ] [ , { NOTRUNCATE | TRUNCATEONLY } ] ] 
    } 
) 
[ WITH NO_INFOMSGS ] 

예 선택적으로

USE [tempdb] 
DBCC SHRINKFILE (tempdb_data, TRUNCATEONLY) 

당신은 임시 데이터베이스에 추가 데이터 파일을 추가하여 드라이브 전체의 임시 데이터베이스 파일을 확산 할 수

ALTER DATABASE tempdb 
    ADD FILE (NAME = tempdev2, FILENAME = 'W:\tempdb2.mdf', SIZE = 256); 

이와 관련된 질문 : How to spread tempdb over multiple files?

0

간단한 대답은 한 어떠한 외부 트랜잭션이 밖에 없기 때문에, '예' 저장된 proc. 또한 명시 적 트랜잭션을 추가 할 이유가 없습니다. 단순히 루프를 만들고 명령문 당 레코드 덩어리로 작업하면 tlog 공간을 다시 사용할 수있게되고 모든 레코드를 한 번에 임시 테이블로 강제 저장하지 않게됩니다.

+0

안녕하세요, 현재'BEGIN TRAN'을 암시하지 않으므로'AUTOCOMMIT'을 실행 중입니다. 저장 프로 시저에 코드를 추출하고 while 루프에서 호출하면 충분할까요? – GBrian

관련 문제