PostgreSQL 18の新機能:本番データなしで本番クエリプランを再現する方法

元記事を読む
キュレーターコメント

「本番でしか再現しない遅いクエリ」に悩んだことがある人なら刺さる話。PostgreSQLとSQLiteの設計思想の違いも垣間見えて、読んでいて唸らされた。

概要

「ローカルでは速いのに、本番では遅い」——このSQLクエリあるある問題を根本から解決するアプローチが、PostgreSQL 18で正式に登場した。新関数 pg_restore_relation_stats()pg_restore_attribute_stats() を使えば、本番DBの統計情報だけを開発環境にコピーして、数百GBのデータを移さずに本番と同じクエリプランを再現できる。

PostgreSQLのクエリプランナーは、テーブルの行数・カラムの値分布・NULL率などの内部統計(pg_statistic)を参照してクエリの実行計画を決定する。この統計が本番と開発で異なると、インデックスが使われる/使われないといった挙動の差が生まれ、デバッグが難しくなる。たとえば status = 'shipped' は全体の1.5%なのでインデックスが効くが、status = 'delivered' は95%なのでフルスキャンの方が速い——こうした判断を本番と同じ統計情報で再現できるのが今回の肝だ。統計ダンプのサイズも驚くほど小さく、数百テーブルあっても1MB未満に収まるという。

Simon Willisonがこの話題をポストした後、SQLiteの作者であるD. Richard Hippが「SQLiteはずっと前から sqlite_stat1 テーブルで同じことができるよ」と即座に返答したのも面白い。PostgreSQLが18年かけて実装した機能を、SQLiteはシンプルな書き込み可能テーブルで静かに実現していた。本番環境との挙動の差で悩んでいるDBAやバックエンドエンジニアには、今すぐ試す価値のある機能だ。