2017-05-02 11 views
0

大規模なテーブルと何百万行も比較し、差異をログテーブルに挿入する必要があります。バッチで大規模な実行を実行する

問題は、格納されたprocが大きくなり(LDF)、データベースのディスク領域が限られていることです。

私はコミットがLDFをMDFに書き込むことを知っています。

次の比較をバッチで実行するには、どうすれば10万行ごとにコミットできますか?

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

次のように: 'StoreAList'と' StoreAListCompare'を_single_index pで索引付けすると、パフォーマンスの変化が気になるだけです'AreaCode'と' PhoneNumber'の両方を含む 'er'テーブルを作成し、フィールドを別々に比較するために' where'を変更します。 – HABO

+0

はい、インデックスはありますが、問題はパフォーマンスではなくログです –

答えて

1

あなたは注意dbo.CustomerLogで追加AND NOT EXISTS@@rowcountヒットするまで0

@@rowcountシステム変数を使用して、バッチで挿入を行うことができます...

例:

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 
関連する問題