「ローカルでは速いのに、本番では遅い」——この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やバックエンドエンジニアには、今すぐ試す価値のある機能だ。