世界を動かす技術を、日本語で。

スタートアップのためのPostgres生存ガイド

2026年7月22日原文(hatchet.run)

概要

  • Postgres運用の実践知見 をエンジニア向けにまとめた内部ドキュメントの要点
  • SQLやインデックスの基本的な知識 を前提に、スキーマ設計やクエリ最適化の実践ルールを紹介
  • ORM利用時の注意点 や、スケール時に直面する最適化の壁についても言及
  • パフォーマンス改善・マイグレーション・接続管理 など、現場で役立つノウハウを体系化
  • 中級者向けにはクエリプランナーやバルク書き込み、autovacuumの扱い方 も解説

Postgres運用ノウハウのまとめ

  • Postgresの公式マニュアル は網羅的だが、トラブル時には情報量が多すぎて参照しづらい現実
  • SQL基本(クエリ・テーブル・インデックス) の理解を前提に、現場で得た知見のエッセンスを整理
  • ORM利用時 は、このガイドのTipsをORMに合わせて翻訳・適用する必要
    • Prisma TypedSQLやsqlc(Goスタック向け)など、SQL直接記述可能なツールの活用推奨

スキーマ設計のポイント

  • スキーマは最初にしっかり設計、後からの変更が困難なため
    • テーブル・主キーの大枠を作り、実際のアプリ要件に基づくクエリを先に書いてみる
  • 主な設計指針
    • 主キーはidentityカラム(auto-increment int)またはUUIDを推奨
    • timestamptz型 の利用
    • 主キー・外部キーは必ず設定
    • 外部キーのカスケード削除 は低ボリュームテーブルで有効、高ボリュームでは慎重に運用

読み取り(SELECT)クエリの最適化

  • インデックスが効く場合のみ高速、そうでない場合は全件走査(seq scan)となる
    • インデックス・ユニーク制約・主キーでのフィルタが基本
    • btreeインデックスの特性を理解し、 log(n)の高速検索 を活用
  • seq scan は2万行未満なら気にならない速度、だが規模拡大時は要注意

パフォーマンスの良いJOIN・ORDER BY

  • INNER JOINは主キーで行うのが基本、ON句はWHERE句と同じくらい重要
  • 複合インデックス(compound index) の活用
    • ORDER BYのカラムをインデックスの末尾に揃えるのがコツ
    • DESC指定は単一インデックスでは影響小だが、複合インデックスでは揃えるべき

書き込みクエリの注意点

  • トランザクションは短く保つ、外部サービス呼び出しは極力避ける
  • ロック対象を最小限に、高負荷時はロック競合が顕在化
  • 既存大規模テーブルへのインデックス作成はCREATE INDEX CONCURRENTLY を必ず利用

マイグレーションのベストプラクティス

  • マイグレーションは加算的(additive)に設計、カラム削除等は避ける
  • トランザクション内で実行 し、ロールバックや部分適用の容易化
  • ALTER TABLE系操作は書き込みブロックの有無を事前確認

コネクション管理

  • コネクションは高コスト資源、長寿命化が推奨
  • コネクションプール(pgbouncer等) の利用でリソース効率化
    • Hatchetではpgxpool(Go用インメモリプール)を利用

中級編:クエリプランナー・バルク更新・autovacuum

  • クエリプランナー は内部実装で操作困難だが、挙動を理解することが重要
    • 統計情報(ANALYZEで収集)がプラン決定の基礎
    • 統計が古いと最適なプラン選択ができず、パフォーマンス低下
  • EXPLAIN ANALYZE でクエリプランを可視化、explain.dalibo.com等で分析
  • seq scanを避けられない場合、インデックス利用よりもコストが低いと判断されているケース
    • パーティショニング等の抜本的な設計見直しも検討

大量書き込み時の工夫

  • 1クエリごとのオーバーヘッド削減 のため、バッチ処理(SendBatch等)を活用
  • バッチ化でスループット10倍向上 の事例もあり

autovacuumとテーブル統計

  • autovacuumのデフォルト設定 がパフォーマンス劣化の原因となる場合あり
    • VACUUM/ANALYZE頻度調整で統計の鮮度維持が重要

このドキュメントは、 Postgres運用の現場知見 を体系的にまとめ、 スキーマ設計・クエリ最適化・マイグレーション・接続管理・中級者向けのチューニング まで幅広くカバー。 ORM利用時の注意点パフォーマンス改善の実践的ノウハウ を知りたいエンジニアに最適なリファレンス。

Hackerたちの意見

