سست Prisma کوئریز ٹھیک کریں براہِ راست SQL ایگزیکیوشن کے ذریعے

Prisma کا DX پسند ہے، لیکن معاون کوئری شکلوں پر ریڈ اوور ہیڈ کم چاہیے؟ موجودہ بینچ مارک JSON کے مطابق Prisma v6، v7 اور v8 پر اوسط رفتار میں اضافہ معاون PostgreSQL اور SQLite ریڈ کوئریز پر ماپا گیا ہے؛ انفرادی کوئری شکلوں کے نتائج مختلف ہوتے ہیں۔

ابھی Prisma تیز کریں

  • تیز تر معاون ریڈ کوئریز
  • کوئری میں کوئی تبدیلی نہیں
  • موجودہ بینچ مارک JSON
  • PostgreSQL اور SQLite
آپ کی Prisma کالuser.findMany
const users = await prisma.user.findMany({
  where: { status: 'ACTIVE' },
  include: { posts: true },
})
وہ SQL جو prisma-sql چلاتا ہے
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 = $1
پیرامیٹرز ["ACTIVE"]1 اسٹیٹمنٹ
دو ماڈلز والے اسکیما کے لیے createToSQL کا آؤٹ پٹ، لائن بریکس شامل کیے گئے۔
Prisma کوریج
v6–v8
PostgreSQL اور SQLite بینچ مارک میٹرکس
کوئری میں تبدیلیاں
0
اپنی موجودہ Prisma کالز برقرار رکھیں
بینچ مارک فائلیں
6
Prisma v6/v7/v8 × PG/SQLite
ٹائپ سیفٹی
100%
وہی Prisma API

Prisma سست کیوں ہے؟

Prisma کے ارتقا اور اس کی کارکردگی کی خصوصیات کو سمجھنے سے واضح ہوتا ہے کہ یہ ایکسٹینشن کیوں موجود ہے۔

Prisma کا سفر: پہلے DX، اور بڑے پیمانے پر کارکردگی اہم

💡 یہ ایکسٹینشن کیوں موجود ہے

Prisma نے اپنے اہداف کے لیے درست آرکیٹیکچرل فیصلے کیے: ٹائپ سیفٹی، ڈیولپر تجربہ اور کراس ڈیٹابیس رویہ۔ لیکن یہی فیصلے ایسا اوور ہیڈ پیدا کرتے ہیں جو بڑے پیمانے پر محسوس ہوتا ہے۔ یہ ایکسٹینشن Prisma کی جگہ نہیں لیتی—یہ اُن ٹیموں کے لیے ریڈ کوئریز کو آپٹیمائز کرتی ہے جو Prisma کا DX بھی چاہتی ہیں اور جہاں ضرورت ہو وہاں تیز ایگزیکیوشن بھی۔

  1. 🎯 2019: جدید Prisma کی پیدائش

    Prisma 2 سن 2019 میں لانچ ہوا اور ٹائپ سیف ڈیٹابیس رسائی اور آپ کے اسکیما سے تیار کردہ ٹائپس کے ذریعے TypeScript ORM کا منظرنامہ بدل دیا۔ Prisma نے کوئریز کا ترجمہ کرنے، ان کی توثیق کرنے اور ایسی مضبوط ضمانتیں دینے کے لیے انجن پر مبنی آرکیٹیکچر متعارف کرایا جو روایتی JavaScript ORMs کے ساتھ حاصل کرنا مشکل تھا۔

  2. ⚡ 2020–2022: تیز ترقی اور فیچرز میں توسیع

    Prisma نے نیسٹڈ رائٹس، ٹرانزیکشنز اور مڈل ویئر جیسے طاقتور فیچرز شامل کیے۔ فیچرز بڑھتے گئے، لیکن ہر کوئری پھر بھی ایک آرکیٹیکچرل قیمت ادا کرتی رہی: کوئریز کو ظاہر کیا جاتا ہے، ان کی توثیق ہوتی ہے، انہیں چلایا جاتا ہے، اور نتائج کو Prisma API کے مطابق شکل دی جاتی ہے۔

  3. 📊 2023: بڑے پیمانے پر اوور ہیڈ نمایاں ہونے لگا

    جیسے جیسے زیادہ ٹیموں نے زیادہ ٹریفک والے ورک لوڈز میں Prisma استعمال کیا، فی کوئری مقررہ اوور ہیڈ قابلِ پیمائش ہو گیا۔ یہ سب سے زیادہ ریڈ پر مبنی اینڈ پوائنٹس، اینالیٹکس، ایگریگیشنز اور بڑے رزلٹ سیٹس میں نظر آتا ہے۔ یہ اوور ہیڈ کوئی بگ نہیں؛ یہ Prisma کی ضمانتوں اور API کے رویے کی قیمت ہے۔

  4. 🚀 2024–2025: Prisma کی کارکردگی پر کام جاری

    Prisma نے کارکردگی اور انجن میں تبدیلیوں پر مرکوز بڑی اپ ڈیٹس جاری کیں۔ بہتری کے باوجود، خام SQL کو براہِ راست چلانے کے مقابلے میں پارسنگ، توثیق، پلاننگ اور نتائج کو شکل دینے کی ایک ناگزیر قیمت باقی رہتی ہے۔

  5. 🎯 2026: prisma-sql ایکسٹینشن جاری

    یہ ایکسٹینشن ریڈ کارکردگی پر توجہ دیتی ہے۔ یہ findMany، findFirst، findUnique، count، aggregate اور groupBy کے لیے Prisma کے ریڈ ایگزیکیوشن پاتھ کو بائی پاس کرتی ہے، جبکہ رائٹ آپریشنز، مائیگریشنز، اسکیما مینجمنٹ اور ٹائپ جنریشن کے لیے Prisma برقرار رہتا ہے۔ رول آؤٹ سے پہلے اپنے Prisma ورژن کے ساتھ مطابقت کی توثیق کریں۔

