Open4

PostgreSQLで使える大量のデータ移行Tips

ryohma0510ryohma0510

インデックスの一時的な削除

大量データを移行するときに、一時的にインデックスを削除して、データを移行完了してから、インデックスを作成する方法があります。

いくつかの記事では、この方が早かったと書かれていましたが、僕がやった環境では、最後にインデックスを作成するときにDBのメモリ使用料が急上昇してクラッシュしてしまいました。

この方法を検討するときは実際に検証が必要そうです。

https://www.postgresql.jp/document/14/html/populate.html#POPULATE-RM-INDEXES

ryohma0510ryohma0510

ランダムソートによるサンプル検証

データ移行完了後に、データの整合性を検証するときの話です。

データ量が10万程度なら全てのデータを検証しても問題ないですが、それ以上の時はランダムにサンプリングしたデータのみを検証する必要がありました。

一番簡単な方法はorder by rand()とlimitを使う方法。

パフォーマンスは悪いが、データ移行の時に数回使うくらいなら、100万-1000万程度のレコードなら問題なかった。

注意点は以下の記事を参照

https://techracho.bpsinc.jp/hachi8833/2018_02_01/50485

ryohma0510ryohma0510

TABLESAMPLE句によるサンプリング

TABLESAMPLE句を使うことで、数億レコードのテーブルからでも高速にサンプリング可能です。

僕の場合は以下の記事のようにCursorパターンを組み合わせて使いました

https://zenn.dev/uma002/articles/c0ab89d303fb5e