Open4
PostgreSQLで使える大量のデータ移行Tips
copyコマンド
- bulk insertだとクエリの65535の文字数制限があるけど、これはない
- 単純に速い
インデックスの一時的な削除
大量データを移行するときに、一時的にインデックスを削除して、データを移行完了してから、インデックスを作成する方法があります。
いくつかの記事では、この方が早かったと書かれていましたが、僕がやった環境では、最後にインデックスを作成するときにDBのメモリ使用料が急上昇してクラッシュしてしまいました。
この方法を検討するときは実際に検証が必要そうです。
ランダムソートによるサンプル検証
データ移行完了後に、データの整合性を検証するときの話です。
データ量が10万程度なら全てのデータを検証しても問題ないですが、それ以上の時はランダムにサンプリングしたデータのみを検証する必要がありました。
一番簡単な方法はorder by rand()とlimitを使う方法。
パフォーマンスは悪いが、データ移行の時に数回使うくらいなら、100万-1000万程度のレコードなら問題なかった。
注意点は以下の記事を参照
TABLESAMPLE句によるサンプリング
TABLESAMPLE句を使うことで、数億レコードのテーブルからでも高速にサンプリング可能です。
僕の場合は以下の記事のようにCursorパターンを組み合わせて使いました