実際に本番環境で性能問題が発生した事例です。
原因は、パーティションテーブルの設計ミスでした。
PostgreSQLのマニュアルに、以下の記載があります。
「100個までのパーティションでうまく動作します」
後で分かったことですが、サイジングが誤っており、
800億件を想定した設計になっていました。
その結果、「アクセス効率」ではなく、
「パーティション数を減らすこと」が優先され、
以下をパーティションキーにしていました。
・xxxコードをハッシュ化してyyy分割した値
※私はインフラ担当でした。
パーティション設計で最も重要なのは、「どの条件で検索されるか」です。
パーティションテーブルは、
不要なデータを検索対象から除外するための仕組みです。
しかし、検索条件と無関係なキーでパーティション分割すると、
複数パーティションを検索する必要があり、
性能改善につながりません。
結果として、
複数パーティションを毎回検索する状態になっていました。
さらに厄介なのは、本番後に性能問題が発生した場合、
「なぜこの設計にしたのか」を後から読み解く必要があることです。