1

私は2600万レコードのテーブルを持っていて、それにいくつかの列を追加したかったので、追加された列で新しいテーブルを作成してから、 INSERT INTO table_new SELECT (field1,field2) FROM table_old

これは、既存のテーブルに列を追加しようとするよりも速いと言われています。

いずれにせよ、2600万件のレコードがあるため、これには長い時間がかかり、MySQL Workbenchでプロセスを監視すると、プロセスがまだ実行されていることがわかります(40時間とカウント)。

ただし、を実行するSELECT * FROM table_newと、まだレコードが表示されません。InnoDBでは、トランザクション全体が完了するまで待ってから、新しいテーブルに2,600万件のレコードが表示されますか?または、レコードが1つずつリアルタイムで挿入されていることを確認する必要がありますか?

以前は昨日着実にカウントアップしていたステータス変数を見ていて、Innodb_rows_inserted0から2600万への進捗を表す必要があると思いますが、現在は1400万で静止しており、リアルタイムで増加していません:S、それでも私のINSERT INTO SELECTプロセスはまだ実行中です。何かがおかしいのではないかと心配しています。

すべてが期待どおりに機能していることを確認するにはどうすればよいですか?

4

1 に答える 1

0

実行中に大きなコミットの進行状況を追跡したい場合は、INSERT をプロシージャとして実行できます。

これによりオーバーヘッドが少し増えますが、x レコードごとにコミット ポイントを追加できます (たとえば、以下の例では、100 レコードごとにコミットします)。

注意: これは Oracle を念頭に置いて書かれているため、マイレージは異なる場合がありますが、ニーズに合わせて翻訳できることを願っています。

declare
    v_counter       NUMBER := 0;
    cursor c_table_old is
        select *
        from table_old;
begin

    FOR l_table_old in c_table_old LOOP
        insert into table_new (field1, field2) 
        values (l_table_old.field1,
                l_table_old.field2);

        v_counter := v_counter + 1;

        IF (MOD(v_counter, 100) = 0) THEN
            commit;
        END IF;

    END LOOP;

end;
/
于 2012-06-27T14:55:39.450 に答える