スタートアップでPostgresを使ってた経験から言うと、この投稿は監視とアラートの重要性をあまり強調してない気がする。Postgresには避けるべき重要な障害モードがいくつかあって、アラートを使えばそれが起こりそうな時に早めに警告を受け取れるんだ。例えば、AWSはXIDラップアラウンドに近づくとメールを送ってくれる。でも、スタートアップだとそのメールを見逃しがちだよね、特にボクシングデーに送られたら。AWSが監視してるものからそのメールが来るようにするのは、ページャーに繋がってる何かであるべきだよ。

データベースを使う時、最初にバックアップ戦略を考えるのって大事じゃない?HAは最初の段階では「あるといいな」って感じだと思うけど、プロダクションのDBがあるなら、バックアップとリストアのプランは生存ガイドに載せるべきじゃない?ここではどちらも言及されてないみたい。みんなはpgのバックアップに何を使ってるの?Barman(https://pgbarman.org/)がまだ多くの人に使われてるのかな?(最近新しいpgインスタンスをデプロイしてないけど、新しいプロジェクトのために考えてるんだ。)

参考までに、うちはこれを使ってるよ: https://pgbackrest.org/ ポイントインタイムリカバリーができて、以前使ってたカスタムソリューションよりも改善されてる。毎晩バックアップしてくれるやつだったんだけどね。Backblaze B2(S3みたいなやつ)にバックアップしてるけど、設定は比較的簡単で、特に問題もないよ。

複雑にしたり、 fancyにしたり、依存関係を増やす必要はないよ。ほとんどの人にとって、cronジョブでpg_dump_allを呼び出してzstdにパイプして、その出力をs3/ftp/何でもコピーするのが十分だよ。もちろん、ある程度を超えるとフルバックアップを運ぶのは時間的にもお金的にも厳しくなるけど、これでもかなり遠くまで行けるよ。

pgdump / pgrestore、ネイティブバイナリ形式を使用

これ言ったら叩かれるかもしれないけど、もしまだPostgresの専門家じゃないなら、RDSとか似たようなクラウドDBを使った方がいいよ。自分でPostgresのインスタンスをホスティングして管理することで節約できるお金なんて、HAやバックアップ、リストア、ポイントインタイムリカバリー、リードレプリカとかのための実績のあるインフラに比べたらほんとに微々たるものだから。

バックアップは真剣なデプロイには必須だよね。でも、これはもっとDevOps寄りで、ガイドはSQLレイヤーに関することが多い。データベースが管理されている場合に限り、このガイドは満足できる内容だと思う。そうじゃないと、いろいろなことが起こるからね。

原子的なボリュームスナップショットは、電源障害に耐久性のあるデータベースには効果的だよ。理想的にはチェックポイントの前に行うと、リカバリー時間を最小限に抑えられる。スナップショットメカニズムの原子性は、このアプローチでデータの破損を防ぐために重要だね。私たちはAWSのEBSスナップショットを使って、マルチTBのMongoDBのインクリメンタルバックアップを作成していて、作成もリストアも早い(リストア後はパフォーマンスが少し落ちるけど)。ポイントインタイムリカバリーには対応してないけど、早いから頻繁にスナップショットを作成できる(例えば、毎時)。これをセカンダリバックアップ戦略として追加することを考えてもいいと思うよ、たとえPostgres専用のバックアップツールを使っていても。

もうk8sを使ってるなら、cnpgを使ってみたらどう? https://github.com/cloudnative-pg/cloudnative-pg

Postgresは大好きなんだけど、何かを立ち上げる時にはコストが高すぎると感じる。結局、DynamoDBやS3、S3上のDuckDB、SQLiteみたいなサーバーレスストレージの組み合わせになっちゃう。俺、頭おかしいのかな? decentなPostgresを持ちながら、月に$100以上は払わずに済む方法ってあるの?(そう、フルガルって言う時は本当にフルガルって意味だから…無料プランにこだわるソロファウンダーのことを考えてみて、ハハ)Neon/Supabaseのことは知ってるけど、前回試した時はスケール後に厄介な依存関係になっちゃって、コストが増えたからAurora/RDSに移行しちゃったよ、笑。追記:セルフホスティングの道もあるのは知ってるけど、上記のものを設定する方が管理時間的に速くて安上がりだと思う。もしかして俺がDBAに向いてないだけか、もっと勉強が必要なのかも。でも、今はAIもあるし、また挑戦してみるべきかな、しばらく新しいものを作ってないし。

あなたのスケールのVPSで簡単に動くよ、アプリを提供している同じVPSでもね。昔はある程度のシステム管理の知識が必要だったけど、今は特にプレマイドのDockerファイルを使えば簡単だよ。

あなたのウェブアプリを支える$10のVPSでPostgresは問題なく動くよ。もし動かないなら?もう一台$10のVPSを立ち上げればいい。設定やネットワークの調整、クエリやキャッシュを効率的にチューニングする方法を学ぼう。

Hacker Newsで議論の続きを見る