2025年3月3日

RustからTypeScriptへのアップデート: Prisma ORMのパフォーマンス向上

Query Compilerプロジェクトは、従来のRustエンジンをWASMモジュールとTypeScriptで構築されたより軽量なソリューションに置き換えることで、Prisma ORMをアップグレードします。この変更により、クエリパフォーマンスが向上し、バンドルサイズが85~90%削減されるだけでなく、様々なウェブフレームワークやバンドラとの互換性も改善されます。Prisma ORMがバージョン7に向けて進むにつれて、開発者はよりスムーズで効率的な体験を期待できます。

Rust to TypeScript Update: Boosting Prisma ORM Performance

パフォーマンスの障壁を打ち破る

簡単にまとめると、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)アーキテクチャは、取得されるデータ量が増えるにつれて、パフォーマンスの向上が段階的に良くなるという結果を示しています。最も重要な時にこそ高速です。

ベンチマークQCRust結論findMany (25,000 records)55.0 ms185.0 msQC 3.4倍高速findMany, take 20003.1 ms6.6 msQC 2.1倍高速findMany with where and take 200010.8 ms13.3 msQC 1.2倍高速findMany with orderBy and take 505.8 ms7.2 msQC 1.2倍高速findMany with where, to-many join, and take 200072.3 ms92.3 msQC 1.3倍高速findMany with where, to-many → to-one join, and take 2000130.0 ms207.0 msQC 1.6倍高速findMany with to-many relational filter, take 100333.0 ms330.0 msRust 1.01倍高速findMany with deep relational filter, take 1001.5 ms2.4 msQC 1.6倍高速findMany with to-one filter, take 1001.3 ms1.4 msQC 1.1倍高速findMany with to-many → to-many → to-one relational filter, take 100300.0 ms323.0 msQC 1.1倍高速findUnique with take three of to-many join23.2 ms23.5 msQC 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がデータベースと通信する方法における新時代への移行を告げることになります。

いつものように、私たちはコミュニティに焦点を当てており、皆様のご意見をお待ちしております!

次の投稿もお見逃しなく!

Prismaニュースレターを購読する

© . All rights reserved.