Query Compilerプロジェクトは、従来のRustエンジンをWASMモジュールとTypeScriptで構築されたより軽量なソリューションに置き換えることで、Prisma ORMをアップグレードします。この変更により、クエリのパフォーマンスが向上し、バンドルサイズが85〜90%削減されるとともに、さまざまなWebフレームワークやバンドラーとの互換性も向上します。Prisma ORMがバージョン7に向かうにつれて、開発者はよりスムーズで効率的なエクスペリエンスを期待できます。
パフォーマンスの壁を打ち破る
簡単にまとめると、Query Compilerプロジェクトは、Rustで記述されたPrismaクエリエンジンを、軽量なWASMモジュールと補足的なTypeScriptコードに置き換える取り組みです。この移行により、クエリの高速化とフットプリントの削減を期待しており、今回ベンチマークを実行してそれを証明しました。
前回のアップデート以降、私たちのチームはこのプロジェクトに集中的に取り組んできました。Prisma ORM 6.4では、Query Compilerの動作する概念実証という重要なマイルストーンに到達しました。このアルファバージョンには、既存のPrisma Client実装に対して包括的なベンチマークを実行するために必要なAPIが含まれています。コードと完全なベンチマーク結果は、ORMベンチマークリポジトリで確認できます。
Prisma Clientの新しいアーキテクチャ
Query Compilerを備えたPrisma Clientのアーキテクチャは、現在のDriver Adaptersのアーキテクチャに基づいて構築されています。現在のDriver Adaptersの実装では、Prisma ClientクエリはTypeScriptから、クエリエンジン、ドライバーアダプター、データベースドライバーを介して送信され、最終的にデータベースに到達します。
Query Compilerを使用すると、Prisma Clientクエリは最初に内部クエリプランに変換され、クライアントに返送されて、同じドライバーアダプターとデータベースドライバーのセットアップを介してデータベースに送信されます。現在 `driverAdapters` プレビュー機能を使用している場合、新しい実装は非常によく似た動作になります。
この移行は単なる近代化ではありません。Prisma ORMをより高速かつシンプルにすることです。新しいアーキテクチャは「落とし穴」が大幅に少なくなり、開発者が互換性を気にせずにPrisma ORMをスタックに統合できるようになると確信しています。
新しいアーキテクチャの主な利点
より高速なパフォーマンス
このプロジェクトの主な推進力は、Rustは非常に高速ですが、RustとTypeScript間でデータをシリアライズするコストが非常に高いことです。このコストは、Query EngineをRustで持つことによって得られるメリットを打ち消し、新しいアーキテクチャでは大幅な改善が見られました。
追加のバイナリは不要
Rustバイナリへの依存関係を削除することで、開発パイプラインで追加ファイルを管理することから生じる多くの問題を解消しました。厳格なネットワークがバイナリをインストールできないという単純な問題から、本番環境と開発環境に正しいファイルがあることを確認する複雑な問題まで、Query Compilerプロジェクトにはこれらの問題は存在しません。
それに加えて、バイナリの削除は、環境がJavaScriptを実行できる場合、Prisma ORMを実行できることを意味します。AWS LambdaやCloudflare Workersのような環境の最大の課題が解決されることを期待しています。Prisma Clientは、アプリケーションスタックに自然に適合するようになります。
大幅に削減されたバンドルサイズ
最初のテストでは、RustベースのPrismaクエリエンジンは約14MB(gzip圧縮で7MB)であるのに対し、新しいQuery Compilerは約1.6MB(gzip圧縮で600KB)であり、平均して85〜90%のサイズ削減になることが示されています。ディスクスペースが少ないということは、デプロイが迅速になり、アプリをより多くのプラットフォームに簡単にデプロイできることを意味します。
ベンチマーク結果
数値がすべてを物語っています。既存のRustクエリエンジンと比較すると、新しいQuery Compiler(QC)アーキテクチャは、取得するデータ量が増加するにつれて徐々に向上するパフォーマンス向上をもたらします。まさに最も重要なときに高速になります。
ベンチマーク | QC | Rust | 結論 |
---|---|---|---|
findMany (25,000レコード) | 55.0 ms | 185.0 ms | QCが3.4倍高速 |
findMany, take 2000 | 3.1 ms | 6.6 ms | QCが2.1倍高速 |
findMany with where and take 2000 | 10.8 ms | 13.3 ms | QCが1.2倍高速 |
findMany with orderBy and take 50 | 5.8 ms | 7.2 ms | QCが1.2倍高速 |
findMany with where, to-many join, and take 2000 | 72.3 ms | 92.3 ms | QCが1.3倍高速 |
findMany with where, to-many → to-one join, and take 2000 | 130.0 ms | 207.0 ms | QCが1.6倍高速 |
findMany with to-many relational filter, take 100 | 333.0 ms | 330.0 ms | Rustが1.01倍高速 |
findMany with deep relational filter, take 100 | 1.5 ms | 2.4 ms | QCが1.6倍高速 |
findMany with to-one filter, take 100 | 1.3 ms | 1.4 ms | QCが1.1倍高速 |
findMany with to-many → to-many → to-one relational filter, take 100 | 300.0 ms | 323.0 ms | QCが1.1倍高速 |
findUnique with take three of to-many join | 23.2 ms | 23.5 ms | QCが1.01倍高速 |
私たちのテストから、大量のデータセットでは、Query CompilerはRustベースのエンジンよりも一貫して高速であり、場合によっては3〜4倍高速であることがわかりました。少量のデータセットのみが返される場合、両方の実装は実質的に同じパフォーマンスを発揮します。Query Compilerは、既存のPrisma ORMユーザーにデメリットなしに大きなメリットをもたらします。
ただし、これらの例は最初のベンチマークにすぎません。これらのベンチマークを拡張し、AWS LambdaやCloudflare Workersなどの制約のある環境でも実行して、数値に自信を持てるようにする予定です。さらに、効率とメリットを追加するために、実装を継続的に改善していきます。
未来を受け入れる:Prisma ORM 7とその先
これがPrisma ORMユーザーにとって何を意味するのか、非常に楽しみにしています。画期的なパフォーマンスと削減されたバンドルサイズは、アプリをより高速かつ効率的にするだけでなく、より迅速なイノベーションも可能にします。今後数か月以内に、プレビューリリースから始めて、これらの改善を試していただく予定です。その後まもなく、Prisma ORM 7はQuery Compilerを全面的に採用し、Prismaがデータベースと通信する方法の新しい時代への移行を刻みます。
常にそうであるように、私たちの焦点はコミュニティにあり、皆様のご意見をお待ちしております!
- 最新のアップデートを入手し、GitHubで会話に参加しましょう
- Discordのdev AMAで熱い質問をお寄せください
- ベンチマークを自分で実行することもできます!
次回の投稿をお見逃しなく!
Prismaニュースレターに登録する