0

Postgresでパーティションテーブルのセットを作成し、マスターテーブルを介して多くの行を挿入し始めました。ロードプロセスが爆発したとき、id行BIGSERIAL(シーケンス付きのBIGINT、舞台裏)を宣言する必要があることに気付きましたが、誤ってSERIAL(INTEGER)として設定しました。数十億行がロードされたので、列をBIGINTに変更しようとしています。プロセスは機能しているようですが、時間がかかります。ですから、実際には、それが機能しているのか、ハングしているのかはわかりません。ロードプロセス全体を再開したくありません。

助言がありますか?

4

2 に答える 2

1

PostgreSQLで行を更​​新して変更すると、行の新しいコピーが書き出され、後で元の行を削除するためにクリーンアップが行われます。つまり、更新を行って問題を修正しようとすると、すべてのデータを最初から再度読み込むよりも時間がかかる可能性があります。新しいコピーを読み込むよりもディスクI / Oが多くなり、処理時間も長くなります。リロードの代わりに更新を実行したい唯一の状況は、元のロードが非常に非効率的だった場合です。たとえば、遅いクライアントプログラムがデータを挿入していて、それがプロセスのボトルネックである場合です。

プロセスがまだ機能しているかどうかを確認するには、top(UNIX風のシステム)またはタスクマネージャー(Windows)を実行するときにCPUを使用しているかどうかを確認します。Linuxでは、「top -c」は、PostgreSQLクライアントプロセスが実行していることを示します。おそらく、元のロードよりも時間がかからないことを期待していましたが、そうではなく、ハングアップするのではなく、まだ実行されています。

于 2010-06-22T12:39:07.070 に答える
0

再起動します(編集を明確にします:ロードプロセス全体を再起動します)。

列の値を変更するには、新しい行バージョンが必要であり、古いバージョンを指すすべてのインデックスを更新して、新しいバージョンを指すようにする必要があります。

さらに、データベースの作成に関するアドバイスのどれだけに従うことができるかを確認してください。


@archnidからの修正:

列のタイプを変更するとテーブルの書き換えがトリガーされるため、行のバージョン管理は大きな問題ではありませんが、一時的に大量のディスク領域が必要になります。通常、データベースディレクトリ内のどのファイルが追加されているかを確認することで進行状況を監視できます...

于 2010-06-21T22:03:08.507 に答える