ORM利用すると性能が出ないってホント?

先日たまたまORMの話をしてて
「ORM使うと性能出ないよね〜」
みたいなことを言われました。私は
「そんなことないですよ〜」
って答えたんだけど、今回はその辺のところをまとめてみようと思います。

そもそもORMを採用するメリットについて

性能うんぬんの前に私が思うORMを採用するメリットをあげたいと思います。


(1)インピーダンスミスマッチの回避

オブジェクト指向」と「RDB」ではデータモデルの思想に差異があるので必ずミスマッチが起こります。

  • オブジェクト指向のデータモデル ・・・ 現実世界のデータモデル。
  • RDBのデータモデル ・・・ データの登録/検索/更新/削除に最適なデータモデル。

ORMを採用するとデータモデルは業務モデルのみとなるため、このミスマッチを回避することが出来るようになります。

(2)SQL混入(による視認性/拡張性の阻害)の回避

従来システム設計はDOAで進めるのが主流で、その場合はRDBのデータモデル設計(ER図を書いたりDB定義書を作成したり)から入るのが普通でした。
そしてそのRDB用に最適化されたデータモデルから業務にあったデータをSQLを利用してCRUDするというのが最適化されたシステムだと思われてきました。

ただしSQLは言わずもがなRDB用の言語であり「非オブジェクト指向言語」です。
「継承」や「カプセル化」といったエッセンスを持ち合わせていないため、オブジェクト指向言語に非オブジェクト指向言語SQLが混入することによって視認性/拡張性が阻害されてしまいます。


ORMを利用すると業務データモデルをそのまま永続化することが出来ます。
結果としてSQLが混入することを回避でき、コードの視認性/拡張性が向上するものと思います。


(3)SOA/DDDの促進

前述したように、ORMを採用するとシステム内で扱うデータモデルは業務データモデルのみで良くなります。
これはこれまでのDOAとは違ってトップダウンからアプローチ出来ることを意味しており、SOA/DDDといった設計思想を促進させるものだと思っています。


で、ORMだと性能が出ないってホント?

では本題の性能の話ですが、ORMでは性能は上がらないのでしょうか?私はそうは思いません。
なぜなら、従来のように(DOA思想で)ORMを利用せずに設計されたシステムには必ずインピーダンスミスマッチが発生し、そこをSQLによって繋ぐのでORMを利用したシステムよりDBのI/Oが(もっと単純に言うと複雑なSQLが)増えると考えているためです。

一方でORMを利用したシステムでは(DDD的に)設計した業務モデルがそのまま永続化されることになります。
よって複雑な副問い合わせ等は発生しづらく、DBに対しては単純なCRUD処理が繰り返される事となります。
そのためDB負荷は前者に比べて低くなりやすいのではないかと考えています。



さいごに

今回はORMについて思うところをまとめました。
ORM推しみたいな感じになりましたが、物事の正解はコンテキストによって変わると思いますし、ORMが絶対とも思っていません。

例えば

  • 既存システムの老朽化更新
  • 業務は変えない

といったプロジェクトがあったとすれば、そもそも業務モデルは最適化出来ないと思うので安易にORMを導入しても性能劣化させるだけかもしれません。
この場合は愚直に、SQL改善やDBチューニングに力を注いだ方が良いかもしれません。

このように、どちらも選択できるような状態にしておくのが個人的にはベストだと思っています。
そんなことを考えていた今日この頃でした。