2017-05-02 1 views
0

수백만 개의 큰 테이블을 비교하여 차이점을 로그 테이블에 삽입해야합니다.큰 일괄 처리로 실행합니다.

문제는 저장 프로 시저가 커지고 (LDF) 데이터베이스 디스크 공간이 제한된다는 것입니다.

나는 커밋은 LDF를 MDF에 쓰는 것을 알고있다.

다음 비교를 일괄 적으로 수행하고 수십만 줄을 커밋 할 수 있습니까?

BEGIN TRY 
BEGIN TRANSACTION; 


      INSERT INTO dbo.CustomerLog 
        (OnlineStore , 
         PhoneNumber , 
         ChangeType 
        ) 
        SELECT 'Online Store a' , 
          AreaCode + PhoneNumber , 
          'Added' 
        FROM dbo.StoreAList a 
        WHERE NOT EXISTS (SELECT 1 
             FROM dbo.StoreAListCompare b 
             WHERE (b.AreaCode + b.PhoneNumber) = (a.AreaCode 
                   + a.PhoneNumber)); 

COMMIT TRANSACTION       
END TRY 
BEGIN CATCH 
    ROLLBACK TRANSACTION  
END CATCH; 




CREATE TABLE [dbo].[StoreAList](
    [ListID] [bigint] IDENTITY(1,1) NOT NULL, 
    [AreaCode] [char](3) NOT NULL, 
    [PhoneNumber] [char](7) NOT NULL, 
    [RecordDate] [datetime] NULL CONSTRAINT [DF_StoreAList_RecordDate] DEFAULT (getdate()) 
) ON [PRIMARY] 


CREATE TABLE [dnc].[StoreAListCompare](
    [ListID] [BIGINT] IDENTITY(1,1) NOT NULL, 
    [AreaCode] [CHAR](3) NOT NULL, 
    [PhoneNumber] [CHAR](7) NOT NULL, 
    [RecordDate] [DATETIME] NULL DEFAULT (GETDATE()) 
) ON [PRIMARY] 
+0

다음과 같이 : _single_ 인덱스 p로 StoreAList 및 StoreAListCompare를 인덱싱하면 성능 변화가 궁금합니다. er 테이블에'AreaCode'와'PhoneNumber'를 포함하고 있다면'where'를 변경하여 필드를 따로 비교하십시오. – HABO

+0

예, 색인이 있지만 문제는 성능이 아닌 로그입니다. –

답변

1

당신은 ...

예를 @@rowcount 시스템 변수를 사용하고 @@rowcount 안타 0

주 dbo.CustomerLog에 추가 AND NOT EXISTS까지 일괄 삽입 작업을 수행 할 수 있습니다

DECLARE @BATCHSIZE INT=100000 

WHILE @BATCHSIZE>0 
BEGIN 
    BEGIN TRY 
    BEGIN TRANSACTION; 


       INSERT INTO dbo.CustomerLog 
         (OnlineStore , 
          PhoneNumber , 
          ChangeType 
         ) 
         SELECT TOP(@BATCHSIZE) 
           'Online Store a' , 
           AreaCode + PhoneNumber , 
           'Added' 
         FROM dbo.StoreAList a 
         WHERE NOT EXISTS (SELECT 1 
              FROM dbo.StoreAListCompare b 
              WHERE (b.AreaCode + b.PhoneNumber) = (a.AreaCode + a.PhoneNumber)) 
         AND NOT EXISTS (SELECT 1 
             FROM dbo.CustomerLog CL 
             WHERE 'Online Store a'=CL.OnlineStore 
             AND AreaCode + PhoneNumber=CL.PhoneNumber 
             AND 'Added'=CL.ChangeType); 

         SET @[email protected]@ROWCOUNT 

    COMMIT TRANSACTION       
    END TRY 
    BEGIN CATCH 
     ROLLBACK TRANSACTION 
     SET @BATCHSIZE=0 
    END CATCH; 
END 
관련 문제