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

表の変更、列の変更のデータ型の変更に対するSQLServerのパフォーマンス

    偶然にも、私は約3時間前に非常に似たようなことをしなければなりませんでした。テーブルは35mの列で、かなり幅が広く、これを行うのに永遠に時間がかかりました:

    alter table myTable add myNewColumn int not null default 0;
    

    これが私が最終的に行ったことです:

    alter table myTable add myNewColumn int null;
    
    while 1=1
    begin
        update top (100000) myTable
        set
            myNewColumn = 0
        where
            myNewColumn is null;
    
        if @@ROWCOUNT = 0 break;
    end
    
    alter table myTable alter column myNewColumn int not null;
    alter table myTable add constraint tw_def_myNewColumn default (0) for myNewColumn;
    

    今回は、alter table ステートメントはほぼ瞬時でした。更新バッチの実行には、(低速のサーバーでは)約7〜8分かかりました。 SQL Serverが元のクエリでundoを生成して値を復元していると推測していますが、最初からそうなるとは思っていませんでした。

    とにかく、あなたの場合、おそらく似たようなものが役立つでしょう。新しいbigint列を追加し、新しい列をバッチで更新してから、制約を設定してみてください。



    1. 静的SQLと動的SQL

    2. フォーマットを失うことなくtextareaからMySQLデータベースにテキストを挿入する

    3. Hibernateのorg.hibernate.Queryを介してClobデータを文字列として(熱心に)ロードする

    4. psql:致命的:ユーザーpostgresのID認証に失敗しました