もうStored Proceduresはやめよう、アプリ開発者からの懇願

We need to stop using Stored Procedures

アプリケーションからStored Proceduresを呼び出すのをやめるべきだと著者は主張する。パラメータ化クエリとプランキャッシュの利点は通常のクエリでも得られ、むしろアプリとDBアクセスロジックを同じバージョンで管理できる。ネットワークリクエスト、インデックス、ORM、デカルト積爆発など、アプリ開発者が知るべきDB操作の基本も解説する。

アプリケーション開発者よ、頼むから、Stored Proceduresへの依存をコードベースに入れるのはやめてくれ。
  1. saxenaabhi

    これは非常にお粗末に書かれていて、基本的な事実で間違っている。

    > では、ストアドプロシージャで何が得られるのか?

    > 何も得られない!いや、つまり、頭痛の種が一つ、かな。

    > ... クエリを更新するためにマイグレーションをデプロイしなければならないし、diff migration_for_my_sproc migration_for_my_sproc_n を実行して何が変わったか確認しなければならない

    1) SQL関数はコードと一緒にリポジトリでバージョン管理でき、DBマイグレーションと一緒に(同じトランザクションでさえも)デプロイできる。

    SQL関数ごとに1ファイルにしておけば、私のように600個のストアドプロシージャがあるリポジトリでも、チェックサムを計算して高速化できる。

    2) ストアドプロシージャを使えば、複数のステートメントを実行するときにサーバー側で db.startTransaction を呼び出してDBのラウンドトリップを待つ必要がない。これがストアドプロシージャを好む最大の理由であることが多い。

    3) 医療や金融のシステムで、異なるチームが基盤となるテーブルにアクセスできず、DBはSQLプロシージャだけを公開しているのを見たことがある。プロシージャが呼び出されるたびに、監査テーブルにログエントリも追加される。

    データベースは素晴らしい技術だ!適切に使う方法を学べば、ビジネス価値の創出という点で大きな見返りが得られる。

    追記:この記事では触れられていないが、人はよくストアドプロシージャのテストの難しさを口にする。

    通常の vitest テストで、インメモリの pglite を使って postgres 関数をテストできる。

  2. JeffRosenberg

    > アプリケーションコードとDBアクセスは別々にバージョン管理されていて、うちのsprocは異常な(つまり極めて稀で常軌を逸した)DBAによって足元で勝手に変わりうる

    あなたのデータベース(とそのマイグレーション)は、残りのコードと一緒にソース管理されるべきだ。これで問題解決、あとはストアドプロシージャが持つ正当な利点のいくつかを活用すればいい!

  3. noddingham

    (私たちのオンプレミスのSQL Server環境では)Web開発者に対して、ストアドプロシージャをAPIコントラクトのように公開して、データベースとのやり取りの整合性と堅牢性をある程度確保している。最近のWeb開発者のSQL知識は当てにならないことが多く、スキーマを設計してストアドプロシージャを提供するのはDBAに任せたい。

この日のほかの記事

2026-09-20