धीमी 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 },
})
prisma-sql द्वारा चलाया जाने वाला 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 ORM के साथ पाना कठिन था।

  2. ⚡ 2020–2022: तेज़ विकास और फ़ीचर विस्तार

    Prisma ने nested writes, ट्रांज़ैक्शन और middleware जैसे शक्तिशाली फ़ीचर जोड़े। फ़ीचर सेट बढ़ा, लेकिन हर क्वेरी को अब भी एक आर्किटेक्चरल लागत चुकानी पड़ती थी: क्वेरी को दर्शाया, सत्यापित और निष्पादित किया जाता है, और परिणामों को Prisma API के अनुरूप आकार दिया जाता है।

  3. 📊 2023: बड़े पैमाने पर ओवरहेड दिखने लगा

    जैसे-जैसे अधिक टीमों ने Prisma को हाई-ट्रैफ़िक वर्कलोड में डिप्लॉय किया, प्रति-क्वेरी स्थिर ओवरहेड मापने योग्य हो गया। यह रीड-भारी एंडपॉइंट, एनालिटिक्स, एग्रीगेशन और बड़े परिणाम सेट पर सबसे अधिक दिखता है। यह ओवरहेड कोई बग नहीं है; यह Prisma की गारंटी और API व्यवहार की कीमत है।

  4. 🚀 2024–2025: Prisma का परफ़ॉर्मेंस पर काम जारी

    Prisma ने परफ़ॉर्मेंस और इंजन बदलावों पर केंद्रित बड़े अपडेट जारी किए। सुधारों के बावजूद, raw 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)Drizzle की तुलना में 1.56×
    1.99×

    Prisma v6 (6.19.3): Prisma की तुलना में 1.99× औसत गति वृद्धि

    95 मापे गए क्वेरी केस, Prisma की तुलना में औसत30 सित॰ 2026
  • Prisma v7 (7.10.0)Drizzle की तुलना में 1.51×
    1.47×

    Prisma v7 (7.10.0): Prisma की तुलना में 1.47× औसत गति वृद्धि

    95 मापे गए क्वेरी केस, Prisma की तुलना में औसत30 सित॰ 2026
  • Prisma v8 (8.1.0-dev.1)Drizzle की तुलना में 1.63×
    1.54×

    Prisma v8 (8.1.0-dev.1): Prisma की तुलना में 1.54× औसत गति वृद्धि

    95 मापे गए क्वेरी केस, Prisma की तुलना में औसत30 सित॰ 2026

SQLite

प्रति रन 84 क्वेरी केस
  • Prisma v6 (6.19.3)Drizzle की तुलना में 1.79×
    4.80×

    Prisma v6 (6.19.3): Prisma की तुलना में 4.80× औसत गति वृद्धि

    84 मापे गए क्वेरी केस, Prisma की तुलना में औसत30 सित॰ 2026
  • Prisma v7 (7.10.0)Drizzle की तुलना में 1.84×
    2.29×

    Prisma v7 (7.10.0): Prisma की तुलना में 2.29× औसत गति वृद्धि

    84 मापे गए क्वेरी केस, Prisma की तुलना में औसत30 सित॰ 2026
  • Prisma v8 (8.1.0-dev.1)Drizzle की तुलना में 1.63×
    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 बिल्ड-टाइम पर जनरेट होता है — रनटाइम बिना किसी रूपांतरण ओवरहेड के raw पैरामीटराइज़्ड क्वेरी निष्पादित करता है।

PostgreSQLPrisma v6 (6.19.3)

Prisma की तुलना में औसत 1.99xDrizzle की तुलना में औसत 1.56x35/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 कॉलम में दिखाया गया है।
  • –हर पक्ष के लिए दर्ज: माध्य, माध्यिका, 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 और टाइप बनाए रखते हुए उसके रीड निष्पादन पथ को बायपास करें

  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 क्वेरी को ऑप्टिमाइज़्ड JOIN के साथ तेज़, पैरामीटराइज़्ड 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 का डेवलपर अनुभव बनाए रखते हुए रीड क्वेरी के लिए raw 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 { ... }

कार्डिनैलिटी प्लानर

रणनीति डेटा से चुनी जाती है, अनुमान से नहीं

एकत्रित रिलेशन आँकड़ों के आधार पर फ़्लैट जॉइन, कोरिलेटेड सबक्वेरी और where-in सेगमेंटेड लोडिंग के बीच रणनीति बदली जाती है। बड़ी चाइल्ड टेबल कभी प्रति-पैरेंट स्कैन ट्रिगर नहीं करतीं।

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

Prisma परफ़ॉर्मेंस सबसे ज़्यादा कब मायने रखती है

आम परिदृश्य जहाँ यह एक्सटेंशन वास्तविक अंतर लाता है

