私たちはHerokuのライブPostgresデータベースを作成しています。正規表現を使用して複数の文字列を置き換えて約500万行を更新する必要があります。これは合計で約1億回の更新を実行することを意味します。ライブデータベースの更新前のインデックスの削除
我々はそれをこのように更新されています(使用してpsycopg2)
for element in list:
cursor.execute("Update table set text = regexp_replace(text, %s, 'NewWord', 'gi') where date >= '2017-12-31';", [element])
データベースは、ライブと私たちのDjangoのウェブサイトにリンクされている、と私たちは、データベースへのこの更新プログラムを必要とし、3日以内に新しい機能をロールバックする必要があります。 Postgresガイドは、インデックスを削除するとはるかに高速だと言っていますが、外部キーインデックスを削除すると、Googleのdjangoの機能が停止し、ウェブサイトがダウンする可能性があります。それでも、私たちは週末には1日から2日間、面倒を見ることができますが、それ以上のことはありません。
ので:
- は、インデックスを削除することで、億回の 更新が一日で行うことができると仮定することは安全ですか?
- もしそうなら、プライマリ キーインデックスも削除する必要がありますか?
- もしそうでなければ、インデックスを削除せずに、同じような のアップデートを実行するまでにどれくらい時間がかかりますか?
モデルを使用してレコードを更新するだけでDjango ORM(またはSQLAlchemyを使用する場合)に頼る方が安全ではないでしょうか? Django(DjangoシェルまたはDjango Admin)以外のスキーマを変更すると、データに矛盾が生じる可能性があるため、一般的にはお勧めしません。 – dmitryro
これは、ポストグレスの質問よりもHerokuの質問によく似ています。なぜなら、答えの多くはハードウェアと構成に依存しているからです。それで、ベンチマークとして10kアップデートを発行しようとしましたか? – jmelesky
また、各行を20倍に更新するとテーブルが膨らんでしまいます(postgresはすべての更新に対して行のコピーを作成し、それらのコピーはバキューム処理でのみクリーンアップされます)。とりわけ、更新が進むにつれて更新がより長くかかる可能性があることを意味します。行ごとに1つの更新に減らすことができれば、それは間違いなくあなたを助けます。 – jmelesky