sql >> データベース >  >> RDS >> Sqlserver

巨大なテーブルデータをSQLServerの別のテーブルにコピーする方法

    同じ問題が発生しましたが、20億行のテーブルがあるため、これを実行すると、リカバリモデルがバルクロギングに設定されていても、ログファイルが無限に大きくなります。

    insert into newtable select * from oldtable
    

    だから私はデータのブロックを操作します。このように、転送が中断された場合は、再起動するだけです。また、テーブルほどの大きさのログファイルは必要ありません。また、tempdb I / Oが少なくなるようですが、理由はわかりません。

    set identity_insert newtable on
    DECLARE @StartID bigint, @LastID bigint, @EndID bigint
    select @StartID = isNull(max(id),0) + 1
    from newtable
    
    select @LastID = max(ID)
    from oldtable
    
    while @StartID < @LastID
    begin
        set @EndID = @StartID + 1000000
    
        insert into newtable (FIELDS,GO,HERE)
        select FIELDS,GO,HERE from oldtable (NOLOCK)
        where id BETWEEN @StartID AND @EndId
    
        set @StartID = @EndID + 1
    end
    set identity_insert newtable off
    go
    

    IDの処理方法を変更する必要がある場合があります。これは、テーブルがIDによってクラスター化されている場合に最適に機能します。



    1. Postgresで再帰的なJSONキーを収集する

    2. MySQLでのLTRIM()関数のしくみ

    3. ORA-00054:リソースがビジーで、NOWAITを指定して取得します

    4. 2つの異なるテーブルを結合し、重複したエントリを削除します