カーソルを使用して、大きな postgres テーブルからレコードを取得しています。(子テーブルを使用してデータを分割する 4 億レコード。)私のカーソルは次のように定義されます。
select * from parent_table order by indexed_column
JDBC と psql の両方を使用すると、最初の数十万回の取得のパフォーマンスは一貫しています。その後、崖から落ちて元に戻りません。サーバーの CPU、メモリ、およびディスクのアクティビティはほぼ均等です。つまり、明らかな原因として目立ったシステム ベースはありません。最初はこれがネットワークの問題ではないかと疑っていましたが、別のネットワークからこれを再現しました。
psql は次のとおりです。
db@dbdev> fetch 100000 from all_persons;
Time: 13995.910 ms
db@dbdev> fetch 100000 from all_persons;
Time: 13852.955 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14037.631 ms
db@dbdev> fetch 100000 from all_persons;
Time: 13818.516 ms
db@dbdev> fetch 100000 from all_persons;
Time: 13952.260 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14257.836 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14115.941 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14375.485 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14898.741 ms
db@dbdev> fetch 100000 from all_persons;
Time: 14086.004 ms
db@dbdev> fetch 100000 from all_persons;
Time: 59841.556 ms
db@dbdev> fetch 100000 from all_persons;
Time: 198176.211 ms
db@dbdev> fetch 100000 from all_persons;
Time: 162593.582 ms
JDBC は次のとおりです (一度に 10000 を取得します。左側の数字は、挿入されたレコードのフィルター処理されたセットの数です)。
...
536040 retrieve in 405; filtering in 28; insert in 1734
544739 retrieve in 413; filtering in 27; insert in 1713
553574 retrieve in 382; filtering in 27; insert in 1761
563167 retrieve in 348; filtering in 28; insert in 2019
572723 retrieve in 363; filtering in 27; insert in 2048
581736 retrieve in 363; filtering in 28; insert in 1784
591131 retrieve in 480; filtering in 28; insert in 1869
600260 retrieve in 377; filtering in 27; insert in 1831
608234 retrieve in 24074; filtering in 27; insert in 1566
616212 retrieve in 23711; filtering in 27; insert in 1649
624449 retrieve in 25913; filtering in 27; insert in 1587
632528 retrieve in 29981; filtering in 27; insert in 1527
641334 retrieve in 23231; filtering in 27; insert in 1728
650427 retrieve in 27883; filtering in 27; insert in 1996
659516 retrieve in 34422; filtering in 27; insert in 1774
psql のパフォーマンスは悪化しているように見えますが、JDBC のパフォーマンスは、少なくとも 100 万件のレコード (約 34k から 17k ミリ秒の間で跳ね返ります) の間、ほぼ一貫しています。
パフォーマンスが急激に低下した理由は何ですか?
(編集)作業ソリューション:
バッチ サイズ (取得/挿入) を 5000 に落とし、(親テーブルではなく) 各子テーブルに対して順番にカーソルを実行することで、これを解決しました。order by は順序付けられたインデックスに反していましたが、それが役立つように見えたので、order by もカーソルから削除しました。
私の推測では、これにより、postgres が完全なパーティションを一度にロードする最良の機会が得られると思います。