【ITニュース解説】Sp or Not Sp pt.2
2025年09月09日に「Dev.to」が公開したITニュース「Sp or Not Sp pt.2」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
データベースのデータコピー処理で、プログラム側でデータを扱うORMとDB内で完結させるストアドプロシージャの性能を比較。検証の結果、ストアドプロシージャの方が通信量やメモリ消費を抑えられ、圧倒的に高速であることが示された。
ITニュース解説
システム開発において、データベース上のデータを複製する処理は頻繁に発生する。例えば、ある設定一式を別の設定としてコピーするような機能だ。この処理を実現する方法として、今回は「Entity Framework (EF)」のようなORMを使う方法と、データベースの「ストアドプロシージャ (SP)」を使う方法の二つを取り上げ、その性能差を具体的な数値と共に解説する。ORMとは、プログラムコード(オブジェクト)とデータベース(テーブル)を自動的に結びつけ、SQLを直接書かなくてもデータ操作を可能にする技術である。一方、ストアドプロシージャは、一連のSQL処理をデータベースサーバー内に保存し、呼び出すだけで実行できる機能だ。
まず、EFを使ったデータコピー処理の流れを見てみよう。この方法では、アプリケーションがまずデータベースに問い合わせ(SELECT文)、コピー元となるデータをすべて取得する。次に、取得したデータを元に、アプリケーションのメモリ上で新しいデータオブジェクトを作成する。最後に、作成した新しいオブジェクトをデータベースに保存する(INSERT文)。この一連の処理は、アプリケーションとデータベースの間で複数回のデータのやり取りが発生することを意味する。つまり、データを一度アプリケーション側に運び、加工してからデータベースに戻すという「往復」が生じる。
対して、ストアドプロシージャを使う方法では、処理のほとんどがデータベース内で完結する。INSERT INTO ... SELECT ... のような単一のSQL文をプロシージャとして定義しておくことで、コピー元のテーブルからデータを読み出し、直接新しいデータとして挿入する処理をデータベース自身が行う。アプリケーションの役割は、このストアドプロシージャに必要な情報(どのデータをコピーするかなど)を渡して呼び出すだけだ。データそのものがアプリケーションとデータベースの間を行き来しないため、通信のオーバーヘッドが大幅に削減される。
一般的に、ストアドプロシージャの方が高速であることは多くのエンジニアが知っている。しかし、実際の開発現場では「どちらが速いか」という感覚的な理解だけでは不十分な場合が多い。「具体的にどれくらい性能が向上するのか」を数値で示すことが求められる。なぜなら、ストアドプロシージャの導入には、開発の複雑性が増したり、特定のデータベース製品に依存してしまう「ベンダーロックイン」といったデメリットも存在するからだ。これらのデメリットを受け入れてでも導入する価値があるかを判断するためには、客観的な性能データが不可欠となる。
性能を客観的に評価するためには、適切なツールを使う必要がある。EFのようなORMを利用する場合、それが内部でどのようなSQL文を生成しているかを把握することが性能改善の第一歩となる。EFには、生成されるSQL文を確認するためのToQueryString()メソッドや、実行されるすべての処理をログに出力するLogTo()といった機能が備わっている。これらを使うことで、EFによるコピー処理が、データの取得(SELECT)と書き込み(INSERT)という複数のステップに分かれて実行されていることを視覚的に確認できる。
さらに、データベースとの通信内容をより詳細に分析するツールもある。データベース接続を管理するSqlConnectionクラスの統計情報機能を有効にすると、サーバーとの通信回数(ラウンドトリップ)や送受信したデータ量を計測できる。実際にこの機能で両者を比較すると、EF方式はSP方式に比べて通信回数、データ量ともに桁違いに大きいことがわかる。これは、データがアプリケーションとデータベースを往復していることの明確な証拠である。
そして、最終的な性能評価として「BenchmarkDotNet」のようなベンチマークツールが有効だ。このツールは、コードの実行時間やメモリ使用量を精密に測定できる。測定結果は明確で、コピー対象のデータ件数が増えるにつれて、EF方式の実行時間は急激に悪化し、メモリ使用量も比例して増加する。一方、SP方式はデータ件数が増えても実行時間の増加は緩やかで、アプリケーション側のメモリ使用量はほぼ一定に保たれる。データ量によっては、実行速度に10倍以上の差がつくこともあり、SP方式の圧倒的な優位性が数値で証明された。
今回の比較検証から、大量のデータを一括で処理する場合、データベース内で処理を完結させるストアドプロシージャは、ORMを介してアプリケーション側で処理を行う方式に比べて、実行速度とリソース効率の面で著しく優れていることが明らかになった。特に、ネットワークを介したデータのやり取りを最小限に抑えられる点が大きな利点である。ただし、これはORMが劣っているという意味ではない。ORMは生産性の向上やコードの可読性に大きく貢献する。重要なのは、それぞれの技術の特性を理解し、処理の内容やデータ量に応じて最適な手法を選択することだ。そして、その選択を裏付けるために、感覚だけに頼るのではなく、適切なツールを用いて性能を測定し、客観的なデータに基づいて判断する能力が、これからのシステムエンジニアには求められる。