کوئری ترجمے کی لیئر

Prisma آپ کے کوئری ان پٹس کو ڈیٹابیس کے مخصوص SQL میں ترجمہ کرتا ہے۔ اس سے کراس ڈیٹابیس رویہ اور Prisma API کی سیمینٹکس ممکن ہوتی ہیں، لیکن ڈیٹابیس تک SQL پہنچنے سے پہلے پروسیسنگ کا وقت بڑھ جاتا ہے۔

توثیق اور ٹائپ کی ضمانتیں

Prisma اسکیما کے مقابل کوئریز کی توثیق کرتا ہے اور API کی سطح پر ضمانتیں نافذ کرتا ہے۔ یہ حفاظتی اقدامات کئی قسم کے بگز کو روکتے ہیں، لیکن ہر کوئری پر اوور ہیڈ بھی بڑھاتے ہیں۔

نتائج کو شکل دینا

نتائج کو Prisma API کے رویے کے مطابق شکل دی جاتی ہے۔ یہ DX اور یکسانیت کے لیے بہترین ہے، لیکن لیٹنسی بڑھاتا ہے، خاص طور پر بڑے رزلٹ سیٹس اور پیچیدہ include میں۔

یہ ایکسٹینشن معاون ریڈ کوئریز کے لیے تیز راستہ دے کر Prisma کی تکمیل کرتی ہے۔ اسکیما، مائیگریشنز، رائٹ آپریشنز اور تیار کردہ ٹائپس کے لیے Prisma برقرار رہتا ہے، جبکہ تیار کردہ SQL منتخب، زیادہ استعمال ہونے والی ریڈ کوئریز کو ڈیٹابیس کے اپنے کلائنٹس کے ذریعے چلاتا ہے۔

کتنا تیز؟ حقیقی بینچ مارکس

Prisma v6، v7، v8، Drizzle ORM اور prisma-sql کا تازہ ترین بینچ مارک JSON موازنہ

PostgreSQL

ہر رن میں 95 کوئری کیسز
  • Prisma v6 (6.19.3)1.56× بمقابلہ Drizzle
    1.99×

    Prisma v6 (6.19.3): Prisma کے مقابلے میں اوسط 1.99× رفتار میں اضافہ

    95 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026
  • Prisma v7 (7.10.0)1.51× بمقابلہ Drizzle
    1.47×

    Prisma v7 (7.10.0): Prisma کے مقابلے میں اوسط 1.47× رفتار میں اضافہ

    95 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026
  • Prisma v8 (8.1.0-dev.1)1.63× بمقابلہ Drizzle
    1.54×

    Prisma v8 (8.1.0-dev.1): Prisma کے مقابلے میں اوسط 1.54× رفتار میں اضافہ

    95 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026

SQLite

ہر رن میں 84 کوئری کیسز
  • Prisma v6 (6.19.3)1.79× بمقابلہ Drizzle
    4.80×

    Prisma v6 (6.19.3): Prisma کے مقابلے میں اوسط 4.80× رفتار میں اضافہ

    84 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026
  • Prisma v7 (7.10.0)1.84× بمقابلہ Drizzle
    2.29×

    Prisma v7 (7.10.0): Prisma کے مقابلے میں اوسط 2.29× رفتار میں اضافہ

    84 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026
  • Prisma v8 (8.1.0-dev.1)1.63× بمقابلہ Drizzle
    2.10×

    Prisma v8 (8.1.0-dev.1): Prisma کے مقابلے میں اوسط 2.10× رفتار میں اضافہ

    84 ناپے گئے کوئری کیسز، Prisma کے مقابلے میں اوسط30 ستمبر، 2026

