طبقة ترجمة الاستعلامات
يترجم Prisma مُدخلات الاستعلام إلى SQL خاص بقاعدة البيانات. يتيح ذلك سلوكًا موحّدًا عبر قواعد البيانات ودلالات واجهة Prisma، لكنه يضيف وقت معالجة قبل أن ترى قاعدة البيانات SQL.
تحب تجربة المطوّر في Prisma لكنك تحتاج عبئًا أقل على القراءة في أشكال الاستعلامات المدعومة؟ تُظهر ملفات JSON الحالية لقياسات الأداء متوسط التسريع عبر Prisma v6 وv7 وv8 لعمليات القراءة المدعومة في PostgreSQL وSQLite؛ وتتفاوت النتائج بين أشكال الاستعلامات الفردية.
const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true },
})SELECT user_t.id, user_t.email, user_t.status, COALESCE(( SELECT COALESCE(json_agg(json_build_object( 'id', posts_0.id, 'title', posts_0.title, 'authorId', posts_0."authorId" )), '[]'::json) FROM "public"."Post" posts_0 WHERE posts_0."authorId" = user_t.id ), '[]'::json) AS postsFROM "public"."User" user_tWHERE user_t.status = $1SELECT user_t.id, user_t.email, user_t.status, COALESCE(( SELECT COALESCE(json_group_array(row), json('[]')) FROM ( SELECT json_object( 'id', posts_0.id, 'title', posts_0.title, 'authorId', posts_0."authorId" ) AS row FROM "Post" posts_0 WHERE posts_0."authorId" = user_t.id ) AS posts_row_1 ), json('[]')) AS postsFROM "User" user_tWHERE user_t.status = ?createToSQL لمخطط من نموذجين، مع إضافة فواصل أسطر.فهم تطور Prisma وخصائص أدائه يوضح سبب وجود هذه الإضافة.
اتخذ Prisma اختيارات معمارية مناسبة لأهدافه: أمان الأنواع وتجربة المطوّر وسلوك موحّد عبر قواعد البيانات. لكن هذه الاختيارات تولّد عبئًا ملحوظًا عند التوسع. هذه الإضافة لا تستبدل Prisma—بل تُحسّن القراءات للفرق التي تريد DX الخاص بـPrisma مع تنفيذ أسرع حيث يهم.
أُطلق Prisma 2 في 2019 وغيّر مشهد ORM في TypeScript عبر وصول آمن بالأنواع لقاعدة البيانات وتوليد الأنواع من مخططك. قدّم Prisma بنية قائمة على محرك لترجمة الاستعلامات والتحقق منها وتقديم ضمانات كان من الصعب تحقيقها مع ORMs جافاسكربت التقليدية.
أضاف Prisma ميزات قوية مثل الكتابات المتداخلة والمعاملات وmiddleware. توسعت الميزات، لكن كل استعلام ظل يدفع كلفة معمارية: تمثيل الاستعلامات والتحقق منها وتنفيذها وتشكيل النتائج لتطابق واجهة Prisma.
مع نشر المزيد من الفرق لـPrisma في أحمال عالية المرور، أصبح العبء الثابت لكل استعلام قابلًا للقياس. يظهر ذلك بوضوح في نقاط النهاية كثيفة القراءة والتحليلات والتجميعات ومجموعات النتائج الكبيرة. هذا العبء ليس خطأً؛ بل هو كلفة ضمانات Prisma وسلوك واجهته.
أصدر Prisma تحديثات كبيرة تركز على الأداء وتغييرات المحرك. حتى مع التحسينات، تبقى هناك كلفة لا يمكن تجنبها لعمليات التحليل والتحقق والتخطيط وتشكيل النتائج مقارنة بتنفيذ SQL خام مباشرة.
تركّز هذه الإضافة على أداء القراءة. تتجاوز مسار تنفيذ القراءة في Prisma لعمليات findMany وfindFirst وfindUnique وcount وaggregate وgroupBy مع إبقاء Prisma للكتابة والترحيلات وإدارة المخطط وتوليد الأنواع. تحقّق من التوافق مع إصدار Prisma لديك قبل الإطلاق.
يترجم Prisma مُدخلات الاستعلام إلى SQL خاص بقاعدة البيانات. يتيح ذلك سلوكًا موحّدًا عبر قواعد البيانات ودلالات واجهة Prisma، لكنه يضيف وقت معالجة قبل أن ترى قاعدة البيانات SQL.
يتحقق Prisma من الاستعلامات مقابل المخطط ويفرض ضمانات على مستوى الواجهة. تمنع هذه الضمانات فئات من الأخطاء لكنها تضيف عبئًا لكل استعلام.
تُشكّل النتائج لتطابق سلوك واجهة Prisma. هذا ممتاز لتجربة المطوّر والاتساق، لكنه يضيف زمنًا، خصوصًا مع مجموعات نتائج كبيرة وincludes معقدة.
تُكمل هذه الإضافة Prisma بتوفير مسار أسرع لاستعلامات القراءة المدعومة. تحتفظ بـPrisma للمخطط والترحيلات والكتابة والأنواع المولّدة، بينما يتولى SQL المُولَّد عمليات قراءة مختارة كثيفة الاستخدام عبر عملاء قاعدة البيانات الأصلية.
مقارنة أحدث ملفات JSON لقياسات الأداء عبر Prisma v6 وv7 وv8 وDrizzle ORM وprisma-sql
Prisma v6 (6.19.3): متوسط تسريع 1.99× مقارنةً بـ Prisma
Prisma v7 (7.10.0): متوسط تسريع 1.47× مقارنةً بـ Prisma
Prisma v8 (8.1.0-dev.1): متوسط تسريع 1.54× مقارنةً بـ Prisma
Prisma v6 (6.19.3): متوسط تسريع 4.80× مقارنةً بـ Prisma
Prisma v7 (7.10.0): متوسط تسريع 2.29× مقارنةً بـ Prisma
Prisma v8 (8.1.0-dev.1): متوسط تسريع 2.10× مقارنةً بـ Prisma
مُولَّد وقت البناء من أحدث ملفات benchmark-results/*-latest.json. تتشارك الأشرطة مقياسًا واحدًا عبر قاعدتي البيانات؛ ويُميِّز اللون الكهرماني أفضل تشغيل لكل قاعدة بيانات. تتفاوت النتائج بين أشكال الاستعلامات الفردية.جدول لكل استعلامعرض بيانات القياس الكاملة
مقارنة إحصائية باستخدام اختبار t لـ Welch وحد دلالة عملية قدره 1 مللي ثانية
تعكس هذه النتائج وضع التشغيل، حيث تُحوَّل الاستعلامات إلى SQL عند كل طلب. في وضع المعالجة المسبقة، يُولَّد SQL وقت البناء — وينفّذ وقت التشغيل استعلامات خام ذات معاملات دون أي عبء تحويل.
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.529ms±0.064 | 0.231ms±0.234 | 0.271ms | ~1.00x | ≈ | 198.0% | 50 |
| findMany where = | 0.501ms±0.0069 | 0.208ms±0.0094 | 0.347ms | ~1.00x | ≈ | 15.6% | 50 |
| findMany where >= | 16.51ms±0.267 | 5.67ms±0.338 | 7.43ms | 2.91x1.31x D | *** | 21.0% | 50 |
| findMany where IN | 0.657ms±0.142 | 0.292ms±0.017 | 0.492ms | ~1.00x | ≈ | 20.3% | 50 |
| findMany where null | 0.280ms±0.020 | 0.167ms±0.012 | 0.177ms | ~1.00x | ≈ | 25.7% | 50 |
| findMany ILIKE | 0.297ms±0.0097 | 0.168ms±0.0089 | 0.278ms | ~1.00x | ≈ | 18.6% | 50 |
| findMany AND | 2.72ms±0.161 | 1.11ms±0.111 | 1.45ms | 2.45x1.31x D | *** | 31.5% | 50 |
| findMany OR | 13.98ms±0.286 | 4.69ms±0.221 | 5.88ms | 2.98x1.25x D | *** | 17.0% | 50 |
| findMany NOT | 0.639ms±0.013 | 0.274ms±0.0091 | 0.478ms | ~1.00x | ≈ | 12.2% | 50 |
| findMany orderBy | 4.50ms±0.219 | 1.48ms±0.075 | 1.76ms | 3.03x1.18x D | *** | 18.5% | 50 |
| findMany pagination | 0.342ms±0.032 | 0.171ms±0.026 | 0.295ms | ~1.00x | ≈ | 43.2% | 50 |
| findMany select | 0.294ms±0.0094 | 0.181ms±0.0072 | 0.176ms | ~1.00x | ≈ | 14.0% | 50 |
| findMany relation some | 1.69ms±0.098 | 0.999ms±0.064 | — | ~1.00x | ≈ | 22.1% | 50 |
| findMany relation every | 2.17ms±0.096 | 1.47ms±0.078 | — | ~1.00x | ≈ | 18.9% | 50 |
| findMany relation none | 26.02ms±0.517 | 10.06ms±0.511 | — | 2.59x | *** | 18.0% | 50 |
| findMany nested relation | 1.76ms±0.076 | 1.24ms±0.060 | — | ~1.00x | ≈ | 18.0% | 50 |
| findMany complex | 2.94ms±0.109 | 1.46ms±0.068 | 1.73ms | 2.01x1.18x D | *** | 17.2% | 50 |
| findFirst | 0.378ms±0.032 | 0.175ms±0.014 | 0.350ms | ~1.00x | ≈ | 28.0% | 50 |
| findFirst skip | 0.328ms±0.107 | 0.147ms±0.0064 | 0.301ms | ~1.00x | ≈ | 15.2% | 50 |
| findUnique id | 0.232ms±0.0097 | 0.102ms±0.0055 | 0.207ms | ~1.00x | ≈ | 18.6% | 50 |
| findUnique email | 0.210ms±0.0072 | 0.090ms±0.0044 | 0.179ms | ~1.00x | ≈ | 17.1% | 50 |
| count | 0.109ms±0.0033 | 0.063ms±0.0030 | 0.064ms | ~1.00x | ≈ | 16.2% | 50 |
| count where | 0.469ms±0.015 | 0.247ms±0.016 | 0.287ms | ~1.00x | ≈ | 22.2% | 50 |
| aggregate count | 0.215ms±0.0078 | 0.155ms±0.0042 | — | ~1.00x | ≈ | 9.2% | 50 |
| aggregate sum/avg | 0.305ms±0.014 | 0.261ms±0.0053 | — | ~1.00x | ≈ | 7.1% | 50 |
| aggregate where | 0.446ms±0.0100 | 0.239ms±0.0058 | — | ~1.00x | ≈ | 8.7% | 50 |
| aggregate min/max | 0.305ms±0.015 | 0.268ms±0.010 | — | ~1.00x | ≈ | 13.2% | 50 |
| aggregate complete | 0.381ms±0.0061 | 0.292ms±0.0072 | — | ~1.00x | ≈ | 8.8% | 50 |
| groupBy | 0.419ms±0.024 | 0.344ms±0.013 | — | ~1.00x | ≈ | 12.8% | 50 |
| groupBy count | 0.422ms±0.0100 | 0.358ms±0.0050 | — | ~1.00x | ≈ | 4.8% | 50 |
| groupBy multi | 0.544ms±0.013 | 0.442ms±0.052 | — | ~1.00x | ≈ | 38.9% | 50 |
| groupBy having | 0.505ms±0.011 | 0.375ms±0.0086 | — | ~1.00x | ≈ | 8.2% | 50 |
| groupBy + where | 0.550ms±0.011 | 0.294ms±0.0064 | — | ~1.00x | ≈ | 7.8% | 50 |
| _count via include | 0.679ms±0.013 | 0.511ms±0.013 | — | ~1.00x | ≈ | 8.9% | 50 |
| _count via include + relations | 1.55ms±0.037 | 0.666ms±0.017 | — | ~1.00x | ≈ | 9.3% | 50 |
| groupBy aggregates | 0.557ms±0.0097 | 0.465ms±0.0091 | — | ~1.00x | ≈ | 6.9% | 50 |
| groupBy min/max | 0.531ms±0.0080 | 0.441ms±0.0053 | — | ~1.00x | ≈ | 4.2% | 50 |
| include list + nested to-one | 1.46ms±0.029 | 0.337ms±0.032 | — | 4.32x | *** | 30.2% | 50 |
| include list + nullable to-one | 2.59ms±0.081 | 1.65ms±0.056 | — | ~1.00x | ≈ | 11.9% | 50 |
| include posts | 4.25ms±0.216 | 2.35ms±0.120 | 5.77ms | 1.81x2.45x D | *** | 18.9% | 50 |
| include profile | 0.635ms±0.871 | 0.540ms±0.241 | 0.648ms | ~1.00x | ≈ | 104.7% | 50 |
| include 3 levels | 4.48ms±0.148 | 4.03ms±0.147 | 4.58ms | ~1.00x | ≈ | 13.6% | 50 |
| include 4 levels | 5.61ms±0.182 | 3.39ms±0.132 | 4.65ms | 1.65x1.37x D | *** | 13.9% | 50 |
| include + where | 4.04ms±0.176 | 2.88ms±0.399 | 5.51ms | ~1.00x | ≈ | 46.7% | 50 |
| include + select nested | 2.52ms±0.139 | 1.96ms±0.185 | 4.42ms | ~1.00x | ≈ | 31.8% | 50 |
| findMany startsWith | 0.270ms±0.028 | 0.140ms±0.014 | 0.314ms | ~1.00x | ≈ | 35.4% | 50 |
| findMany endsWith | 0.563ms±0.015 | 0.216ms±0.0069 | 0.369ms | ~1.00x | ≈ | 11.1% | 50 |
| findMany NOT contains | 0.627ms±0.022 | 0.250ms±0.104 | 0.447ms | ~1.00x | ≈ | 121.8% | 50 |
| findMany LIKE | 0.245ms±0.0094 | 0.111ms±0.0069 | 0.250ms | ~1.00x | ≈ | 21.9% | 50 |
| findMany < | 25.55ms±0.398 | 7.55ms±0.292 | 10.60ms | 3.39x1.40x D | *** | 13.4% | 50 |
| findMany <= | 26.43ms±0.371 | 7.78ms±0.220 | 10.97ms | 3.40x1.41x D | *** | 10.2% | 50 |
| findMany > | 15.55ms±0.599 | 5.21ms±0.356 | 6.78ms | 2.99x1.30x D | *** | 24.2% | 50 |
| findMany NOT IN | 0.644ms±0.013 | 0.282ms±0.011 | 0.487ms | ~1.00x | ≈ | 13.4% | 50 |
| findMany isNot null | 0.642ms±0.014 | 0.336ms±0.017 | 0.362ms | ~1.00x | ≈ | 18.6% | 50 |
| orderBy multi-field | 4.99ms±0.190 | 1.55ms±0.076 | 1.88ms | 3.22x1.21x D | *** | 17.0% | 50 |
| orderBy relation to-one | 4.10ms±0.135 | 3.08ms±0.090 | — | 1.33x | *** | 10.2% | 50 |
| orderBy relation + scalar | 5.02ms±0.258 | 3.63ms±0.205 | — | 1.39x | *** | 20.0% | 50 |
| orderBy nullable relation | 4.08ms±0.300 | 2.94ms±0.181 | — | 1.39x | *** | 21.1% | 50 |
| orderBy deep relation | 5.43ms±0.186 | 4.04ms±0.174 | — | 1.34x | *** | 14.9% | 50 |
| orderBy deep relation + scalar | 6.34ms±0.135 | 4.62ms±0.100 | — | 1.37x | *** | 7.8% | 50 |
| distinct status | 8.84ms±0.376 | 1.56ms±0.181 | — | 5.66x | *** | 36.9% | 50 |
| distinct multi | 12.04ms±0.171 | 2.50ms±0.073 | — | 4.81x | *** | 10.3% | 50 |
| cursor composite tuple | 1.61ms±0.025 | 1.13ms±0.017 | — | ~1.00x | ≈ | 5.3% | 50 |
| cursor composite desc | 1.75ms±0.037 | 1.31ms±0.021 | — | ~1.00x | ≈ | 5.8% | 50 |
| cursor prefix of orderBy | 2.70ms±0.188 | 1.66ms±0.082 | — | 1.63x | *** | 18.1% | 50 |
| select + include | 1.60ms±0.101 | 0.309ms±0.021 | 0.568ms | 5.16x1.84x D | *** | 24.6% | 50 |
| _count relation | 1.74ms±0.341 | 1.67ms±0.781 | — | ~1.00x | ≈ | 123.8% | 50 |
| _count multi-relation | 0.257ms±0.029 | 0.218ms±0.045 | — | ~1.00x | ≈ | 62.4% | 50 |
| _count inside include | 2.32ms±0.126 | 1.55ms±0.124 | — | ~1.00x | ≈ | 32.0% | 50 |
| _count inside nested select | 4.64ms±0.202 | 3.69ms±0.266 | — | ~1.00x | ≈ | 24.3% | 50 |
| _count deep include | 5.49ms±0.247 | 3.98ms±0.158 | — | 1.38x | *** | 14.1% | 50 |
| ILIKE special chars | 0.425ms±0.033 | 0.193ms±0.022 | — | ~1.00x | ≈ | 36.5% | 50 |
| LIKE case sensitive | 0.263ms±0.010 | 0.110ms±0.0078 | — | ~1.00x | ≈ | 24.0% | 50 |
| findMany Date range | 0.424ms±0.012 | 0.190ms±0.012 | 0.321ms | ~1.00x | ≈ | 21.1% | 50 |
| count Date range | 1.14ms±0.047 | 0.925ms±0.052 | 0.995ms | ~1.00x | ≈ | 19.8% | 50 |
| findMany Date gte | 0.403ms±0.025 | 0.178ms±0.0058 | 0.303ms | ~1.00x | ≈ | 11.6% | 50 |
| depth-1 low-fan | 0.566ms±0.021 | 0.447ms±0.102 | — | ~1.00x | ≈ | 73.7% | 50 |
| depth-1 mid-fan | 4.21ms±0.110 | 2.34ms±0.178 | — | 1.80x | *** | 26.3% | 50 |
| depth-1 high-fan | 4.16ms±0.122 | 2.25ms±0.130 | — | 1.85x | *** | 20.4% | 50 |
| depth-1 wide | 3.11ms±0.114 | 1.78ms±0.166 | — | 1.75x | *** | 31.3% | 50 |
| depth-1 unbound | 39.65ms±3.78 | 9.43ms±0.884 | — | 4.21x | *** | 29.1% | 50 |
| depth-2 | 4.78ms±0.153 | 3.54ms±0.187 | — | 1.35x | *** | 18.6% | 50 |
| depth-2 paginated Project→tasks | 3.16ms±0.149 | 2.68ms±0.161 | — | ~1.00x | ≈ | 20.6% | 50 |
| depth-2 high-fan | 3.84ms±0.185 | 2.86ms±0.229 | — | ~1.00x | ≈ | 28.7% | 50 |
| depth-2 wide | 4.90ms±0.176 | 3.08ms±0.176 | — | 1.59x | *** | 20.6% | 50 |
| depth-2 unbound | 65.60ms±1.52 | 17.60ms±0.479 | — | 3.73x | *** | 4.4% | 10 |
| depth-3 unbound | 15.32ms±0.281 | 8.38ms±0.354 | — | 1.83x | *** | 15.8% | 50 |
| depth-3 paginated | 2.44ms±0.156 | 2.34ms±0.253 | — | ~1.00x | ≈ | 32.7% | 50 |
| depth-4 unbound | 9.96ms±0.268 | 6.14ms±0.266 | — | 1.62x | *** | 15.7% | 50 |
| depth-4 paginated | 3.42ms±0.161 | 2.42ms±0.175 | — | ~1.00x | ≈ | 23.6% | 50 |
| findFirst depth-2 | 2.91ms±0.114 | 2.30ms±0.173 | — | ~1.00x | ≈ | 25.9% | 50 |
| findUnique depth-2 Project→tasks→comment | 3.27ms±0.113 | 2.16ms±0.173 | — | 1.52x | *** | 27.5% | 50 |
| complex nested select | 4.51ms±0.428 | 3.01ms±0.777 | — | ~1.00x | ≈ | 65.7% | 50 |
| ultra deep query | 15.94ms±0.546 | 5.83ms±0.361 | — | 2.73x | *** | 22.0% | 50 |
| transaction: (3 operations) | 3.00ms±0.275 | 1.41ms±0.246 | — | 2.14x | *** | 53.2% | 50 |
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.274ms±0.012 | 0.223ms±0.072 | 0.252ms | ~1.00x | ≈ | 97.3% | 50 |
| findMany where = | 0.212ms±0.0047 | 0.158ms±0.0044 | 0.244ms | ~1.00x | ≈ | 9.6% | 50 |
| findMany where >= | 7.36ms±0.258 | 4.63ms±0.213 | 6.57ms | 1.59x1.42x D | *** | 16.5% | 50 |
| findMany where IN | 0.372ms±0.027 | 0.231ms±0.015 | 0.410ms | ~1.00x | ≈ | 21.1% | 50 |
| findMany where null | 0.111ms±0.084 | 0.091ms±0.0072 | 0.106ms | ~1.00x | ≈ | 26.6% | 50 |
| findMany ILIKE | 0.120ms±0.0036 | 0.088ms±0.0025 | 0.154ms | ~1.00x | ≈ | 10.0% | 50 |
| findMany AND | 0.968ms±0.013 | 0.540ms±0.093 | 0.705ms | ~1.00x | ≈ | 56.3% | 50 |
| findMany OR | 7.35ms±0.343 | 3.95ms±0.218 | 5.27ms | 1.86x1.33x D | *** | 19.1% | 50 |
| findMany NOT | 0.361ms±0.022 | 0.231ms±0.121 | 0.411ms | ~1.00x | ≈ | 149.0% | 50 |
| findMany orderBy | 2.04ms±0.073 | 0.581ms±0.022 | 0.706ms | 3.50x1.22x D | *** | 13.5% | 50 |
| findMany pagination | 0.156ms±0.0097 | 0.138ms±0.110 | 0.232ms | ~1.00x | ≈ | 201.6% | 50 |
| findMany select | 0.113ms±0.0050 | 0.120ms±0.0053 | 0.101ms | ~1.00x | ≈ | 15.6% | 50 |
| findMany relation some | 0.527ms±0.0044 | 0.404ms±0.0050 | — | ~1.00x | ≈ | 4.4% | 50 |
| findMany relation every | 0.515ms±0.0058 | 0.360ms±0.0069 | — | ~1.00x | ≈ | 7.0% | 50 |
| findMany relation none | 9.89ms±0.305 | 8.53ms±0.378 | — | 1.16x | *** | 16.7% | 50 |
| findMany nested relation | 0.578ms±0.016 | 0.392ms±0.045 | — | ~1.00x | ≈ | 38.6% | 50 |
| findMany complex | 0.799ms±0.016 | 0.461ms±0.083 | 0.587ms | ~1.00x | ≈ | 57.8% | 50 |
| findFirst | 0.132ms±0.0047 | 0.101ms±0.011 | 0.197ms | ~1.00x | ≈ | 35.7% | 50 |
| findFirst skip | 0.135ms±0.048 | 0.105ms±0.025 | 0.189ms | ~1.00x | ≈ | 64.2% | 50 |
| findUnique id | 0.107ms±0.024 | 0.070ms±0.015 | 0.130ms | ~1.00x | ≈ | 65.1% | 50 |
| findUnique email | 0.106ms±0.0050 | 0.065ms±0.0097 | 0.128ms | ~1.00x | ≈ | 47.4% | 50 |
| count | 0.079ms±0.0036 | 0.060ms±0.0028 | 0.059ms | ~1.00x | ≈ | 16.4% | 50 |
| count where | 0.398ms±0.0086 | 0.239ms±0.013 | 0.272ms | ~1.00x | ≈ | 18.4% | 50 |
| aggregate count | 0.174ms±0.0019 | 0.146ms±0.0022 | — | ~1.00x | ≈ | 5.1% | 50 |
| aggregate sum/avg | 0.265ms±0.0033 | 0.248ms±0.0033 | — | ~1.00x | ≈ | 5.0% | 50 |
| aggregate where | 0.369ms±0.0047 | 0.229ms±0.0030 | — | ~1.00x | ≈ | 4.7% | 50 |
| aggregate min/max | 0.256ms±0.0036 | 0.247ms±0.0030 | — | ~1.00x | ≈ | 4.6% | 50 |
| aggregate complete | 0.325ms±0.0036 | 0.284ms±0.0033 | — | ~1.00x | ≈ | 4.3% | 50 |
| groupBy | 0.360ms±0.022 | 0.349ms±0.0072 | — | ~1.00x | ≈ | 7.4% | 50 |
| groupBy count | 0.368ms±0.0072 | 0.359ms±0.012 | — | ~1.00x | ≈ | 11.7% | 50 |
| groupBy multi | 0.460ms±0.0089 | 0.453ms±0.016 | — | ~1.00x | ≈ | 12.3% | 50 |
| groupBy having | 0.432ms±0.0075 | 0.409ms±0.050 | — | ~1.00x | ≈ | 41.0% | 50 |
| groupBy + where | 0.425ms±0.0030 | 0.278ms±0.0039 | — | ~1.00x | ≈ | 5.0% | 50 |
| _count via include | 0.606ms±0.0055 | 0.533ms±0.012 | — | ~1.00x | ≈ | 7.8% | 50 |
| _count via include + relations | 1.16ms±0.011 | 0.635ms±0.0091 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy aggregates | 0.479ms±0.0064 | 0.465ms±0.0044 | — | ~1.00x | ≈ | 3.4% | 50 |
| groupBy min/max | 0.462ms±0.051 | 0.452ms±0.0044 | — | ~1.00x | ≈ | 3.6% | 50 |
| include list + nested to-one | 0.941ms±0.015 | 0.324ms±0.013 | — | ~1.00x | ≈ | 13.8% | 50 |
| include list + nullable to-one | 1.29ms±0.196 | 1.53ms±0.027 | — | ~1.00x | ≈ | 6.2% | 50 |
| include posts | 1.36ms±0.143 | 1.29ms±0.111 | 2.55ms | ~1.00x | ≈ | 29.7% | 50 |
| include profile | 0.316ms±0.027 | 0.248ms±0.029 | 0.462ms | ~1.00x | ≈ | 35.6% | 50 |
| include 3 levels | 1.80ms±0.210 | 1.92ms±0.190 | 2.50ms | ~1.00x | ≈ | 32.2% | 50 |
| include 4 levels | 5.99ms±0.553 | 4.24ms±0.269 | 5.54ms | 1.41x1.31x D | *** | 22.9% | 50 |
| include + where | 2.43ms±0.202 | 2.31ms±0.251 | 1.58ms | ~1.00x | ≈ | 35.6% | 50 |
| include + select nested | 1.90ms±0.238 | 2.15ms±0.330 | 4.86ms | ~1.00x | ≈ | 52.6% | 50 |
| findMany startsWith | 0.124ms±0.011 | 0.089ms±0.0075 | 0.183ms | ~1.00x | ≈ | 27.5% | 50 |
| findMany endsWith | 0.235ms±0.011 | 0.165ms±0.0036 | 0.252ms | ~1.00x | ≈ | 8.0% | 50 |
| findMany NOT contains | 0.218ms±0.0069 | 0.158ms±0.0047 | 0.234ms | ~1.00x | ≈ | 10.7% | 50 |
| findMany LIKE | 0.081ms±0.0039 | 0.051ms±0.0022 | 0.103ms | ~1.00x | ≈ | 14.9% | 50 |
| findMany < | 10.36ms±0.265 | 6.60ms±0.759 | 8.31ms | 1.57x1.26x D | *** | 37.6% | 50 |
| findMany <= | 11.00ms±0.608 | 6.71ms±0.552 | 8.80ms | 1.64x1.31x D | *** | 28.2% | 50 |
| findMany > | 7.08ms±0.345 | 4.40ms±0.411 | 6.08ms | 1.61x1.38x D | *** | 30.2% | 50 |
| findMany NOT IN | 0.381ms±0.064 | 0.241ms±0.042 | 0.437ms | ~1.00x | ≈ | 55.8% | 50 |
| findMany isNot null | 0.212ms±0.011 | 0.168ms±0.011 | 0.197ms | ~1.00x | ≈ | 22.0% | 50 |
| orderBy multi-field | 2.04ms±0.039 | 0.560ms±0.016 | 0.662ms | 3.64x1.18x D | *** | 10.1% | 50 |
| orderBy relation to-one | 1.87ms±0.049 | 1.39ms±0.052 | — | ~1.00x | ≈ | 13.0% | 50 |
| orderBy relation + scalar | 1.95ms±0.057 | 1.46ms±0.057 | — | ~1.00x | ≈ | 13.4% | 50 |
| orderBy nullable relation | 1.59ms±0.032 | 1.15ms±0.018 | — | ~1.00x | ≈ | 5.8% | 50 |
| orderBy deep relation | 2.09ms±0.121 | 1.61ms±0.072 | — | ~1.00x | ≈ | 15.3% | 50 |
| orderBy deep relation + scalar | 2.61ms±0.124 | 2.10ms±0.305 | — | ~1.00x | ≈ | 45.9% | 50 |
| distinct status | 7.73ms±0.274 | 1.28ms±0.051 | — | 6.03x | *** | 13.9% | 50 |
| distinct multi | 11.00ms±0.363 | 2.54ms±0.220 | — | 4.33x | *** | 28.5% | 50 |
| cursor composite tuple | 1.39ms±0.0067 | 1.09ms±0.0078 | — | ~1.00x | ≈ | 2.5% | 50 |
| cursor composite desc | 1.84ms±0.114 | 1.45ms±0.080 | — | ~1.00x | ≈ | 18.9% | 50 |
| cursor prefix of orderBy | 2.61ms±0.123 | 2.01ms±0.099 | — | ~1.00x | ≈ | 17.7% | 50 |
| select + include | 1.06ms±0.039 | 0.335ms±0.022 | 0.594ms | ~1.00x | ≈ | 22.8% | 50 |
| _count relation | 1.66ms±0.123 | 1.80ms±0.107 | — | ~1.00x | ≈ | 22.1% | 50 |
| _count multi-relation | 0.737ms±0.041 | 0.715ms±0.041 | — | ~1.00x | ≈ | 20.0% | 50 |
| _count inside include | 4.12ms±0.256 | 2.85ms±0.151 | — | 1.45x | *** | 19.5% | 50 |
| _count inside nested select | 1.54ms±0.078 | 1.45ms±0.091 | — | ~1.00x | ≈ | 21.3% | 50 |
| _count deep include | 2.19ms±0.135 | 1.76ms±0.083 | — | ~1.00x | ≈ | 16.0% | 50 |
| ILIKE special chars | 0.184ms±0.028 | 0.139ms±0.025 | — | ~1.00x | ≈ | 52.5% | 50 |
| LIKE case sensitive | 0.135ms±0.0061 | 0.099ms±0.0044 | — | ~1.00x | ≈ | 15.2% | 50 |
| findMany Date range | 0.150ms±0.0067 | 0.113ms±0.0055 | 0.205ms | ~1.00x | ≈ | 16.7% | 50 |
| count Date range | 0.353ms±0.0050 | 0.316ms±0.0047 | 0.343ms | ~1.00x | ≈ | 5.4% | 50 |
| findMany Date gte | 0.145ms±0.0078 | 0.105ms±0.0067 | 0.177ms | ~1.00x | ≈ | 21.7% | 50 |
| depth-1 low-fan | 0.211ms±0.049 | 0.155ms±0.029 | — | ~1.00x | ≈ | 55.6% | 50 |
| depth-1 mid-fan | 1.03ms±0.123 | 0.959ms±0.142 | — | ~1.00x | ≈ | 47.4% | 50 |
| depth-1 high-fan | 0.840ms±0.107 | 0.791ms±0.011 | — | ~1.00x | ≈ | 4.7% | 50 |
| depth-1 wide | 0.789ms±0.120 | 0.826ms±0.037 | — | ~1.00x | ≈ | 15.5% | 50 |
| depth-1 unbound | 17.14ms±0.884 | 8.82ms±0.673 | — | 1.94x | *** | 25.0% | 50 |
| depth-2 | 3.76ms±0.234 | 3.72ms±0.175 | — | ~1.00x | ≈ | 17.0% | 50 |
| depth-2 paginated Project→tasks | 2.36ms±0.296 | 2.73ms±0.275 | — | ~1.00x | ≈ | 40.8% | 50 |
| depth-2 high-fan | 3.13ms±0.208 | 3.08ms±0.108 | — | ~1.00x | ≈ | 12.4% | 50 |
| depth-2 wide | 3.11ms±0.244 | 3.16ms±0.207 | — | ~1.00x | ≈ | 22.5% | 50 |
| depth-2 unbound | 30.14ms±1.02 | 17.11ms±0.944 | — | 1.76x | *** | 19.2% | 50 |
| depth-3 unbound | 10.80ms±0.443 | 8.68ms±0.371 | — | 1.25x | *** | 15.1% | 50 |
| depth-3 paginated | 1.19ms±0.112 | 1.10ms±0.105 | — | ~1.00x | ≈ | 31.3% | 50 |
| depth-4 unbound | 4.88ms±0.333 | 4.59ms±0.360 | — | ~1.00x | ≈ | 28.9% | 50 |
| depth-4 paginated | 1.31ms±0.047 | 0.976ms±0.068 | — | ~1.00x | ≈ | 23.6% | 50 |
| findFirst depth-2 | 0.853ms±0.024 | 0.831ms±0.078 | — | ~1.00x | ≈ | 31.1% | 50 |
| findUnique depth-2 Project→tasks→comment | 0.846ms±0.093 | 0.727ms±0.021 | — | ~1.00x | ≈ | 9.8% | 50 |
| complex nested select | 2.88ms±0.093 | 1.82ms±0.035 | — | 1.58x | *** | 6.9% | 50 |
| ultra deep query | 11.34ms±0.241 | 7.04ms±0.089 | — | 1.61x | *** | 4.5% | 50 |
| transaction: (3 operations) | 3.29ms±0.313 | 1.56ms±0.311 | — | 2.12x | *** | 62.9% | 50 |
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.279ms±0.016 | 0.236ms±0.024 | 0.275ms | ~1.00x | ≈ | 32.6% | 50 |
| findMany where = | 0.362ms±0.186 | 0.245ms±0.075 | 0.413ms | ~1.00x | ≈ | 89.0% | 50 |
| findMany where >= | 8.32ms±0.363 | 4.81ms±0.542 | 6.99ms | 1.73x1.45x D | *** | 37.4% | 50 |
| findMany where IN | 0.383ms±0.014 | 0.254ms±0.011 | 0.420ms | ~1.00x | ≈ | 14.9% | 50 |
| findMany where null | 0.166ms±0.013 | 0.137ms±0.084 | 0.150ms | ~1.00x | ≈ | 166.4% | 50 |
| findMany ILIKE | 0.115ms±0.0053 | 0.083ms±0.0033 | 0.146ms | ~1.00x | ≈ | 14.0% | 50 |
| findMany AND | 0.973ms±0.077 | 0.550ms±0.043 | 0.713ms | ~1.00x | ≈ | 26.8% | 50 |
| findMany OR | 7.35ms±0.505 | 4.16ms±0.242 | 5.12ms | 1.77x1.23x D | *** | 20.6% | 50 |
| findMany NOT | 0.505ms±0.102 | 0.273ms±0.017 | 0.521ms | ~1.00x | ≈ | 21.2% | 50 |
| findMany orderBy | 3.11ms±0.101 | 1.12ms±0.072 | 1.32ms | 2.78x1.18x D | *** | 24.9% | 50 |
| findMany pagination | 0.167ms±0.0100 | 0.135ms±0.013 | 0.246ms | ~1.00x | ≈ | 31.6% | 50 |
| findMany select | 0.117ms±0.138 | 0.119ms±0.0083 | 0.101ms | ~1.00x | ≈ | 23.5% | 50 |
| findMany relation some | 0.543ms±0.025 | 0.389ms±0.019 | — | ~1.00x | ≈ | 16.4% | 50 |
| findMany relation every | 0.551ms±0.0078 | 0.388ms±0.0069 | — | ~1.00x | ≈ | 6.3% | 50 |
| findMany relation none | 10.52ms±0.391 | 8.40ms±0.373 | — | 1.25x | *** | 16.8% | 50 |
| findMany nested relation | 0.558ms±0.011 | 0.371ms±0.0069 | — | ~1.00x | ≈ | 6.7% | 50 |
| findMany complex | 0.769ms±0.020 | 0.451ms±0.0089 | 0.584ms | ~1.00x | ≈ | 7.1% | 50 |
| findFirst | 0.135ms±0.0072 | 0.101ms±0.0039 | 0.195ms | ~1.00x | ≈ | 13.3% | 50 |
| findFirst skip | 0.110ms±0.0072 | 0.077ms±0.0033 | 0.151ms | ~1.00x | ≈ | 15.7% | 50 |
| findUnique id | 0.103ms±0.0028 | 0.065ms±0.0014 | 0.127ms | ~1.00x | ≈ | 8.2% | 50 |
| findUnique email | 0.099ms±0.0025 | 0.066ms±0.0028 | 0.125ms | ~1.00x | ≈ | 14.9% | 50 |
| count | 0.081ms±0.0039 | 0.062ms±0.0019 | 0.061ms | ~1.00x | ≈ | 11.1% | 50 |
| count where | 0.381ms±0.0086 | 0.241ms±0.0036 | 0.273ms | ~1.00x | ≈ | 5.5% | 50 |
| aggregate count | 0.178ms±0.0033 | 0.148ms±0.0025 | — | ~1.00x | ≈ | 5.9% | 50 |
| aggregate sum/avg | 0.268ms±0.0050 | 0.250ms±0.0033 | — | ~1.00x | ≈ | 4.6% | 50 |
| aggregate where | 0.369ms±0.0039 | 0.237ms±0.0033 | — | ~1.00x | ≈ | 5.2% | 50 |
| aggregate min/max | 0.263ms±0.0039 | 0.252ms±0.0036 | — | ~1.00x | ≈ | 5.1% | 50 |
| aggregate complete | 0.331ms±0.011 | 0.294ms±0.065 | — | ~1.00x | ≈ | 70.0% | 50 |
| groupBy | 0.346ms±0.0061 | 0.337ms±0.0047 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy count | 0.367ms±0.0047 | 0.355ms±0.0047 | — | ~1.00x | ≈ | 4.8% | 50 |
| groupBy multi | 0.463ms±0.0091 | 0.442ms±0.010 | — | ~1.00x | ≈ | 8.1% | 50 |
| groupBy having | 0.407ms±0.017 | 0.379ms±0.013 | — | ~1.00x | ≈ | 11.7% | 50 |
| groupBy + where | 0.393ms±0.016 | 0.257ms±0.0064 | — | ~1.00x | ≈ | 8.6% | 50 |
| _count via include | 0.564ms±0.013 | 0.484ms±0.0097 | — | ~1.00x | ≈ | 7.1% | 50 |
| _count via include + relations | 1.19ms±0.089 | 0.657ms±0.016 | — | ~1.00x | ≈ | 8.8% | 50 |
| groupBy aggregates | 0.462ms±0.013 | 0.455ms±0.0075 | — | ~1.00x | ≈ | 5.9% | 50 |
| groupBy min/max | 0.454ms±0.0050 | 0.446ms±0.0058 | — | ~1.00x | ≈ | 4.8% | 50 |
| include list + nested to-one | 0.967ms±0.060 | 0.339ms±0.014 | — | ~1.00x | ≈ | 14.2% | 50 |
| include list + nullable to-one | 1.33ms±0.110 | 1.64ms±0.096 | — | ~1.00x | ≈ | 20.4% | 50 |
| include posts | 1.24ms±0.160 | 1.21ms±0.116 | 2.31ms | ~1.00x | ≈ | 30.5% | 50 |
| include profile | 0.373ms±0.031 | 0.287ms±0.039 | 0.519ms | ~1.00x | ≈ | 38.7% | 50 |
| include 3 levels | 2.78ms±0.435 | 2.80ms±0.203 | 3.36ms | ~1.00x | ≈ | 29.4% | 50 |
| include 4 levels | 1.64ms±0.609 | 1.36ms±0.245 | 1.83ms | ~1.00x | ≈ | 47.0% | 50 |
| include + where | 1.84ms±0.089 | 1.76ms±0.172 | 4.45ms | ~1.00x | ≈ | 34.6% | 50 |
| include + select nested | 0.957ms±0.165 | 1.02ms±0.161 | 2.90ms | ~1.00x | ≈ | 43.0% | 50 |
| findMany startsWith | 0.127ms±0.011 | 0.097ms±0.0061 | 0.194ms | ~1.00x | ≈ | 21.8% | 50 |
| findMany endsWith | 0.260ms±0.0094 | 0.189ms±0.080 | 0.295ms | ~1.00x | ≈ | 119.6% | 50 |
| findMany NOT contains | 0.225ms±0.0058 | 0.165ms±0.0030 | 0.242ms | ~1.00x | ≈ | 6.3% | 50 |
| findMany LIKE | 0.090ms±0.0061 | 0.061ms±0.0042 | 0.121ms | ~1.00x | ≈ | 24.6% | 50 |
| findMany < | 11.95ms±1.04 | 6.55ms±0.246 | 8.71ms | 1.82x1.33x D | *** | 13.2% | 50 |
| findMany <= | 12.08ms±1.58 | 6.74ms±0.432 | 8.73ms | 1.79x1.30x D | *** | 21.8% | 50 |
| findMany > | 7.81ms±0.481 | 4.60ms±0.239 | 5.86ms | 1.70x1.27x D | *** | 18.7% | 50 |
| findMany NOT IN | 0.358ms±0.077 | 0.226ms±0.013 | 0.391ms | ~1.00x | ≈ | 19.2% | 50 |
| findMany isNot null | 0.283ms±0.012 | 0.229ms±0.0094 | 0.253ms | ~1.00x | ≈ | 15.5% | 50 |
| orderBy multi-field | 1.88ms±0.042 | 0.522ms±0.071 | 0.590ms | 3.60x1.13x D | *** | 46.1% | 50 |
| orderBy relation to-one | 1.69ms±0.021 | 1.29ms±0.031 | — | ~1.00x | ≈ | 8.5% | 50 |
| orderBy relation + scalar | 2.69ms±0.218 | 2.05ms±0.176 | — | ~1.00x | ≈ | 30.7% | 50 |
| orderBy nullable relation | 1.59ms±0.198 | 1.15ms±0.027 | — | ~1.00x | ≈ | 8.3% | 50 |
| orderBy deep relation | 1.91ms±0.018 | 1.50ms±0.013 | — | ~1.00x | ≈ | 3.1% | 50 |
| orderBy deep relation + scalar | 2.33ms±0.124 | 1.90ms±0.085 | — | ~1.00x | ≈ | 14.8% | 50 |
| distinct status | 7.76ms±0.096 | 1.30ms±0.091 | — | 5.98x | *** | 24.1% | 50 |
| distinct multi | 11.01ms±0.071 | 2.47ms±0.035 | — | 4.45x | *** | 5.1% | 50 |
| cursor composite tuple | 1.45ms±0.016 | 1.13ms±0.018 | — | ~1.00x | ≈ | 5.7% | 50 |
| cursor composite desc | 1.59ms±0.0100 | 1.27ms±0.0100 | — | ~1.00x | ≈ | 2.8% | 50 |
| cursor prefix of orderBy | 1.53ms±0.251 | 1.17ms±0.167 | — | ~1.00x | ≈ | 40.3% | 50 |
| select + include | 0.619ms±0.015 | 0.206ms±0.013 | 0.370ms | ~1.00x | ≈ | 21.4% | 50 |
| _count relation | 0.581ms±0.0050 | 0.596ms±0.0055 | — | ~1.00x | ≈ | 3.4% | 50 |
| _count multi-relation | 0.193ms±0.0069 | 0.183ms±0.0044 | — | ~1.00x | ≈ | 8.4% | 50 |
| _count inside include | 0.910ms±0.020 | 0.633ms±0.013 | — | ~1.00x | ≈ | 7.3% | 50 |
| _count inside nested select | 1.37ms±0.020 | 1.18ms±0.017 | — | ~1.00x | ≈ | 5.1% | 50 |
| _count deep include | 1.52ms±0.015 | 1.20ms±0.020 | — | ~1.00x | ≈ | 5.9% | 50 |
| ILIKE special chars | 0.148ms±0.0053 | 0.120ms±0.0042 | — | ~1.00x | ≈ | 11.8% | 50 |
| LIKE case sensitive | 0.117ms±0.0028 | 0.087ms±0.0019 | — | ~1.00x | ≈ | 7.4% | 50 |
| findMany Date range | 1.28ms±0.012 | 0.139ms±0.032 | 0.549ms | 9.27x3.96x D | *** | 62.7% | 50 |
| count Date range | 0.389ms±0.0064 | 0.349ms±0.0067 | 0.409ms | ~1.00x | ≈ | 6.9% | 50 |
| findMany Date gte | 0.169ms±0.0039 | 0.130ms±0.0028 | 0.227ms | ~1.00x | ≈ | 7.8% | 50 |
| depth-1 low-fan | 0.199ms±0.0050 | 0.133ms±0.0036 | — | ~1.00x | ≈ | 9.8% | 50 |
| depth-1 mid-fan | 0.997ms±0.103 | 0.915ms±0.073 | — | ~1.00x | ≈ | 27.5% | 50 |
| depth-1 high-fan | 0.904ms±0.102 | 0.890ms±0.109 | — | ~1.00x | ≈ | 41.3% | 50 |
| depth-1 wide | 0.857ms±0.091 | 0.925ms±0.019 | — | ~1.00x | ≈ | 7.4% | 50 |
| depth-1 unbound | 17.36ms±0.533 | 9.64ms±0.963 | — | 1.80x | *** | 31.6% | 50 |
| depth-2 | 2.64ms±0.122 | 2.78ms±0.226 | — | ~1.00x | ≈ | 28.5% | 50 |
| depth-2 paginated Project→tasks | 0.991ms±0.075 | 1.17ms±0.112 | — | ~1.00x | ≈ | 31.1% | 50 |
| depth-2 high-fan | 1.31ms±0.145 | 1.32ms±0.096 | — | ~1.00x | ≈ | 22.5% | 50 |
| depth-2 wide | 2.47ms±0.216 | 2.45ms±0.193 | — | ~1.00x | ≈ | 25.7% | 50 |
| depth-2 unbound | 28.05ms±0.484 | 15.71ms±0.461 | — | 1.79x | *** | 10.5% | 50 |
| depth-3 unbound | 8.51ms±0.281 | 7.07ms±0.491 | — | 1.20x | *** | 24.1% | 50 |
| depth-3 paginated | 1.68ms±0.183 | 1.64ms±0.160 | — | ~1.00x | ≈ | 31.7% | 50 |
| depth-4 unbound | 6.55ms±0.301 | 6.09ms±0.342 | — | ~1.00x | ≈ | 19.7% | 50 |
| depth-4 paginated | 1.43ms±0.162 | 1.18ms±0.192 | — | ~1.00x | ≈ | 47.1% | 50 |
| findFirst depth-2 | 0.987ms±0.094 | 0.971ms±0.019 | — | ~1.00x | ≈ | 7.1% | 50 |
| findUnique depth-2 Project→tasks→comment | 1.53ms±0.135 | 1.39ms±0.062 | — | ~1.00x | ≈ | 15.8% | 50 |
| complex nested select | 3.37ms±0.296 | 2.05ms±0.185 | — | 1.64x | *** | 27.8% | 50 |
| ultra deep query | 12.44ms±0.689 | 7.71ms±0.293 | — | 1.61x | *** | 13.2% | 50 |
| transaction: (3 operations) | 10.90ms±0.134 | 9.07ms±0.081 | — | 1.20x | *** | 3.2% | 50 |
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.449ms±0.019 | 0.070ms±0.0083 | 0.116ms | ~1.00x | ≈ | 37.1% | 50 |
| findMany where = | 0.380ms±0.0075 | 0.055ms±0.0025 | 0.093ms | ~1.00x | ≈ | 15.4% | 50 |
| findMany where >= | 13.30ms±0.272 | 1.33ms±0.039 | 2.14ms | 10.03x1.61x D | *** | 10.3% | 50 |
| findMany where IN | 0.432ms±0.012 | 0.063ms±0.0033 | 0.114ms | ~1.00x | ≈ | 18.2% | 50 |
| findMany where null | 0.167ms±0.0047 | 0.025ms±0.0030 | 0.057ms | ~1.00x | ≈ | 37.9% | 50 |
| findMany AND | 1.55ms±0.141 | 0.302ms±0.041 | 0.424ms | 5.12x1.40x D | *** | 42.4% | 50 |
| findMany OR | 10.21ms±0.128 | 1.12ms±0.023 | 1.80ms | 9.12x1.61x D | *** | 7.5% | 50 |
| findMany NOT | 0.436ms±0.017 | 0.055ms±0.0033 | 0.103ms | ~1.00x | ≈ | 20.5% | 50 |
| findMany orderBy | 2.37ms±0.033 | 1.83ms±0.021 | 1.88ms | ~1.00x | ≈ | 4.1% | 50 |
| findMany pagination | 0.147ms±0.012 | 0.037ms±0.0028 | 0.066ms | ~1.00x | ≈ | 24.7% | 50 |
| findMany select | 0.173ms±0.0044 | 0.047ms±0.0019 | 0.041ms | ~1.00x | ≈ | 15.2% | 50 |
| findMany relation some | 4.56ms±0.020 | 0.446ms±0.0094 | — | 10.21x | *** | 7.5% | 50 |
| findMany relation every | 9.74ms±0.108 | 6.35ms±0.059 | — | 1.53x | *** | 3.3% | 50 |
| findMany relation none | 169.69ms±3.84 | 2.81ms±0.108 | — | 60.47x | *** | 6.0% | 10 |
| findMany nested relation | 1.04ms±0.018 | 0.316ms±0.022 | — | ~1.00x | ≈ | 23.5% | 50 |
| findMany complex | 0.814ms±0.084 | 0.405ms±0.0086 | 0.454ms | ~1.00x | ≈ | 7.4% | 50 |
| findFirst | 0.163ms±0.021 | 0.035ms±0.0072 | 0.074ms | ~1.00x | ≈ | 59.4% | 50 |
| findFirst skip | 0.184ms±0.126 | 0.036ms±0.0083 | 0.081ms | ~1.00x | ≈ | 66.4% | 50 |
| findUnique id | 0.134ms±0.0033 | 0.032ms±0.0017 | 0.059ms | ~1.00x | ≈ | 17.1% | 50 |
| findUnique email | 0.123ms±0.0017 | 0.029ms±0.0008 | 0.056ms | ~1.00x | ≈ | 10.5% | 50 |
| count | 0.068ms±0.0019 | 0.016ms±0.0008 | 0.019ms | ~1.00x | ≈ | 18.3% | 50 |
| count where | 0.268ms±0.0025 | 0.164ms±0.0019 | 0.169ms | ~1.00x | ≈ | 4.2% | 50 |
| _count via include | 0.537ms±0.0067 | 0.232ms±0.0061 | — | ~1.00x | ≈ | 9.4% | 50 |
| _count via include + relations | 1.06ms±0.0055 | 0.276ms±0.0055 | — | ~1.00x | ≈ | 7.2% | 50 |
| aggregate count | 0.144ms±0.0044 | 0.027ms±0.0017 | — | ~1.00x | ≈ | 20.4% | 50 |
| aggregate sum/avg | 0.274ms±0.0022 | 0.168ms±0.0019 | — | ~1.00x | ≈ | 4.1% | 50 |
| aggregate where | 0.262ms±0.0025 | 0.166ms±0.0030 | — | ~1.00x | ≈ | 6.5% | 50 |
| aggregate min/max | 0.306ms±0.0022 | 0.175ms±0.0025 | — | ~1.00x | ≈ | 5.1% | 50 |
| aggregate complete | 0.390ms±0.0025 | 0.234ms±0.0028 | — | ~1.00x | ≈ | 4.4% | 50 |
| groupBy | 0.572ms±0.0089 | 0.454ms±0.0061 | — | ~1.00x | ≈ | 4.8% | 50 |
| groupBy count | 0.567ms±0.0061 | 0.453ms±0.0047 | — | ~1.00x | ≈ | 3.8% | 50 |
| groupBy multi | 1.17ms±0.0072 | 0.971ms±0.0075 | — | ~1.00x | ≈ | 2.8% | 50 |
| groupBy having | 0.635ms±0.0091 | 0.485ms±0.0047 | — | ~1.00x | ≈ | 3.5% | 50 |
| groupBy + where | 0.325ms±0.065 | 0.204ms±0.0036 | — | ~1.00x | ≈ | 6.2% | 50 |
| groupBy aggregates | 0.703ms±0.0078 | 0.578ms±0.0044 | — | ~1.00x | ≈ | 2.8% | 50 |
| groupBy min/max | 0.718ms±0.0055 | 0.583ms±0.0036 | — | ~1.00x | ≈ | 2.2% | 50 |
| include posts | 2.00ms±0.041 | 0.421ms±0.021 | 1.34ms | 4.75x3.18x D | *** | 16.9% | 50 |
| include profile | 0.333ms±0.0097 | 0.066ms±0.0022 | 0.191ms | ~1.00x | ≈ | 11.9% | 50 |
| include 3 levels | 1.11ms±0.032 | 0.642ms±0.0064 | 0.817ms | ~1.00x | ≈ | 3.6% | 50 |
| include 4 levels | 1.14ms±0.0075 | 0.423ms±0.0050 | 0.634ms | ~1.00x | ≈ | 4.1% | 50 |
| include + where | 0.777ms±0.021 | 0.289ms±0.0058 | 0.271ms | ~1.00x | ≈ | 7.1% | 50 |
| include + select nested | 0.778ms±0.026 | 0.317ms±0.0067 | 0.953ms | ~1.00x | ≈ | 7.5% | 50 |
| findMany startsWith | 0.157ms±0.0064 | 0.035ms±0.0014 | 0.059ms | ~1.00x | ≈ | 14.2% | 50 |
| findMany endsWith | 0.459ms±0.0064 | 0.067ms±0.0022 | 0.106ms | ~1.00x | ≈ | 11.1% | 50 |
| findMany NOT contains | 0.455ms±0.058 | 0.054ms±0.0019 | 0.095ms | ~1.00x | ≈ | 11.6% | 50 |
| findMany LIKE | 0.156ms±0.0022 | 0.034ms±0.0017 | 0.057ms | ~1.00x | ≈ | 17.2% | 50 |
| findMany < | 21.45ms±0.104 | 2.21ms±0.316 | 3.56ms | 9.69x1.61x D | *** | 41.4% | 50 |
| findMany <= | 22.25ms±0.096 | 2.23ms±0.235 | 3.69ms | 9.96x1.65x D | *** | 33.3% | 50 |
| findMany > | 11.74ms±0.116 | 1.15ms±0.161 | 1.92ms | 10.21x1.67x D | *** | 45.5% | 50 |
| findMany NOT IN | 0.444ms±0.014 | 0.058ms±0.011 | 0.115ms | ~1.00x | ≈ | 56.6% | 50 |
| findMany isNot null | 0.426ms±0.0055 | 0.051ms±0.0017 | 0.093ms | ~1.00x | ≈ | 11.6% | 50 |
| orderBy multi-field | 0.671ms±0.069 | 0.350ms±0.0064 | 0.402ms | ~1.00x | ≈ | 6.5% | 50 |
| orderBy relation to-one | 0.641ms±0.0055 | 0.319ms±0.0086 | — | ~1.00x | ≈ | 9.4% | 50 |
| orderBy relation + scalar | 0.714ms±0.0055 | 0.391ms±0.0039 | — | ~1.00x | ≈ | 3.7% | 50 |
| orderBy nullable relation | 0.608ms±0.0069 | 0.321ms±0.0025 | — | ~1.00x | ≈ | 2.7% | 50 |
| orderBy deep relation | 0.710ms±0.0086 | 0.380ms±0.0044 | — | ~1.00x | ≈ | 4.3% | 50 |
| orderBy deep relation + scalar | 1.10ms±0.010 | 0.694ms±0.0078 | — | ~1.00x | ≈ | 4.0% | 50 |
| distinct status | 10.99ms±0.072 | 4.09ms±0.035 | — | 2.68x | *** | 3.0% | 50 |
| distinct multi | 12.12ms±0.092 | 4.96ms±0.013 | — | 2.44x | *** | 1.0% | 50 |
| select + include | 0.537ms±0.0061 | 0.066ms±0.0028 | 0.133ms | ~1.00x | ≈ | 14.1% | 50 |
| _count relation | 0.611ms±0.0061 | 0.353ms±0.0039 | — | ~1.00x | ≈ | 3.9% | 50 |
| _count multi-relation | 0.132ms±0.0061 | 0.045ms±0.0036 | — | ~1.00x | ≈ | 25.1% | 50 |
| _count inside include | 0.861ms±0.0078 | 0.341ms±0.0058 | — | ~1.00x | ≈ | 6.1% | 50 |
| _count inside nested select | 1.54ms±0.010 | 0.587ms±0.0072 | — | ~1.00x | ≈ | 4.5% | 50 |
| _count deep include | 1.33ms±0.0083 | 0.730ms±0.0089 | — | ~1.00x | ≈ | 4.3% | 50 |
| findMany Date range | 0.259ms±0.0042 | 0.051ms±0.0014 | 0.230ms | ~1.00x | ≈ | 9.3% | 50 |
| count Date range | 0.303ms±0.0050 | 0.180ms±0.0025 | 0.182ms | ~1.00x | ≈ | 5.1% | 50 |
| findMany Date gte | 0.242ms±0.0033 | 0.049ms±0.0019 | 0.102ms | ~1.00x | ≈ | 13.1% | 50 |
| depth-1 low-fan Project→labels | 0.257ms±0.0067 | 0.069ms±0.0042 | — | ~1.00x | ≈ | 19.7% | 50 |
| depth-1 mid-fan Project→tasks | 1.91ms±0.022 | 0.367ms±0.0083 | — | 5.21x | *** | 8.0% | 50 |
| depth-1 high-fan User→assignedTasks | 1.65ms±0.062 | 0.332ms±0.0086 | — | 4.96x | *** | 9.2% | 50 |
| depth-1 wide | 1.43ms±0.053 | 0.337ms±0.0061 | — | 4.25x | *** | 6.6% | 50 |
| depth-1 no-limit Project→tasks | 33.39ms±0.407 | 3.56ms±0.378 | — | 9.39x | *** | 34.4% | 50 |
| depth-2 | 1.77ms±0.045 | 0.471ms±0.012 | — | 3.76x | *** | 9.4% | 50 |
| depth-2 paginated | 0.896ms±0.0086 | 0.663ms±0.0067 | — | ~1.00x | ≈ | 3.6% | 50 |
| depth-2 high-fan | 1.56ms±0.034 | 0.416ms±0.012 | — | 3.76x | *** | 9.8% | 50 |
| depth-2 wide+attach+activity | 1.86ms±0.031 | 0.532ms±0.013 | — | 3.49x | *** | 8.4% | 50 |
| depth-2 no-limit | 49.34ms±0.687 | 6.75ms±0.300 | — | 7.31x | *** | 7.2% | 10 |
| depth-3 | 9.70ms±0.121 | 1.55ms±0.032 | — | 6.25x | *** | 7.3% | 50 |
| depth-3 paginated | 1.07ms±0.0094 | 0.604ms±0.0067 | — | ~1.00x | ≈ | 4.0% | 50 |
| depth-4 | 5.66ms±0.217 | 1.04ms±0.038 | — | 5.44x | *** | 12.8% | 50 |
| depth-4 paginated | 1.12ms±0.079 | 0.418ms±0.0067 | — | ~1.00x | ≈ | 5.6% | 50 |
| findFirst depth-2 | 0.906ms±0.0080 | 0.285ms±0.0083 | — | ~1.00x | ≈ | 10.2% | 50 |
| findUnique depth-2 | 0.927ms±0.051 | 0.290ms±0.0083 | — | ~1.00x | ≈ | 9.9% | 50 |
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.147ms±0.0033 | 0.056ms±0.0030 | 0.105ms | ~1.00x | ≈ | 17.1% | 50 |
| findMany where = | 0.123ms±0.0025 | 0.051ms±0.0011 | 0.090ms | ~1.00x | ≈ | 6.8% | 50 |
| findMany where >= | 3.70ms±0.269 | 1.21ms±0.017 | 2.15ms | 3.05x1.77x D | *** | 5.0% | 50 |
| findMany where IN | 0.140ms±0.251 | 0.057ms±0.0028 | 0.101ms | ~1.00x | ≈ | 17.1% | 50 |
| findMany where null | 0.061ms±0.0019 | 0.024ms±0.0008 | 0.050ms | ~1.00x | ≈ | 12.3% | 50 |
| findMany AND | 0.566ms±0.169 | 0.297ms±0.0055 | 0.410ms | ~1.00x | ≈ | 6.8% | 50 |
| findMany OR | 3.08ms±0.218 | 1.09ms±0.186 | 1.86ms | 2.82x1.70x D | *** | 53.4% | 50 |
| findMany NOT | 0.147ms±0.239 | 0.058ms±0.0036 | 0.123ms | ~1.00x | ≈ | 21.1% | 50 |
| findMany orderBy | 1.72ms±0.011 | 1.67ms±0.0097 | 1.71ms | ~1.00x | ≈ | 2.1% | 50 |
| findMany pagination | 0.065ms±0.0025 | 0.037ms±0.012 | 0.060ms | ~1.00x | ≈ | 93.4% | 50 |
| findMany select | 0.059ms±0.0011 | 0.046ms±0.0014 | 0.039ms | ~1.00x | ≈ | 10.4% | 50 |
| findMany relation some | 0.383ms±0.012 | 0.430ms±0.100 | — | ~1.00x | ≈ | 74.8% | 50 |
| findMany relation every | 9.48ms±0.212 | 6.42ms±0.085 | — | 1.48x | *** | 4.7% | 50 |
| findMany relation none | 126.50ms±8.87 | 3.10ms±0.084 | — | 40.78x | *** | 4.3% | 10 |
| findMany nested relation | 0.369ms±0.012 | 0.304ms±0.0064 | — | ~1.00x | ≈ | 7.3% | 50 |
| findMany complex | 0.549ms±0.156 | 0.509ms±0.103 | 0.530ms | ~1.00x | ≈ | 55.5% | 50 |
| findFirst | 0.065ms±0.0069 | 0.027ms±0.0014 | 0.060ms | ~1.00x | ≈ | 18.7% | 50 |
| findFirst skip | 0.075ms±0.0080 | 0.029ms±0.0042 | 0.076ms | ~1.00x | ≈ | 43.6% | 50 |
| findUnique id | 0.063ms±0.0025 | 0.023ms±0.0006 | 0.051ms | ~1.00x | ≈ | 10.0% | 50 |
| findUnique email | 0.062ms±0.0030 | 0.024ms±0.0008 | 0.052ms | ~1.00x | ≈ | 13.8% | 50 |
| count | 0.033ms±0.0014 | 0.014ms±0.0003 | 0.014ms | ~1.00x | ≈ | 10.2% | 50 |
| count where | 0.201ms±0.0058 | 0.166ms±0.0025 | 0.168ms | ~1.00x | ≈ | 5.1% | 50 |
| _count via include | 0.416ms±0.0089 | 0.224ms±0.0086 | — | ~1.00x | ≈ | 13.5% | 50 |
| _count via include + relations | 0.759ms±0.016 | 0.269ms±0.011 | — | ~1.00x | ≈ | 14.1% | 50 |
| aggregate count | 0.074ms±0.146 | 0.024ms±0.0022 | — | ~1.00x | ≈ | 28.5% | 50 |
| aggregate sum/avg | 0.259ms±0.142 | 0.195ms±0.134 | — | ~1.00x | ≈ | 120.6% | 50 |
| aggregate where | 0.201ms±0.073 | 0.174ms±0.057 | — | ~1.00x | ≈ | 86.9% | 50 |
| aggregate min/max | 0.206ms±0.0039 | 0.172ms±0.0030 | — | ~1.00x | ≈ | 6.3% | 50 |
| aggregate complete | 0.274ms±0.0097 | 0.238ms±0.0033 | — | ~1.00x | ≈ | 5.1% | 50 |
| groupBy | 0.475ms±0.0058 | 0.447ms±0.0069 | — | ~1.00x | ≈ | 5.5% | 50 |
| groupBy count | 0.494ms±0.016 | 0.467ms±0.0097 | — | ~1.00x | ≈ | 7.3% | 50 |
| groupBy multi | 0.987ms±0.020 | 0.973ms±0.019 | — | ~1.00x | ≈ | 6.9% | 50 |
| groupBy having | 0.503ms±0.0047 | 0.478ms±0.0044 | — | ~1.00x | ≈ | 3.3% | 50 |
| groupBy + where | 0.219ms±0.0014 | 0.198ms±0.0011 | — | ~1.00x | ≈ | 2.2% | 50 |
| groupBy aggregates | 0.577ms±0.0055 | 0.552ms±0.0033 | — | ~1.00x | ≈ | 2.2% | 50 |
| groupBy min/max | 0.584ms±0.0067 | 0.561ms±0.0083 | — | ~1.00x | ≈ | 5.3% | 50 |
| include posts | 0.834ms±0.109 | 0.435ms±0.029 | 1.35ms | ~1.00x | ≈ | 22.4% | 50 |
| include profile | 0.138ms±0.128 | 0.065ms±0.0044 | 0.194ms | ~1.00x | ≈ | 22.1% | 50 |
| include 3 levels | 0.609ms±0.148 | 0.566ms±0.014 | 0.762ms | ~1.00x | ≈ | 8.7% | 50 |
| include 4 levels | 0.682ms±0.104 | 0.424ms±0.027 | 0.641ms | ~1.00x | ≈ | 21.2% | 50 |
| include + where | 0.399ms±0.0053 | 0.271ms±0.0078 | 0.264ms | ~1.00x | ≈ | 9.9% | 50 |
| include + select nested | 0.344ms±0.0072 | 0.302ms±0.085 | 0.971ms | ~1.00x | ≈ | 87.0% | 50 |
| findMany startsWith | 0.056ms±0.0011 | 0.033ms±0.0003 | 0.055ms | ~1.00x | ≈ | 3.9% | 50 |
| findMany endsWith | 0.143ms±0.0036 | 0.069ms±0.0047 | 0.118ms | ~1.00x | ≈ | 23.5% | 50 |
| findMany NOT contains | 0.142ms±0.0014 | 0.057ms±0.0008 | 0.099ms | ~1.00x | ≈ | 4.8% | 50 |
| findMany LIKE | 0.055ms±0.0014 | 0.032ms±0.0003 | 0.052ms | ~1.00x | ≈ | 4.4% | 50 |
| findMany < | 6.81ms±4.28 | 2.47ms±0.428 | 3.96ms | 2.75x1.60x D | ** | 52.3% | 50 |
| findMany <= | 6.86ms±0.959 | 2.48ms±0.433 | 4.11ms | 2.76x1.66x D | *** | 48.9% | 50 |
| findMany > | 3.85ms±0.589 | 1.35ms±0.229 | 2.19ms | 2.85x1.62x D | *** | 50.0% | 50 |
| findMany NOT IN | 0.142ms±0.0036 | 0.056ms±0.0061 | 0.103ms | ~1.00x | ≈ | 35.5% | 50 |
| findMany isNot null | 0.135ms±0.0028 | 0.054ms±0.0030 | 0.096ms | ~1.00x | ≈ | 20.0% | 50 |
| orderBy multi-field | 0.437ms±0.0075 | 0.366ms±0.0067 | 0.421ms | ~1.00x | ≈ | 6.5% | 50 |
| orderBy relation to-one | 0.392ms±0.0050 | 0.327ms±0.0086 | — | ~1.00x | ≈ | 9.3% | 50 |
| orderBy relation + scalar | 0.460ms±0.0028 | 0.398ms±0.0033 | — | ~1.00x | ≈ | 2.9% | 50 |
| orderBy nullable relation | 0.394ms±0.015 | 0.335ms±0.016 | — | ~1.00x | ≈ | 16.3% | 50 |
| orderBy deep relation | 2.14ms±1.01 | 1.59ms±1.77 | — | ~1.00x | ≈ | 178.6% | 50 |
| orderBy deep relation + scalar | 0.809ms±0.030 | 0.721ms±0.054 | — | ~1.00x | ≈ | 25.0% | 50 |
| distinct status | 6.38ms±2.53 | 4.55ms±0.932 | — | 1.40x | ** | 58.1% | 50 |
| distinct multi | 7.42ms±0.707 | 5.78ms±0.551 | — | 1.28x | *** | 30.9% | 50 |
| select + include | 0.300ms±0.0094 | 0.063ms±0.0083 | 0.132ms | ~1.00x | ≈ | 41.9% | 50 |
| _count relation | 0.445ms±0.059 | 0.396ms±0.053 | — | ~1.00x | ≈ | 41.8% | 50 |
| _count multi-relation | 0.091ms±0.0064 | 0.045ms±0.0006 | — | ~1.00x | ≈ | 5.3% | 50 |
| _count inside include | 0.747ms±0.045 | 0.381ms±0.040 | — | ~1.00x | ≈ | 32.5% | 50 |
| _count inside nested select | 1.43ms±0.058 | 0.694ms±0.068 | — | ~1.00x | ≈ | 31.4% | 50 |
| _count deep include | 1.12ms±0.046 | 0.841ms±0.122 | — | ~1.00x | ≈ | 47.5% | 50 |
| findMany Date range | 0.102ms±0.0055 | 0.054ms±0.0047 | 0.311ms | ~1.00x | ≈ | 29.2% | 50 |
| count Date range | 0.445ms±0.066 | 0.371ms±0.050 | 0.286ms | ~1.00x | ≈ | 42.0% | 50 |
| findMany Date gte | 0.099ms±0.012 | 0.052ms±0.0072 | 0.089ms | ~1.00x | ≈ | 43.8% | 50 |
| depth-1 low-fan Project→labels | 0.120ms±0.014 | 0.067ms±0.0044 | — | ~1.00x | ≈ | 22.6% | 50 |
| depth-1 mid-fan Project→tasks | 0.875ms±0.184 | 0.449ms±0.457 | — | ~1.00x | ≈ | 221.0% | 50 |
| depth-1 high-fan User→assignedTasks | 0.785ms±0.188 | 0.424ms±0.041 | — | ~1.00x | ≈ | 31.4% | 50 |
| depth-1 wide | 0.676ms±0.210 | 0.380ms±0.051 | — | ~1.00x | ≈ | 41.2% | 50 |
| depth-1 no-limit Project→tasks | 13.27ms±1.11 | 4.11ms±0.355 | — | 3.23x | *** | 27.1% | 50 |
| depth-2 | 0.808ms±0.422 | 0.468ms±0.212 | — | ~1.00x | ≈ | 124.7% | 50 |
| depth-2 paginated | 0.552ms±0.038 | 0.653ms±0.020 | — | ~1.00x | ≈ | 10.6% | 50 |
| depth-2 high-fan | 0.724ms±0.032 | 0.426ms±0.128 | — | ~1.00x | ≈ | 88.3% | 50 |
| depth-2 wide+attach+activity | 1.01ms±0.147 | 0.544ms±0.131 | — | ~1.00x | ≈ | 73.6% | 50 |
| depth-2 no-limit | 18.70ms±0.737 | 7.54ms±0.729 | — | 2.48x | *** | 29.4% | 50 |
| depth-3 | 3.63ms±0.429 | 1.54ms±0.348 | — | 2.36x | *** | 66.1% | 50 |
| depth-3 paginated | 1.27ms±0.412 | 0.943ms±0.222 | — | ~1.00x | ≈ | 63.7% | 50 |
| depth-4 | 2.67ms±0.426 | 1.23ms±0.214 | — | 2.16x | *** | 53.9% | 50 |
| depth-4 paginated | 0.669ms±0.135 | 0.420ms±0.027 | — | ~1.00x | ≈ | 20.9% | 50 |
| findFirst depth-2 | 0.508ms±0.149 | 0.296ms±0.019 | — | ~1.00x | ≈ | 20.4% | 50 |
| findUnique depth-2 | 0.496ms±0.096 | 0.287ms±0.015 | — | ~1.00x | ≈ | 17.4% | 50 |
| الاختبار | Prisma | prisma-sql | Drizzle | التسريع | الدلالة | CV% | n |
|---|---|---|---|---|---|---|---|
| findMany basic | 0.450ms±0.927 | 0.151ms±0.048 | 0.268ms | ~1.00x | ≈ | 72.4% | 50 |
| findMany where = | 0.244ms±0.070 | 0.114ms±0.040 | 0.170ms | ~1.00x | ≈ | 80.5% | 50 |
| findMany where >= | 7.43ms±1.10 | 3.18ms±1.15 | 4.17ms | 2.34x1.31x D | *** | 98.5% | 50 |
| findMany where IN | 0.284ms±0.065 | 0.117ms±0.041 | 0.169ms | ~1.00x | ≈ | 85.0% | 50 |
| findMany where null | 0.138ms±0.035 | 0.052ms±0.023 | 0.082ms | ~1.00x | ≈ | 90.5% | 50 |
| findMany AND | 1.61ms±0.206 | 0.836ms±0.120 | 0.976ms | ~1.00x | ≈ | 45.8% | 50 |
| findMany OR | 5.29ms±0.590 | 2.24ms±0.382 | 3.25ms | 2.36x1.45x D | *** | 55.5% | 50 |
| findMany NOT | 0.197ms±0.040 | 0.081ms±0.026 | 0.126ms | ~1.00x | ≈ | 76.2% | 50 |
| findMany orderBy | 4.11ms±0.759 | 3.79ms±0.449 | 3.61ms | ~1.00x | ≈ | 40.2% | 50 |
| findMany pagination | 0.539ms±0.297 | 0.394ms±0.171 | 0.369ms | ~1.00x | ≈ | 103.6% | 50 |
| findMany select | 0.252ms±0.121 | 0.223ms±0.086 | 0.126ms | ~1.00x | ≈ | 93.6% | 50 |
| findMany relation some | 1.97ms±0.401 | 1.29ms±0.348 | — | ~1.00x | ≈ | 71.5% | 50 |
| findMany relation every | 15.08ms±4.43 | 10.50ms±1.19 | — | 1.44x | ** | 36.4% | 50 |
| findMany relation none | 178.32ms±7.96 | 6.56ms±2.80 | — | 27.18x | *** | 45.7% | 5 |
| findMany nested relation | 0.507ms±0.094 | 0.399ms±0.042 | — | ~1.00x | ≈ | 34.8% | 50 |
| findMany complex | 1.01ms±0.138 | 0.871ms±0.117 | 0.859ms | ~1.00x | ≈ | 43.3% | 50 |
| findFirst | 0.080ms±0.033 | 0.034ms±0.030 | 0.070ms | ~1.00x | ≈ | 147.4% | 50 |
| findFirst skip | 0.086ms±0.069 | 0.035ms±0.037 | 0.082ms | ~1.00x | ≈ | 154.8% | 50 |
| findUnique id | 0.081ms±0.039 | 0.027ms±0.017 | 0.055ms | ~1.00x | ≈ | 115.3% | 50 |
| findUnique email | 0.075ms±0.039 | 0.027ms±0.031 | 0.054ms | ~1.00x | ≈ | 202.7% | 50 |
| count | 0.037ms±0.0072 | 0.016ms±0.0064 | 0.015ms | ~1.00x | ≈ | 90.1% | 50 |
| count where | 0.427ms±0.070 | 0.278ms±0.052 | 0.253ms | ~1.00x | ≈ | 52.2% | 50 |
| _count via include | 0.745ms±0.105 | 0.382ms±0.091 | — | ~1.00x | ≈ | 58.8% | 50 |
| _count via include + relations | 1.53ms±0.288 | 0.691ms±0.291 | — | ~1.00x | ≈ | 105.5% | 50 |
| aggregate count | 0.076ms±0.014 | 0.026ms±0.011 | — | ~1.00x | ≈ | 112.6% | 50 |
| aggregate sum/avg | 0.246ms±0.052 | 0.189ms±0.037 | — | ~1.00x | ≈ | 55.2% | 50 |
| aggregate where | 0.255ms±0.061 | 0.214ms±0.040 | — | ~1.00x | ≈ | 52.2% | 50 |
| aggregate min/max | 0.680ms±0.165 | 0.393ms±0.106 | — | ~1.00x | ≈ | 69.7% | 50 |
| aggregate complete | 0.568ms±0.292 | 0.391ms±0.095 | — | ~1.00x | ≈ | 62.3% | 50 |
| groupBy | 0.934ms±0.104 | 0.859ms±0.136 | — | ~1.00x | ≈ | 50.0% | 50 |
| groupBy count | 0.874ms±0.100 | 0.794ms±0.102 | — | ~1.00x | ≈ | 41.1% | 50 |
| groupBy multi | 1.74ms±0.119 | 1.53ms±0.141 | — | ~1.00x | ≈ | 31.2% | 50 |
| groupBy having | 0.843ms±0.131 | 0.747ms±0.098 | — | ~1.00x | ≈ | 42.5% | 50 |
| groupBy + where | 0.450ms±0.086 | 0.337ms±0.097 | — | ~1.00x | ≈ | 70.0% | 50 |
| groupBy aggregates | 1.09ms±0.124 | 0.917ms±0.116 | — | ~1.00x | ≈ | 40.4% | 50 |
| groupBy min/max | 1.18ms±0.096 | 0.890ms±0.095 | — | ~1.00x | ≈ | 34.6% | 50 |
| include posts | 1.45ms±0.231 | 0.892ms±0.190 | 2.55ms | ~1.00x | ≈ | 58.1% | 50 |
| include profile | 0.147ms±0.028 | 0.071ms±0.017 | 0.202ms | ~1.00x | ≈ | 65.0% | 50 |
| include 3 levels | 0.920ms±0.250 | 0.778ms±0.081 | 0.915ms | ~1.00x | ≈ | 33.8% | 50 |
| include 4 levels | 0.799ms±0.085 | 0.465ms±0.049 | 0.670ms | ~1.00x | ≈ | 32.9% | 50 |
| include + where | 0.810ms±0.401 | 0.571ms±0.173 | 0.508ms | ~1.00x | ≈ | 73.1% | 50 |
| include + select nested | 0.645ms±0.153 | 0.591ms±0.074 | 1.20ms | ~1.00x | ≈ | 40.9% | 50 |
| findMany startsWith | 0.071ms±0.016 | 0.041ms±0.0069 | 0.066ms | ~1.00x | ≈ | 52.4% | 50 |
| findMany endsWith | 0.252ms±0.096 | 0.132ms±0.134 | 0.184ms | ~1.00x | ≈ | 184.3% | 50 |
| findMany NOT contains | 0.296ms±0.112 | 0.102ms±0.085 | 0.192ms | ~1.00x | ≈ | 145.2% | 50 |
| findMany LIKE | 0.113ms±0.055 | 0.063ms±0.042 | 0.099ms | ~1.00x | ≈ | 106.0% | 50 |
| findMany < | 7.95ms±0.626 | 2.95ms±0.193 | 5.36ms | 2.70x1.82x D | *** | 21.8% | 50 |
| findMany <= | 9.47ms±0.948 | 3.46ms±0.432 | 5.03ms | 2.73x1.45x D | *** | 39.8% | 50 |
| findMany > | 5.61ms±0.633 | 1.98ms±0.501 | 2.93ms | 2.83x1.48x D | *** | 73.5% | 50 |
| findMany NOT IN | 0.231ms±0.235 | 0.086ms±0.026 | 0.132ms | ~1.00x | ≈ | 70.0% | 50 |
| findMany isNot null | 0.183ms±0.062 | 0.079ms±0.035 | 0.115ms | ~1.00x | ≈ | 89.4% | 50 |
| orderBy multi-field | 0.811ms±0.280 | 0.678ms±0.114 | 0.790ms | ~1.00x | ≈ | 48.5% | 50 |
| orderBy relation to-one | 0.628ms±0.173 | 0.517ms±0.128 | — | ~1.00x | ≈ | 63.8% | 50 |
| orderBy relation + scalar | 0.550ms±0.063 | 0.443ms±0.027 | — | ~1.00x | ≈ | 20.6% | 50 |
| orderBy nullable relation | 0.455ms±0.088 | 0.385ms±0.060 | — | ~1.00x | ≈ | 46.8% | 50 |
| orderBy deep relation | 0.500ms±0.083 | 0.434ms±0.055 | — | ~1.00x | ≈ | 37.9% | 50 |
| orderBy deep relation + scalar | 0.937ms±0.108 | 0.767ms±0.088 | — | ~1.00x | ≈ | 36.3% | 50 |
| distinct status | 8.58ms±0.760 | 5.89ms±0.577 | — | 1.46x | *** | 29.9% | 50 |
| distinct multi | 9.94ms±0.660 | 7.19ms±0.539 | — | 1.38x | *** | 24.1% | 50 |
| select + include | 0.497ms±0.076 | 0.125ms±0.034 | 0.202ms | ~1.00x | ≈ | 72.4% | 50 |
| _count relation | 0.725ms±0.129 | 0.533ms±0.111 | — | ~1.00x | ≈ | 58.3% | 50 |
| _count multi-relation | 0.103ms±0.108 | 0.055ms±0.034 | — | ~1.00x | ≈ | 107.3% | 50 |
| _count inside include | 0.963ms±0.118 | 0.501ms±0.096 | — | ~1.00x | ≈ | 57.7% | 50 |
| _count inside nested select | 1.54ms±0.156 | 0.840ms±0.095 | — | ~1.00x | ≈ | 36.7% | 50 |
| _count deep include | 1.39ms±0.118 | 0.976ms±0.066 | — | ~1.00x | ≈ | 23.4% | 50 |
| findMany Date range | 0.099ms±0.060 | 0.054ms±0.042 | 0.316ms | ~1.00x | ≈ | 128.0% | 50 |
| count Date range | 0.478ms±0.157 | 0.410ms±0.109 | 0.338ms | ~1.00x | ≈ | 70.1% | 50 |
| findMany Date gte | 0.091ms±0.0089 | 0.049ms±0.014 | 0.083ms | ~1.00x | ≈ | 76.3% | 50 |
| depth-1 low-fan Project→labels | 0.123ms±0.017 | 0.069ms±0.019 | — | ~1.00x | ≈ | 79.7% | 50 |
| depth-1 mid-fan Project→tasks | 0.871ms±0.203 | 0.437ms±0.087 | — | ~1.00x | ≈ | 54.0% | 50 |
| depth-1 high-fan User→assignedTasks | 1.24ms±0.363 | 0.645ms±0.248 | — | ~1.00x | ≈ | 94.6% | 50 |
| depth-1 wide | 1.63ms±0.453 | 0.938ms±0.145 | — | 1.74x | *** | 50.3% | 50 |
| depth-1 no-limit Project→tasks | 11.69ms±1.15 | 5.10ms±0.731 | — | 2.29x | *** | 40.4% | 50 |
| depth-2 | 0.906ms±0.194 | 0.544ms±0.050 | — | ~1.00x | ≈ | 29.6% | 50 |
| depth-2 paginated | 0.661ms±0.250 | 0.717ms±0.095 | — | ~1.00x | ≈ | 40.5% | 50 |
| depth-2 high-fan | 1.76ms±0.328 | 1.03ms±0.182 | — | ~1.00x | ≈ | 51.6% | 50 |
| depth-2 wide+attach+activity | 2.13ms±0.429 | 1.26ms±0.486 | — | ~1.00x | ≈ | 95.4% | 50 |
| depth-2 no-limit | 23.64ms±2.04 | 12.97ms±1.44 | — | 1.82x | *** | 38.2% | 50 |
| depth-3 | 5.23ms±0.329 | 2.79ms±0.696 | — | 1.88x | *** | 67.4% | 50 |
| depth-3 paginated | 1.45ms±0.246 | 0.967ms±0.099 | — | ~1.00x | ≈ | 33.0% | 50 |
| depth-4 | 3.22ms±0.295 | 1.78ms±0.430 | — | 1.81x | *** | 68.1% | 50 |
| depth-4 paginated | 0.782ms±0.177 | 0.435ms±0.025 | — | ~1.00x | ≈ | 19.1% | 50 |
| findFirst depth-2 | 0.538ms±0.060 | 0.330ms±0.053 | — | ~1.00x | ≈ | 45.5% | 50 |
| findUnique depth-2 | 0.550ms±0.306 | 0.358ms±0.071 | — | ~1.00x | ≈ | 57.1% | 50 |
npm run bench (BENCHMARK_JSON_OUTPUT=1 يكتب JSON). تُحفظ النتائج في benchmark-results/summary-.json ؛ ويغذّي v--latest.json هذه الصفحة.كل ميزة في Prisma Client فحصناها، على PostgreSQL وSQLite. تبقى عمليات الكتابة في Prisma؛ وتُصرَّف عمليات القراءة إلى SQL حيث يكون شكل الاستعلام مدعومًا.
25 من أصل 73 ميزة مفحوصة مُسرَّعة بالكامل على PostgreSQL. 19 قد تُرجع نتيجة مختلفة عن Prisma؛ وتسرد الخريطة الكاملة كلًّا منها مع السبب.
| الحالة | PostgreSQL | SQLite |
|---|---|---|
| مُسرَّع | 25 | 21 |
| جزئي | 6 | 6 |
| يعود إلى Prisma | 9 | 7 |
| يعمل في Prisma | 7 | 7 |
| قد يختلف | 19 | 17 |
| غير متوفر | 2 | 4 |
| prisma-sql فقط | 5 | 2 |
| غير موجود في Prisma | 0 | 6 |
| لم يُفحص | 0 | 3 |
دوال النموذج
findMany
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
findFirst
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُصرَّف مع LIMIT 1. يُتجاهل cursor وtake السالب. distinct يعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
findUnique
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
المفاتيح الفريدة المركّبة مثل a_b: { a, b } تعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
findUniqueOrThrow, findFirstOrThrow
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
count
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُتجاهل select: { _all, field } ويُرجَع رقم بدلًا من كائن. take السالب يعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
aggregate
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
تُتجاهل take وskip وcursor وorderBy، لذا قد تختلف المجاميع.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
groupBy
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
by كسلسلة نصية مفردة يعود إلى Prisma. يُتوقع أن يعود الترتيب حسب تجميع إلى Prisma (لم يُتحقق منه).
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
create, createMany, createManyAndReturn
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
عمليات الكتابة غير مُعترَضة.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
update, updateMany, updateManyAndReturn
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
عمليات الكتابة غير مُعترَضة.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
upsert, delete, deleteMany
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
عمليات الكتابة غير مُعترَضة.
يدعمها Prisma على: PostgreSQL، SQLite
دوال النموذج
findManyStream, findManyReduceStream
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
بث الصفوف. PostgreSQL فقط؛ في SQLite يُرمى خطأ.
يدعمها Prisma على: لا
خيارات الاستعلام
select
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
الحقول القياسية (scalars) والعلاقات و_count. الحقول غير المعروفة تعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
include
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
الاستعلامات التي تتجاوز حدود العمق أو التفرّع أو include الدائري تعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
omit (per query)
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُتجاهل. تُرجَع الحقول المستبعدة.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
omit (client option)
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
لا يُقرأ. تُرجَع الحقول المستبعدة في new PrismaClient({ omit }).
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
خيارات الاستعلام
distinct
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يستخدم PostgreSQL الصيغة DISTINCT ON؛ عندما لا يبدأ orderBy بحقول distinct، قد يختلف الترتيب وtake (لم يُتحقق منه). في SQLite مع cursor يعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
خيارات الاستعلام
take, skip
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
Negative take
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يتطلب orderBy على حقول قياسية محدَّدة؛ وإلا يعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
cursor
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
عندما لا يكون صف المؤشر موجودًا، تُرجَع صفوف؛ بينما يُرجع Prisma قائمة فارغة. بدون orderBy، ترتيب الصفوف غير ثابت.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
relationLoadStrategy
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
يُتجاهل. يختار مخطِّط prisma-sql طريقة تحميل العلاقات.
يدعمها Prisma على: PostgreSQL (معاينة)
خيارات الاستعلام
_count in select / include
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
العدّ المُرشَّح مدعوم. قد يعدّ _count: true على المستوى الجذري العلاقات الأحادية (to-one) أيضًا (لم يُتحقق منه).
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
Nested where, take, skip
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
Nested orderBy
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
الحقول القياسية فقط. حقول العلاقات تعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
خيارات الاستعلام
Nested cursor, distinct
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُطبَّق على استعلام فرعي واحد مُجمَّع لكل السجلات الأب، وليس لكل أب على حدة.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
المرشحات
equals, shorthand equality
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
not
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
تُستبعد صفوف NULL، كما في Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
in, notIn
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
القوائم الفارغة تتصرف كما في Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
lt, lte, gt, gte
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
قيمة null تؤدي إلى العودة إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
contains, startsWith, endsWith
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
لا تُهرَّب % و_، كما في Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
mode: 'insensitive'
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
يستخدم PostgreSQL الصيغة ILIKE. في SQLite، حيث يرفض Prisma mode، يقبله prisma-sql ويستخدم LOWER().
يدعمها Prisma على: PostgreSQL
المرشحات
search (full-text)
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
يدعمها Prisma على: PostgreSQL (معاينة)
المرشحات
AND, OR, NOT
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
OR الفارغ لا يطابق شيئًا، كما في Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
some, every, none
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
is, isNot
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
عند تمرير الاثنين معًا، يُسقَط isNot.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
Scalar lists: has, hasSome, hasEvery, isEmpty, equals
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
not يقبل { equals } فقط. isEmpty يعامل القوائم NULL كقوائم فارغة.
يدعمها Prisma على: PostgreSQL
المرشحات
Json path filter { path, equals }
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL
المرشحات
Json string_contains, string_starts_with, string_ends_with
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
دائمًا غير حساس لحالة الأحرف ويُطابَق مع نص JSON بالكامل.
يدعمها Prisma على: PostgreSQL
المرشحات
Json array_contains, array_starts_with, array_ends_with
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL
المرشحات
DbNull, JsonNull, AnyNull
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
قد يُسقَط المرشح.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
المرشحات
Field references (model.fields.x)
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
المرشحات
Compound unique where
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
null, undefined
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُتخطّى undefined، كما في Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
المرشحات
Decimal and Bytes values
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
المرشحات
Enum values
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
تُحوَّل إلى أسماء @map.
يدعمها Prisma على: PostgreSQL، SQLite
الترتيب
Scalar asc / desc
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
الترتيب
{ sort, nulls }
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يحاكي SQLite الصيغة NULLS FIRST / LAST.
يدعمها Prisma على: PostgreSQL، SQLite
الترتيب
Relation field
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
العلاقات الأحادية (to-one)، متداخلة.
يدعمها Prisma على: PostgreSQL، SQLite
الترتيب
Relation _count
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL، SQLite
الترتيب
_relevance
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
يدعمها Prisma على: PostgreSQL (معاينة)
الترتيب
groupBy by aggregate
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يرفضه مُنشئ SQL فيُنفِّذ Prisma الاستعلام. النتيجة نفسها، بلا تسريع.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
الترتيب
Optional relation { sort, nulls }
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
امتداد نوع أضافه prisma-sql. يرمي خطأ بدلًا من العودة إلى Prisma عند عدم الدعم.
يدعمها Prisma على: لا
التجميعات
_count, _sum, _avg, _min, _max
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يدعمها Prisma على: PostgreSQL، SQLite
التجميعات
groupBy having
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
equals، not، gt، gte، lt، lte، in، notIn. العوامل الأخرى تعود إلى Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
التجميعات
groupBy take, skip
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
مقبولة بدون orderBy؛ بينما يشترطه Prisma.
يدعمها Prisma على: PostgreSQL، SQLite
التجميعات
aggregate take, skip, cursor, orderBy
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
تُتجاهل.
يدعمها Prisma على: PostgreSQL، SQLite
التجميعات
_count: true result shape
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُرجع { _all: n }؛ بينما يُرجع Prisma n.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
واجهة العميل
$transaction(async (tx) => …)
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
يعمل على العميل الأساسي. عمليات القراءة داخل الدالة الراجعة غير مُسرَّعة.
يدعمها Prisma على: PostgreSQL، SQLite
واجهة العميل
$transaction([…])
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
قد تعمل القراءات المُسرَّعة على اتصال prisma-sql، خارج معاملة Prisma.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
واجهة العميل
$transaction([{ model, method, args }])
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
صيغة خاصة بـ prisma-sql مع مستوى العزل ومهلة زمنية. PostgreSQL فقط.
يدعمها Prisma على: لا
واجهة العميل
$queryRaw, $executeRaw
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
يدعمها Prisma على: PostgreSQL، SQLite
واجهة العميل
$queryRawTyped (TypedSQL)
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
غير مُعترَض. يُنفِّذه Prisma Client كما في السابق.
يدعمها Prisma على: PostgreSQL، SQLite (معاينة)مُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
واجهة العميل
findUnique batching
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
كل findUnique يُنفِّذ استعلام SQL خاصًا به.
يدعمها Prisma على: PostgreSQL، SQLite
واجهة العميل
log, $on('query')
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
يُصرَّف إلى SQL؛ بعض أشكال الوسائط تعود إلى Prisma.
الاستعلامات المُسرَّعة لا تصل إلى سجلات Prisma. استخدم debug أو onQuery.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
واجهة العميل
$batch, $batchCount
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
عدة عمليات قراءة في رحلة ذهاب وإياب واحدة. تعود قيم BigInt وDecimal كأرقام JS.
يدعمها Prisma على: لا
واجهة العميل
createShardedReader
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
أضافه prisma-sql. ليس جزءًا من واجهة Prisma Client.
يُرجع صفوفًا خامًا: بلا تحويل أنواع، وبلا تحويل قيم enum.
يدعمها Prisma على: لا
واجهة العميل
Multiple schemas (@@schema)
يدعمه Prisma؛ ولا يوجد مقابل له في prisma-sql.
لا يدعم Prisma هذا على قاعدة البيانات تلك.
المخطط مثبّت على public.
يدعمها Prisma على: PostgreSQL
أنواع النتائج
Decimal
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
لم يُفحص السلوك على قاعدة البيانات هذه بعد.
سلسلة نصية في الصفوف المسطّحة، ورقم داخل العلاقات المُضمَّنة. التجميعات تُرجع Prisma.Decimal.
يدعمها Prisma على: PostgreSQL، SQLite
أنواع النتائج
BigInt
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
لم يُفحص السلوك على قاعدة البيانات هذه بعد.
سلسلة نصية في الصفوف المسطّحة، ورقم داخل العلاقات المُضمَّنة. التجميعات تُرجع bigint.
يدعمها Prisma على: PostgreSQL، SQLite
أنواع النتائج
DateTime
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
PostgreSQL: كائن Date في الصفوف المسطّحة، وسلسلة نصية داخل العلاقات المُضمَّنة. SQLite: رقم أو سلسلة نصية خام.
يدعمها Prisma على: PostgreSQL، SQLite
أنواع النتائج
Boolean
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُرجع SQLite القيمة 0 / 1.
يدعمها Prisma على: PostgreSQL، SQLite
أنواع النتائج
Bytes
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
لم يُفحص السلوك على قاعدة البيانات هذه بعد.
Buffer في الصفوف المسطّحة، وسلسلة ست عشرية داخل العلاقات المُضمَّنة.
يدعمها Prisma على: PostgreSQL، SQLiteمُستنتَج من الكود المصدري؛ لم يُؤكَّد بتشغيل اختبار.
أنواع النتائج
Json
يُصرَّف إلى SQL ويُنفَّذ عبر postgres.js أو better-sqlite3.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
يُرجع SQLite سلسلة JSON الخام عند عدم وجود include.
يدعمها Prisma على: PostgreSQL، SQLite
أنواع النتائج
Enum with @map
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
مُسرَّع، لكن النتيجة قد تختلف عن Prisma دون ظهور خطأ.
تُرجَع قيمة قاعدة البيانات، وليس الاسم في المخطط.
يدعمها Prisma على: PostgreSQL، SQLite
افتح خريطة التكافؤ الكاملةتجاوز مسار تنفيذ القراءة في Prisma مع الحفاظ على واجهة Prisma وأنواعها
تلتقط الإضافة عمليات القراءة (findMany, findFirst, findUnique, count, aggregate, groupBy) قبل تنفيذها
query: {
$allModels: {
async $allOperations({ model, operation, args, query }) {
if (!ACCELERATED_METHODS.has(operation)) {
return query(args)
}
return executeAccelerated(model, operation, args, query)
},
},
}تحويل استعلامات Prisma إلى SQL سريع ذي معاملات مربوطة مع JOINs مُحسّنة
SELECT user_t.id, user_t.email, user_t.status,
COALESCE((
SELECT COALESCE(json_agg(json_build_object(
'id', posts_0.id,
'title', posts_0.title,
'authorId', posts_0."authorId"
)), '[]'::json)
FROM "public"."Post" posts_0
WHERE posts_0."authorId" = user_t.id
), '[]'::json) AS posts
FROM "public"."User" user_t
WHERE user_t.status = $1
-- params ["ACTIVE"]تشغيل الاستعلامات عبر postgres.js أو better-sqlite3 مع تجاوز عبء قراءة Prisma
if (DIALECT === 'postgres') {
await client.unsafe(sql, normalizedParams).forEach((row) => {
results.push(row)
})
return results
}
const stmt = getOrPrepareStatement(client, sql)
return stmt.all(...normalizedParams)تطابق النتائج الشكل المتوقع في Prisma. تبقى الأنواع وIntelliSense وكود الاستعلام الحالي كما هي
const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true },
})
users[0].email
users[0].posts[0].title
// نفس الأنواع المُستنتَجة كما في Prisma Client.
// قد تختلف قيم Decimal وBigInt وDateTime؛
// وتسرد خريطة التكافؤ كل حالة.query: {
$allModels: {
async $allOperations({ model, operation, args, query }) {
if (!ACCELERATED_METHODS.has(operation)) {
return query(args)
}
return executeAccelerated(model, operation, args, query)
},
},
}احصل على سرعة SQL الخام للقراءات مع الحفاظ على تجربة Prisma للمطورين
يضيف prisma-sql قدرات غير موجودة في Prisma Client. نفس الأنواع، ونفس أسلوب الكود.
N استعلامات للوحة المعلومات في رحلة ذهاب وإياب واحدة
اجمع عمليات قراءة مستقلة في رحلة ذهاب وإياب واحدة إلى PostgreSQL. نتيجة ككائن مُحدَّد الأنواع، بلا تلاعب بـ Promise.all.
const dash = await prisma.$batch((b) => ({
users: b.user.count(),
posts: b.post.findMany({ take: 10 }),
stats: b.task.aggregate({ _count: true }),
}))جهّز مسبقًا أكثر استعلاماتك استخدامًا
أضف تعليقًا توضيحيًا إلى نموذج في schema.prisma. وقت التوليد يُجهَّز SQL الدقيق مسبقًا؛ والأشكال المطابقة وقت التشغيل تتجاوز التحويل بالكامل.
/// @optimize {
/// "method": "findMany",
/// "query": {
/// "where": { "status": "$status" },
/// "take": "$take"
/// }
/// }
model User { ... }استراتيجية تختارها البيانات، لا التخمين
تقود إحصاءات العلاقات المجمَّعة التبديل بين الاستراتيجيات: الروابط المسطّحة (flat joins) والاستعلامات الفرعية المترابطة والتحميل المجزّأ عبر where-in. الجداول الفرعية الكبيرة لا تؤدي أبدًا إلى عمليات مسح لكل سجل أب.
prisma-sql-collect-stats \
--output dist/planner.generated.js \
--prisma-client dist/client/index.jsسيناريوهات شائعة تُحدث فيها هذه الإضافة فرقًا حقيقيًا
تستفيد تجميعات Prisma وعمليات groupBy بشكل كبير من تنفيذ SQL مباشر
يتراكم العبء لكل استعلام تحت الحمل، خصوصًا في نقاط النهاية كثيفة القراءة
كل ميلي ثانية مهمة في Serverless: قلّل زمن القراءة حيث يهم
المستخدمون يلاحظون التأخير: القراءات الأسرع تحسّن تجربة المستخدم المُدرَكة فورًا
سرّع قراءات Prisma خلال أقل من 60 ثانية
# PostgreSQL
npm install prisma-sql postgres
# SQLite
npm install prisma-sql better-sqlite3generator client {
provider = "prisma-client"
}
generator sql {
provider = "prisma-sql-generator"
}npx prisma generateimport { PrismaClient } from '@prisma/client'
import { speedExtension, type SpeedClient } from './generated/sql'
import postgres from 'postgres'
const sql = postgres(process.env.DATABASE_URL!)
const basePrisma = new PrismaClient()
export const prisma = basePrisma.$extends(
speedExtension({ postgres: sql }),
) as SpeedClient<typeof basePrisma>const users = await prisma.user.findMany({
where: { status: 'ACTIVE' },
include: { posts: true },
})SQLite: مرّر speedExtension({ sqlite: db }) مع قاعدة بيانات better-sqlite3.دليل الإعداد الكامل
أسئلة شائعة عن تحسين قراءات Prisma
يضيف Prisma عبئًا لأنه يطبق ضمانات على مستوى الواجهة مثل التحقق المعتمد على المخطط والسلوك المتسق للاستعلامات وتشكيل النتائج. هذه الطبقات تمنح تجربة مطوّر ممتازة لكنها تكلف وقتًا مقارنة بتنفيذ SQL خام مباشرة.
حسّن أحمال Prisma كثيفة القراءة بإضافة هذه الإضافة. تنفذ عمليات القراءة عبر SQL مباشر باستخدام postgres.js أو better-sqlite3 مع الحفاظ على واجهة Prisma وأنواعها. الإعداد تغيير صغير في التهيئة ولا يتطلب إعادة هيكلة لاستعلاماتك الحالية.
بالنسبة للعديد من أحمال القراءة، نعم. هناك عبء معماري مقارنة بتنفيذ SQL الخام. تهدف هذه الإضافة إلى الحفاظ على DX الخاص بـPrisma مع تقليل زمن القراءة بتنفيذ SQL مباشرة.
نعم. أضف الإضافة مرة واحدة أثناء تهيئة Prisma Client واحتفظ بكود استعلامات Prisma كما هو. ستصبح القراءات أسرع مع بقاء واجهة Prisma وأنواعها ومخططها نفسها.
نعم، صُممت للاستخدام في الإنتاج على مسارات القراءة المدعومة. تحقّق دائمًا من التوافق مع إصدار Prisma لديك وشغّل اختبارات الانحدار الخاصة بك قبل الإطلاق.
عمليات aggregate وgroupBy غالبًا تضخّم العبء الثابت (معالجة الاستعلام وتشكيل النتائج) وقد تشمل مجموعات نتائج وسيطة أكبر. تحسّن هذه الإضافة هذه القراءات عبر توليد SQL مباشرة، ما يقلل عادةً زمن الاستجابة لنقاط النهاية كثيفة التجميع.
راجع جدول القياس الحالي لعمليات القراءة المدعومة في PostgreSQL وSQLite