いかに小さなPostgresメタデータテーブルが大規模クエリのボトルネックになるか
PostgreSQLのメタデータテーブル(pg_class、pg_stats等)はサイズが小さくても、大規模クエリのパフォーマンスに多大な影響を与える可能性がある。本記事では、統計情報の古さや不適切なインデックス管理が原因で、最適な実行計画が選択されずクエリが遅延するメカニズムを解説し、定期的なANALYZE実行や適切な統計情報の維持が重要であることを指摘する。
背景メモ
カリフォルニアを拠点とするTigerData社が公開したブログ記事。同社はPostgreSQLを専門に扱うデータベースコンサルティング企業で、大規模データベースのパフォーマンス最適化を主な事業としている。
本記事で扱うのは、PostgreSQLにおいてテーブル数・カラム数・インデックス数が数千〜数万に達する"スキーマ肥大化"環境で発生する問題。具体的には、PostgreSQLがクエリ実行計画を立てる際に内部的に参照するシステムカタログ(pg_attribute、pg_statistic等)が、テーブル構造の複雑さに比例して巨大化し、ANALYZE(統計情報更新)やクエリ最適化自体が著しく低速化する現象を解説している。
数百テーブル程度の典型的な運用では無視できる問題だが、マルチテナントSaaSや自動生成スキーマを使う大規模システムでは、単純なクエリであってもカタログ読み取りだけで数十秒を要するケースがある。TigerDataはこうした状況への対策として、テーブル設計の見直し(テーブル数削減・パーティショニング活用)や、主要カタログをメモリに常駐させる設定を提案している。