تازہ ترین benchmark-results/*-latest.json فائلوں سے بلڈ ٹائم پر تیار کیا گیا۔ دونوں ڈیٹابیسز کے بارز ایک ہی پیمانہ استعمال کرتے ہیں؛ امبر رنگ ہر ڈیٹابیس کے بہترین رن کو ظاہر کرتا ہے۔ انفرادی کوئری شکلوں کے نتائج مختلف ہوتے ہیں۔فی کوئری ٹیبلمکمل بینچ مارک ڈیٹا دیکھیں

تفصیلی بینچ مارک نتائج

Welch کے t-test اور 1ms عملی اہمیت کی حد کے ساتھ شماریاتی موازنہ

یہ نتائج رن ٹائم موڈ کی عکاسی کرتے ہیں، جہاں ہر ریکویسٹ پر کوئریز کو SQL میں تبدیل کیا جاتا ہے۔ پری رینڈرڈ موڈ میں SQL بلڈ ٹائم پر تیار کیا جاتا ہے — رن ٹائم پر تبدیلی کے کسی اوور ہیڈ کے بغیر خام پیرامیٹرائزڈ کوئریز چلتی ہیں۔

PostgreSQLPrisma v6 (6.19.3)

اوسط 1.99x بمقابلہ Prismaاوسط 1.56x بمقابلہ Drizzle35/95 شماریاتی طور پر اہم کامیابیاں60 شور کی حد کے اندر
30 ستمبر، 2026
ٹیسٹPrismaprisma-sqlDrizzleرفتار میں اضافہاہمیتCV%n
findMany basic0.529ms±0.0640.231ms±0.2340.271ms~1.00x≈198.0%50
findMany where =0.501ms±0.00690.208ms±0.00940.347ms~1.00x≈15.6%50
findMany where >=16.51ms±0.2675.67ms±0.3387.43ms2.91x1.31x D***21.0%50
findMany where IN0.657ms±0.1420.292ms±0.0170.492ms~1.00x≈20.3%50
findMany where null0.280ms±0.0200.167ms±0.0120.177ms~1.00x≈25.7%50
findMany ILIKE0.297ms±0.00970.168ms±0.00890.278ms~1.00x≈18.6%50
findMany AND2.72ms±0.1611.11ms±0.1111.45ms2.45x1.31x D***31.5%50
findMany OR13.98ms±0.2864.69ms±0.2215.88ms2.98x1.25x D***17.0%50
findMany NOT0.639ms±0.0130.274ms±0.00910.478ms~1.00x≈12.2%50
findMany orderBy4.50ms±0.2191.48ms±0.0751.76ms3.03x1.18x D***18.5%50
findMany pagination0.342ms±0.0320.171ms±0.0260.295ms~1.00x≈43.2%50
findMany select0.294ms±0.00940.181ms±0.00720.176ms~1.00x≈14.0%50
findMany relation some1.69ms±0.0980.999ms±0.064—~1.00x≈22.1%50
findMany relation every2.17ms±0.0961.47ms±0.078—~1.00x≈18.9%50
findMany relation none26.02ms±0.51710.06ms±0.511—2.59x***18.0%50
findMany nested relation1.76ms±0.0761.24ms±0.060—~1.00x≈18.0%50
findMany complex2.94ms±0.1091.46ms±0.0681.73ms2.01x1.18x D***17.2%50
findFirst0.378ms±0.0320.175ms±0.0140.350ms~1.00x≈28.0%50
findFirst skip0.328ms±0.1070.147ms±0.00640.301ms~1.00x≈15.2%50
findUnique id0.232ms±0.00970.102ms±0.00550.207ms~1.00x≈18.6%50
findUnique email0.210ms±0.00720.090ms±0.00440.179ms~1.00x≈17.1%50
count0.109ms±0.00330.063ms±0.00300.064ms~1.00x≈16.2%50
count where0.469ms±0.0150.247ms±0.0160.287ms~1.00x≈22.2%50
aggregate count0.215ms±0.00780.155ms±0.0042—~1.00x≈9.2%50
aggregate sum/avg0.305ms±0.0140.261ms±0.0053—~1.00x≈7.1%50
aggregate where0.446ms±0.01000.239ms±0.0058—~1.00x≈8.7%50
aggregate min/max0.305ms±0.0150.268ms±0.010—~1.00x≈13.2%50
aggregate complete0.381ms±0.00610.292ms±0.0072—~1.00x≈8.8%50
groupBy0.419ms±0.0240.344ms±0.013—~1.00x≈12.8%50
groupBy count0.422ms±0.01000.358ms±0.0050—~1.00x≈4.8%50
groupBy multi0.544ms±0.0130.442ms±0.052—~1.00x≈38.9%50
groupBy having0.505ms±0.0110.375ms±0.0086—~1.00x≈8.2%50
groupBy + where0.550ms±0.0110.294ms±0.0064—~1.00x≈7.8%50
_count via include0.679ms±0.0130.511ms±0.013—~1.00x≈8.9%50
_count via include + relations1.55ms±0.0370.666ms±0.017—~1.00x≈9.3%50
groupBy aggregates0.557ms±0.00970.465ms±0.0091—~1.00x≈6.9%50
groupBy min/max0.531ms±0.00800.441ms±0.0053—~1.00x≈4.2%50
include list + nested to-one1.46ms±0.0290.337ms±0.032—4.32x***30.2%50
include list + nullable to-one2.59ms±0.0811.65ms±0.056—~1.00x≈11.9%50
include posts4.25ms±0.2162.35ms±0.1205.77ms1.81x2.45x D***18.9%50
include profile0.635ms±0.8710.540ms±0.2410.648ms~1.00x≈104.7%50
include 3 levels4.48ms±0.1484.03ms±0.1474.58ms~1.00x≈13.6%50
include 4 levels5.61ms±0.1823.39ms±0.1324.65ms1.65x1.37x D***13.9%50
include + where4.04ms±0.1762.88ms±0.3995.51ms~1.00x≈46.7%50
include + select nested2.52ms±0.1391.96ms±0.1854.42ms~1.00x≈31.8%50
findMany startsWith0.270ms±0.0280.140ms±0.0140.314ms~1.00x≈35.4%50
findMany endsWith0.563ms±0.0150.216ms±0.00690.369ms~1.00x≈11.1%50
findMany NOT contains0.627ms±0.0220.250ms±0.1040.447ms~1.00x≈121.8%50
findMany LIKE0.245ms±0.00940.111ms±0.00690.250ms~1.00x≈21.9%50
findMany <25.55ms±0.3987.55ms±0.29210.60ms3.39x1.40x D***13.4%50
findMany <=26.43ms±0.3717.78ms±0.22010.97ms3.40x1.41x D***10.2%50
findMany >15.55ms±0.5995.21ms±0.3566.78ms2.99x1.30x D***24.2%50
findMany NOT IN0.644ms±0.0130.282ms±0.0110.487ms~1.00x≈13.4%50
findMany isNot null0.642ms±0.0140.336ms±0.0170.362ms~1.00x≈18.6%50
orderBy multi-field4.99ms±0.1901.55ms±0.0761.88ms3.22x1.21x D***17.0%50
orderBy relation to-one4.10ms±0.1353.08ms±0.090—1.33x***10.2%50
orderBy relation + scalar5.02ms±0.2583.63ms±0.205—1.39x***20.0%50
orderBy nullable relation4.08ms±0.3002.94ms±0.181—1.39x***21.1%50
orderBy deep relation5.43ms±0.1864.04ms±0.174—1.34x***14.9%50
orderBy deep relation + scalar6.34ms±0.1354.62ms±0.100—1.37x***7.8%50
distinct status8.84ms±0.3761.56ms±0.181—5.66x***36.9%50
distinct multi12.04ms±0.1712.50ms±0.073—4.81x***10.3%50
cursor composite tuple1.61ms±0.0251.13ms±0.017—~1.00x≈5.3%50
cursor composite desc1.75ms±0.0371.31ms±0.021—~1.00x≈5.8%50
cursor prefix of orderBy2.70ms±0.1881.66ms±0.082—1.63x***18.1%50
select + include1.60ms±0.1010.309ms±0.0210.568ms5.16x1.84x D***24.6%50
_count relation1.74ms±0.3411.67ms±0.781—~1.00x≈123.8%50
_count multi-relation0.257ms±0.0290.218ms±0.045—~1.00x≈62.4%50
_count inside include2.32ms±0.1261.55ms±0.124—~1.00x≈32.0%50
_count inside nested select4.64ms±0.2023.69ms±0.266—~1.00x≈24.3%50
_count deep include5.49ms±0.2473.98ms±0.158—1.38x***14.1%50
ILIKE special chars0.425ms±0.0330.193ms±0.022—~1.00x≈36.5%50
LIKE case sensitive0.263ms±0.0100.110ms±0.0078—~1.00x≈24.0%50
findMany Date range0.424ms±0.0120.190ms±0.0120.321ms~1.00x≈21.1%50
count Date range1.14ms±0.0470.925ms±0.0520.995ms~1.00x≈19.8%50
findMany Date gte0.403ms±0.0250.178ms±0.00580.303ms~1.00x≈11.6%50
depth-1 low-fan0.566ms±0.0210.447ms±0.102—~1.00x≈73.7%50
depth-1 mid-fan4.21ms±0.1102.34ms±0.178—1.80x***26.3%50
depth-1 high-fan4.16ms±0.1222.25ms±0.130—1.85x***20.4%50
depth-1 wide3.11ms±0.1141.78ms±0.166—1.75x***31.3%50
depth-1 unbound39.65ms±3.789.43ms±0.884—4.21x***29.1%50
depth-24.78ms±0.1533.54ms±0.187—1.35x***18.6%50
depth-2 paginated Project→tasks3.16ms±0.1492.68ms±0.161—~1.00x≈20.6%50
depth-2 high-fan3.84ms±0.1852.86ms±0.229—~1.00x≈28.7%50
depth-2 wide4.90ms±0.1763.08ms±0.176—1.59x***20.6%50
depth-2 unbound65.60ms±1.5217.60ms±0.479—3.73x***4.4%10
depth-3 unbound15.32ms±0.2818.38ms±0.354—1.83x***15.8%50
depth-3 paginated2.44ms±0.1562.34ms±0.253—~1.00x≈32.7%50
depth-4 unbound9.96ms±0.2686.14ms±0.266—1.62x***15.7%50
depth-4 paginated3.42ms±0.1612.42ms±0.175—~1.00x≈23.6%50
findFirst depth-22.91ms±0.1142.30ms±0.173—~1.00x≈25.9%50
findUnique depth-2 Project→tasks→comment3.27ms±0.1132.16ms±0.173—1.52x***27.5%50
complex nested select4.51ms±0.4283.01ms±0.777—~1.00x≈65.7%50
ultra deep query15.94ms±0.5465.83ms±0.361—2.73x***22.0%50
transaction: (3 operations)3.00ms±0.2751.41ms±0.246—2.14x***53.2%50
*** p < 0.001** p < 0.01*  p < 0.05ns شماریاتی طور پر اہم نہیں≈ 1ms شور کی حد کے اندر± 95% اعتماد کا وقفہCV% > 15% = زیادہ تغیر
رن ٹائم موڈ کا بینچ مارک کیا گیا۔ پری رینڈرڈ موڈ رن ٹائم پر کوئری سے SQL کی تبدیلی کو مکمل طور پر چھوڑ دیتا ہے — یہاں دکھائی گئی لیٹنسی سے کم کی توقع کریں، خاص طور پر پیچیدہ کوئریز میں جہاں تبدیلی کی لاگت نسبتاً زیادہ ہوتی ہے۔

طریقۂ کار

  • –دوبارہ چلانے کے لیے: npm run bench (BENCHMARK_JSON_OUTPUT=1 JSON لکھتا ہے)۔ نتائج benchmark-results/summary-.json میں محفوظ ہوتے ہیں؛ v--latest.json اس صفحے کو ڈیٹا فراہم کرتی ہے۔
  • –ہر کوئری تمام کلائنٹس کے لیے ایک ہی ڈیٹابیس پر چلتی ہے: Prisma، prisma-sql، Drizzle۔ ہر ٹیسٹ کا سیمپل سائز n کالم میں دکھایا گیا ہے۔
  • –ہر فریق کے لیے رپورٹ کیا گیا: mean، median، stdDev، p95، p99، CV%۔ اہمیت کے لیے 1ms کی عملی حد کے ساتھ Welch کا t-test استعمال ہوتا ہے؛ ایرر بارز 95% اعتماد کا وقفہ ظاہر کرتے ہیں۔
  • –رن ٹائم موڈ ناپا گیا: SQL ہر ریکویسٹ پر تبدیل ہوتا ہے۔ پری رینڈرڈ (@optimize) کوئریز تبدیلی کو مکمل طور پر چھوڑ دیتی ہیں اور یہاں دکھائے گئے نتائج سے تیز ہوتی ہیں۔
  • –ہارڈ ویئر اور ورژنز ہر رن میں مختلف ہوتے ہیں - ہر JSON فائل کا اپنا ٹائم اسٹیمپ ہوتا ہے۔ ایک ہی مشین کے رنز کا موازنہ کریں۔

کیا تیز چلتا ہے، اور کیا Prisma میں ہی رہتا ہے

PostgreSQL اور SQLite پر ہر وہ Prisma Client فیچر جو ہم نے جانچا۔ رائٹ آپریشنز Prisma میں ہی رہتے ہیں؛ جہاں شکل معاون ہو وہاں ریڈ کوئریز SQL میں کمپائل کی جاتی ہیں۔

PostgreSQL
SQLite
ماڈل میتھڈزکوئری آپشنزفلٹرزترتیبایگریگیٹسکلائنٹ APIنتائج کی ٹائپس

جانچے گئے 73 فیچرز میں سے 25 PostgreSQL پر مکمل طور پر تیز شدہ ہیں۔ 19 Prisma سے مختلف نتیجہ دے سکتے ہیں؛ مکمل میپ میں ہر ایک وجہ کے ساتھ درج ہے۔

حیثیت کے لحاظ سے فیچرز کی تعداد
حیثیتPostgreSQLSQLite
تیز شدہ2521
جزوی66
فال بیک97
Prisma میں چلتا ہے77
مختلف ہو سکتا ہے1917
دستیاب نہیں24
صرف prisma-sql52
Prisma میں نہیں06
جانچا نہیں گیا03
مکمل پیریٹی میپ کھولیں
توثیق شدہہم درستگی کیسے یقینی بناتے ہیں؟معاون کوئریز کی PostgreSQL اور SQLite پر Prisma کے مقابل توثیق کی جاتی ہے، اور بینچ مارک رپورٹس Prisma v6، v7، v8، Drizzle اور تیار کردہ SQL کا احاطہ کرتی ہیں۔ٹیسٹنگ کا طریقۂ کار دیکھیں

یہ Prisma کو کیسے آپٹیمائز کرتی ہے

Prisma کی API اور ٹائپس برقرار رکھتے ہوئے Prisma کا ریڈ ایگزیکیوشن پاتھ بائی پاس کریں

  1. Prisma کوئریز کو انٹرسیپٹ کریں

    ایکسٹینشن ریڈ آپریشنز (findMany, findFirst, findUnique, count, aggregate, groupBy) کو چلنے سے پہلے پکڑ لیتی ہے

    generated/sql, اقتباس
    query: {
      $allModels: {
        async $allOperations({ model, operation, args, query }) {
          if (!ACCELERATED_METHODS.has(operation)) {
            return query(args)
          }
          return executeAccelerated(model, operation, args, query)
        },
      },
    }
  2. آپٹیمائزڈ SQL تیار کریں

    Prisma کوئریز کو آپٹیمائزڈ JOINs کے ساتھ تیز، پیرامیٹرائزڈ SQL میں تبدیل کریں

    PostgreSQL کے لیے SQL
    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"]
  3. براہِ راست چلائیں

    Prisma کا ریڈ اوور ہیڈ بائی پاس کرتے ہوئے کوئریز کو postgres.js یا better-sqlite3 کے ذریعے چلائیں

    generated/sql, اقتباس
    if (DIALECT === 'postgres') {
      await client.unsafe(sql, normalizedParams).forEach((row) => {
        results.push(row)
      })
      return results
    }
    
    const stmt = getOrPrepareStatement(client, sql)
    return stmt.all(...normalizedParams)
  4. مطابقت رکھنے والے نتائج واپس کریں

    نتائج Prisma کی متوقع شکل سے میل کھاتے ہیں۔ ٹائپس، IntelliSense اور موجودہ کوئری کوڈ میں کوئی تبدیلی نہیں ہوتی

    users.ts
    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 ویلیوز
    // مختلف ہو سکتی ہیں؛ پیریٹی میپ میں ہر کیس درج ہے۔
تصدیق شدہ محفوظہم SQL انجیکشن کو کیسے روکتے ہیں؟پیرامیٹر بائنڈنگ، اسکیما پر مبنی فیلڈ چیکس اور موجودہ سیکیورٹی ٹیسٹ سوٹ کے ساتھ کثیر سطحی توثیقسیکیورٹی کی تفصیلات دیکھیں

یہ Prisma ایکسٹینشن کیوں منتخب کریں؟

Prisma کا ڈیولپر تجربہ برقرار رکھتے ہوئے ریڈ کوئریز کے لیے خام SQL ایگزیکیوشن کی رفتار حاصل کریں

Prisma کی فوری تیزی
ایک بار کا سیٹ اپ Prisma ریڈ کوئریز کو تیز کر دیتا ہے۔ نہ ری فیکٹرنگ، نہ مائیگریشن، نہ ڈاؤن ٹائم۔
اپنی Prisma ٹائپس برقرار رکھیں
مکمل TypeScript سپورٹ برقرار رہتی ہے۔ ریڈ کوئریز تیز کرتے ہوئے ٹائپ انفرنس، آٹو کمپلیٹ اور کمپائل ٹائم سیفٹی محفوظ رہتی ہے۔
پروڈکشن میں آزمودہ حل
موجودہ پیریٹی ٹیسٹ حالیہ Prisma ورژنز پر معاون ریڈ کوئریز کی توثیق کرتے ہیں۔ اپنے Prisma ورژن اور ورک لوڈ کے ساتھ مطابقت جانچنے کے بعد اسے پروڈکشن ایپس میں استعمال کریں۔
متعدد ڈیٹابیسز کی سپورٹ
PostgreSQL (بشمول Neon، Supabase) اور SQLite پر Prisma ریڈ کوئریز کو آپٹیمائز کریں۔
پری کمپائلڈ آپشن
اختیاری جنریٹر بلڈ ٹائم پر SQL تیار کرتا ہے، جس سے آپ کی سب سے زیادہ استعمال ہونے والی کوئریز کا اوور ہیڈ مائیکرو سیکنڈز تک کم ہو جاتا ہے۔
سرور لیس کے لیے تیار (Node رن ٹائمز)
سرور لیس Node رن ٹائمز میں کام کرتا ہے۔ Edge رن ٹائم کی سپورٹ رن ٹائم کی پابندیوں اور آپ کے استعمال کردہ ڈرائیور پر منحصر ہے۔

تیز ریڈ کوئریز سے آگے

prisma-sql وہ صلاحیتیں شامل کرتا ہے جو Prisma Client میں نہیں ہیں۔ وہی ٹائپس، وہی کوڈ اسٹائل۔

$batch

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 }),
}))

@optimize

اپنی سب سے زیادہ استعمال ہونے والی کوئریز پہلے سے تیار کریں

schema.prisma میں کسی ماڈل پر اینوٹیشن لگائیں۔ generate کے وقت عین SQL پہلے سے تیار ہو جاتا ہے؛ رن ٹائم پر میل کھانے والی شکلیں تبدیلی کو مکمل طور پر چھوڑ دیتی ہیں۔

/// @optimize {
///   "method": "findMany",
///   "query": {
///     "where": { "status": "$status" },
///     "take": "$take"
///   }
/// }
model User { ... }

کارڈینیلٹی پلانر

حکمتِ عملی ڈیٹا کی بنیاد پر منتخب ہوتی ہے، اندازے سے نہیں

جمع کیے گئے ریلیشن کے اعداد و شمار فلیٹ JOINs، کوریلیٹڈ سب کوئریز اور where-in سیگمنٹڈ لوڈنگ کے درمیان حکمتِ عملی بدلنے کا تعین کرتے ہیں۔ بڑے چائلڈ ٹیبلز کبھی فی پیرنٹ اسکین کا سبب نہیں بنتے۔

prisma-sql-collect-stats \
  --output dist/planner.generated.js \
  --prisma-client dist/client/index.js

جب Prisma کی کارکردگی سب سے زیادہ اہم ہو

عام صورتیں جہاں یہ ایکسٹینشن حقیقی فرق ڈالتی ہے

اینالیٹکس اور رپورٹنگ

Prisma ایگریگیشنز اور groupBy آپریشنز براہِ راست SQL ایگزیکیوشن سے نمایاں فائدہ اٹھاتے ہیں

  • 5× تیز groupBy رپورٹس کو تیز کرتا ہے
  • تیز تر aggregate کوئریز
  • کم لیٹنسی کے ساتھ ریئل ٹائم میٹرکس

زیادہ ٹریفک والی APIs

لوڈ کے تحت فی کوئری اوور ہیڈ بڑھتا جاتا ہے، خاص طور پر ریڈ پر مبنی اینڈ پوائنٹس پر

  • API کے رسپانس ٹائمز میں کمی
  • ہر انسٹینس پر زیادہ ریکویسٹس ہینڈل کریں
  • انفراسٹرکچر کے اخراجات کم کریں

سرور لیس فنکشنز

سرور لیس میں ہر ملی سیکنڈ اہم ہے: جہاں ضرورت ہو وہاں ریڈ لیٹنسی کم کریں

  • ریڈ کوئریز پر بہتر p95/p99
  • تیز ریڈ کوئریز سے کم اخراجات
  • ری فیکٹر کے بغیر تیز ریڈ کوئریز

موبائل بیک اینڈز

صارفین لیٹنسی محسوس کرتے ہیں: تیز ریڈ کوئریز سے محسوس ہونے والا UX فوراً بہتر ہوتا ہے

  • فیڈ کی تیز لوڈنگ
  • تیز پیجینیشن
  • زیادہ ریسپانسیو انٹرایکشنز

3 مراحل میں Prisma آپٹیمائز کریں

60 سیکنڈ سے کم میں Prisma ریڈ کوئریز تیز کریں

  1. Prisma ایکسٹینشن انسٹال کریں

    Terminal
    # PostgreSQL
    npm install prisma-sql postgres
    
    # SQLite
    npm install prisma-sql better-sqlite3
  2. Prisma Client میں ایکسٹینشن شامل کریں

    schema.prisma
    generator client {
      provider = "prisma-client"
    }
    
    generator sql {
      provider = "prisma-sql-generator"
    }
    Terminal
    npx prisma generate
    db.ts
    import { 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>
  3. Prisma کو معمول کے مطابق استعمال کریں

    users.ts
    const users = await prisma.user.findMany({
      where: { status: 'ACTIVE' },
      include: { posts: true },
    })

SQLite: better-sqlite3 ڈیٹابیس کے ساتھ speedExtension({ sqlite: db }) پاس کریں۔مکمل سیٹ اپ گائیڈ

Prisma کارکردگی: عمومی سوالات

Prisma ریڈ کوئریز کو آپٹیمائز کرنے کے بارے میں عام سوالات

Prisma میں اوور ہیڈ کیوں ہوتا ہے؟

Prisma اس لیے اوور ہیڈ بڑھاتا ہے کہ یہ اسکیما پر مبنی توثیق، یکساں کوئری رویہ اور نتائج کو شکل دینے جیسی API ضمانتیں نافذ کرتا ہے۔ یہ لیئرز بہترین ڈیولپر تجربہ دیتی ہیں، لیکن خام SQL براہِ راست چلانے کے مقابلے میں وقت لیتی ہیں۔

میں Prisma کوئریز کو کیسے آپٹیمائز کروں؟

ریڈ پر مبنی Prisma ورک لوڈز کو یہ ایکسٹینشن شامل کر کے آپٹیمائز کریں۔ یہ Prisma کی API اور ٹائپس برقرار رکھتے ہوئے ریڈ آپریشنز کو postgres.js یا better-sqlite3 کے ذریعے براہِ راست SQL سے چلاتی ہے۔ سیٹ اپ انیشیلائزیشن میں ایک چھوٹی سی تبدیلی ہے اور موجودہ کوئریز کو ری فیکٹر کرنے کی ضرورت نہیں۔

کیا Prisma خام SQL سے سست ہے؟

کئی ریڈ ورک لوڈز میں، ہاں۔ خام SQL ایگزیکیوشن کے مقابلے میں آرکیٹیکچرل اوور ہیڈ موجود ہے۔ اس ایکسٹینشن کا مقصد Prisma کا DX برقرار رکھتے ہوئے SQL براہِ راست چلا کر ریڈ لیٹنسی کم کرنا ہے۔

کیا میں موجودہ کوئریز بدلے بغیر Prisma تیز کر سکتا ہوں؟

جی ہاں۔ Prisma Client کی انیشیلائزیشن کے دوران ایک بار ایکسٹینشن شامل کریں اور اپنا موجودہ Prisma کوئری کوڈ ویسے ہی رہنے دیں۔ ریڈ آپریشنز تیز چلتے ہیں جبکہ آپ کی Prisma API، ٹائپس اور اسکیما وہی رہتے ہیں۔

کیا یہ پروڈکشن میں کام کرتا ہے؟

جی ہاں، یہ معاون ریڈ پاتھس پر پروڈکشن استعمال کے لیے بنایا گیا ہے۔ رول آؤٹ سے پہلے ہمیشہ اپنے Prisma ورژن کے ساتھ مطابقت کی تصدیق کریں اور اپنے ریگریشن ٹیسٹ چلائیں۔

Prisma ایگریگیشنز سست کیوں ہوتی ہیں؟

ایگریگیشنز اور groupBy اکثر مقررہ اوور ہیڈ (کوئری پروسیسنگ اور نتائج کو شکل دینا) کو بڑھا دیتے ہیں اور ان میں بڑے درمیانی رزلٹ سیٹس شامل ہو سکتے ہیں۔ یہ ایکسٹینشن براہِ راست SQL تیار کر کے ان ریڈ کوئریز کو آپٹیمائز کرتی ہے، جس سے عموماً ایگریگیشن پر مبنی اینڈ پوائنٹس پر لیٹنسی کم ہوتی ہے۔

Prisma تیز کرنے کے لیے تیار ہیں؟

معاون PostgreSQL اور SQLite ریڈ کوئریز کے لیے موجودہ بینچ مارک ٹیبل دیکھیں