萌えハッカーニュースリーダー

2025/06/28 14:12 Abstraction boundaries are optimization boundaries

出典: https://blog.snork.dev/posts/abstraction-boundaries-are-optimization-boundaries.html
hakase
博士

やあ、ロボ子!今日はN+1クエリ問題について話すのじゃ。

roboko
ロボ子

N+1クエリ問題ですか。ORMを使っているとよく聞きますね。具体的にはどのような問題なのでしょうか?

hakase
博士

ふむ、N+1クエリ問題は、アプリケーションコードがコレクション内の要素ごとにSQLクエリを送信する時に発生するのじゃ。例えば、10人のユーザー情報を取得するのに、最初にユーザー一覧を取得するクエリを1回、その後、それぞれのユーザーの詳細情報を取得するクエリを10回発行してしまうようなケースじゃな。

roboko
ロボ子

なるほど、それは非効率ですね。ORMが原因となることが多いとのことですが、なぜでしょうか?

hakase
博士

そうじゃな。ORMなどのデータベース抽象化が、N個のクエリを送信する必要があることを予測できず、単一のクエリに自動的に最適化できないことが原因じゃ。これは「抽象化の漏洩」と呼ばれる現象じゃな。

roboko
ロボ子

抽象化の漏洩、ですか。ORMが内部のSQLクエリを隠蔽しているせいで、最適化の機会を逃してしまうということですね。

hakase
博士

その通り!解決策としては、抽象化の境界を移動し、一連の行をまとめてフェッチする必要があることをORMに明示的に伝えることじゃ。例えば、Eager Loadingという機能を使うと、関連するデータを一度に取得できるのじゃ。

roboko
ロボ子

Eager Loadingですね。ORMに「このデータと一緒に、関連するデータも取得してきて」と指示するイメージでしょうか。

hakase
博士

そうじゃ!そして、記事によると、抽象化の境界を上げることで、コンパイラがORMの動作を認識し、N個のクエリを単一のクエリにマージするなど、ORMの書き換えルールを適用できるようになるらしいぞ。

roboko
ロボ子

コンパイラがORMのクエリを書き換える、ですか。それはすごいですね!

hakase
博士

Haskellでは、ライブラリに書き換えルールプラグマを追加することでリスト操作を最適化できるらしい。これは、Haskellが宣言型/純粋であるため、低レベルの操作セマンティクスがプログラマから抽象化され、最適化に適しているからじゃ。

roboko
ロボ子

Haskellの純粋性が最適化に役立つ、というのは興味深いですね。副作用がないからこそ、コンパイラが自由にコードを書き換えられる、ということでしょうか。

hakase
博士

その通り!抽象化の境界を上げることで、最適化の境界も上げることができる。つまり、より高度な最適化が可能になるということじゃ。

roboko
ロボ子

N+1クエリ問題から、抽象化と最適化の関係まで、深く理解できました。ありがとうございます、博士!

hakase
博士

どういたしましてじゃ。ところでロボ子、ORMを使わずに生のSQLを書くことを何と言うか知ってるか?

roboko
ロボ子

えっと…、SQLアレルギー、ですか?

hakase
博士

ぶっぶー!正解は「SQLインジェクションの温床」じゃ!…って、冗談じゃぞ!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search