एनालिटिक्स और रिपोर्टिंग

Prisma के एग्रीगेशन और groupBy ऑपरेशन को सीधे SQL निष्पादन से काफ़ी लाभ मिलता है

  • 5× तेज़ groupBy से रिपोर्ट तेज़ बनती हैं
  • तेज़ aggregate क्वेरी
  • कम लेटेंसी के साथ रियल-टाइम मेट्रिक्स

हाई-ट्रैफ़िक API

लोड के तहत प्रति-क्वेरी ओवरहेड बढ़ता जाता है, खासकर रीड-भारी एंडपॉइंट पर

  • कम API रिस्पॉन्स टाइम
  • प्रति इंस्टेंस अधिक रिक्वेस्ट संभालें
  • इंफ़्रास्ट्रक्चर लागत घटाएँ

सर्वरलेस फ़ंक्शन

सर्वरलेस में हर मिलीसेकंड मायने रखता है: जहाँ ज़रूरी हो वहाँ रीड लेटेंसी घटाएँ

  • रीड क्वेरी पर बेहतर p95/p99
  • तेज़ रीड क्वेरी से कम लागत
  • रीफ़ैक्टर के बिना तेज़ रीड क्वेरी

मोबाइल बैकएंड

उपयोगकर्ता लेटेंसी महसूस करते हैं: तेज़ रीड क्वेरी से अनुभव तुरंत बेहतर लगता है

  • तेज़ फ़ीड लोडिंग
  • तेज़ पेजिनेशन
  • अधिक रिस्पॉन्सिव इंटरैक्शन

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 परफ़ॉर्मेंस FAQ

Prisma रीड क्वेरी ऑप्टिमाइज़ करने के बारे में आम सवाल

Prisma में ओवरहेड क्यों होता है?

Prisma ओवरहेड जोड़ता है क्योंकि यह स्कीमा-आधारित सत्यापन, सुसंगत क्वेरी व्यवहार और परिणामों को आकार देने जैसी API गारंटी लागू करता है। ये लेयर बढ़िया डेवलपर अनुभव देती हैं, लेकिन raw SQL को सीधे निष्पादित करने की तुलना में समय लेती हैं।

मैं Prisma क्वेरी को कैसे ऑप्टिमाइज़ करूँ?

रीड-भारी Prisma वर्कलोड को यह एक्सटेंशन जोड़कर ऑप्टिमाइज़ करें। यह Prisma का API और टाइप बनाए रखते हुए रीड ऑपरेशन को postgres.js या better-sqlite3 के ज़रिए सीधे SQL से निष्पादित करता है। सेटअप इनिशियलाइज़ेशन में एक छोटा बदलाव है और इसके लिए मौजूदा क्वेरी को रीफ़ैक्टर करने की ज़रूरत नहीं होती।

क्या Prisma, raw SQL से धीमा है?

कई रीड वर्कलोड के लिए, हाँ। raw SQL निष्पादन की तुलना में आर्किटेक्चरल ओवरहेड होता है। यह एक्सटेंशन SQL को सीधे निष्पादित करके, Prisma का DX बनाए रखते हुए रीड लेटेंसी घटाने का लक्ष्य रखता है।

क्या मैं मौजूदा क्वेरी बदले बिना Prisma तेज़ कर सकता हूँ?

हाँ। Prisma Client के इनिशियलाइज़ेशन के दौरान एक बार एक्सटेंशन जोड़ें और अपना मौजूदा Prisma क्वेरी कोड अपरिवर्तित रखें। रीड ऑपरेशन तेज़ चलते हैं, जबकि आपका Prisma API, टाइप और स्कीमा वही रहते हैं।

क्या यह प्रोडक्शन में काम करता है?

हाँ, इसे समर्थित रीड पथों पर प्रोडक्शन उपयोग के लिए बनाया गया है। रोलआउट से पहले हमेशा अपने Prisma संस्करण के साथ संगतता जाँचें और अपने रिग्रेशन टेस्ट चलाएँ।

Prisma एग्रीगेशन धीमे क्यों होते हैं?

एग्रीगेशन और groupBy अक्सर स्थिर ओवरहेड (क्वेरी प्रोसेसिंग और परिणामों को आकार देना) को बढ़ा देते हैं और इनमें बड़े मध्यवर्ती परिणाम सेट शामिल हो सकते हैं। यह एक्सटेंशन सीधे SQL जनरेट करके इन रीड क्वेरी को ऑप्टिमाइज़ करता है, जिससे आमतौर पर एग्रीगेशन-भारी एंडपॉइंट पर लेटेंसी घटती है।

Prisma तेज़ करने के लिए तैयार?

समर्थित PostgreSQL और SQLite रीड क्वेरी के लिए मौजूदा बेंचमार्क तालिका देखें