முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 10 · பாடம் 4 இன் 4பாடத்திட்டத்தில் 40/57~12 min
தொகுதி பாடங்கள் (4/4)

N+1 பிரச்சனை

பின்தள மேம்பாட்டில், API செயல்திறனை பேரழிவு தரும் வகையில் அடிக்கடி செய்யும் தவறுகளில் ஒன்று பிரபலமற்ற "N + 1 வினவல்கள்" பிரச்சனை.

Node.js இலிருந்து தரவுத்தளத்துடன் பேச, "ORMs" (பொருள்-தொடர்புடைய வரைபடங்கள்: எ.கா. Prisma அல்லது Sequelize) போன்ற லைப்ரரி சுருக்கங்களைப் பயன்படுத்தும் டெவலப்பருக்கு இது பொதுவாகத் தெரியவில்லை.

பேரழிவின் உடற்கூறியல்

ஒரு பயன்பாடு முழு ஈ-காமர்ஸ் முகப்புப் பட்டியலையும் திரும்பப் பெற விரும்புகிறது என்று கற்பனை செய்து பாருங்கள்: அனைத்து தயாரிப்புகளும் ஒவ்வொன்றும் சேர்ந்த வகைப் பெயரின் சரத்துடன். Node.js பக்கத்திலிருந்து பார்த்தால், ஒரு அனுபவமற்ற ப்ரோக்ராமர் மறுசுழற்சி வளையத்தை எழுதுவார்:

  1. products = await db.query("SELECT * FROM products"); (ஒரு பெரிய, பருமனான செயல்பாடு 1)
  2. டெவெலப்பர் கண்டறியப்பட்ட 100 வரிசையில் ஒவ்வொரு productக்கும் (for..of) மீண்டும் செய்கிறார்
  3. ஒவ்வொரு அடியிலும், Node.js இல் அவர்கள் categoryName = await db.query("SELECT name FROM categories WHERE id = " + product.category_id); மீண்டும் ஒரு துணை வினவலுக்காக காத்திருக்கிறார்கள் மற்றும் அதை முடிவில் உட்பொதிக்கிறார்கள் (N மெதுவான, சிறிய வினவல்களின் இரண்டாம் மறு செய்கைகள்!)

** Postgres டீமானுக்கான மொத்த கோரிக்கைகள்:** 1 + 100 உள்ளூர் மறு செய்கைகள் = 101 Node.js மற்றும் DB க்கு இடையே மைக்ரோ நெட்வொர்க் சுற்றுப் பயணங்கள். 101 சுற்று பயணங்கள் பயங்கரமான நெட்வொர்க் மேல்நிலை மற்றும் அசிங்கமான தாமதத்தை ஏற்படுத்துகின்றன. உண்மையான அளவில், N ஆனது 100 ஆக இல்லாமல் 10,000 வரிசைகளாக இருக்கலாம். 5xx நேரம் முடிவடைவதற்கு முன்பு API திரும்பாது.

உண்மையான பூர்வீக பதில்: ஒரே வினவலில் சேர் அல்லது ஒருங்கிணைத்தல்

முனையில் உள்ள அற்பமான ORM கட்டளைகளுக்குப் பதிலாக, கையால் எழுதப்பட்ட DBMS சுருக்கங்களைத் திறமையாகப் பயன்படுத்தி, "N+1" குழப்பத்தைத் தீர்க்கும் ஒற்றை, தோற்கடிக்க முடியாத வினவலில் செயல்படுத்தல்களை மில்லி விநாடிகளில் ஒன்றாக இணைக்கிறது:

Code
SELECT
  p.id,
  p.name,
  c.name AS category_name
FROM products p
JOIN categories c ON p.category_id = c.id;

மொத்த API/DB சுற்றுப் பயணங்கள்: 1 தனிப்பட்ட வினவல், இணைக்கப்பட்டது, போஸ்ட்கிரெஸின் சொந்தக் குறியீடுகளால் கணித ரீதியாக மேம்படுத்தப்பட்டது, 0 மில்லி விநாடிகள் கூடுதல் நெட்வொர்க் தாமதத்துடன் முழுமையாகக் கையாளப்படுகிறது.

JSON திரட்டல் மாற்று

நவீன போஸ்ட்கிரெஸ் பதிப்புகள், json_agg உடன் JSON ஆக உள்ளமைக்கப்பட்ட முழு தொகுப்பையும் திரும்பப் பெற உங்களை அனுமதிக்கின்றன, மேலும் உள்ளூர் ஸ்கிரிப்ட் பசை இல்லாமல் வடிவமைக்கப்பட்ட மதிப்புரைகளின் துணை வரிசை உட்பட products வரிசையைப் பெற உங்கள் JavaScript ஐ அனுமதிக்கிறது! (மேம்பட்ட பாதைகள் மற்றும் சவால்களில் நீங்கள் Postgres இன் JSONb விதியைப் படிப்பீர்கள்.)

உங்கள் முறை

உடற்பயிற்சி#sql.m10.l4.e1
முயற்சிகள்: 0ஏற்றுகிறது…

தயாரிப்பில் உள்ள உண்மையான N+1 சிக்கலைத் தீர்ப்போம்.\nஇன்று காலை அனுப்பப்பட்ட ஆர்டர்களை மறுபரிசீலனை செய்ய விரும்பினால், ஒவ்வொரு வாடிக்கையாளருக்கும் அவர்களின் பெயர்களைக் கண்டறிய முனை உலகளாவிய தேர்வை இயக்கியிருக்கும்.\n'வாடிக்கையாளர்கள்' (அசல் டெக்ஸ்ட்வல் 'c' மற்றும் 'ஆல்எக்ஸ்டோ' எனப் பயன்படுத்தவும். அற்பமான புலங்கள் (முறையான மாற்றுப்பெயர் முன்னொட்டை கட்டாயப்படுத்துதல்): 'c.first_name' (வாடிக்கையாளரிடமிருந்து) மற்றும் 'o.status' (நிலுவையில் உள்ள வரிசையில் இருந்து).

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

தொடரியல்: c.first_name, o.status from வாடிக்கையாளர்கள் c. ON c.id = o.customer_id;

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

செயல்திறன் மூலம் குழுவை ஆராய்தல்

உடற்பயிற்சி#sql.m10.l4.e2
முயற்சிகள்: 0ஏற்றுகிறது…

ஒரு வரிசை மற்றும் வகைக்கான மொத்த எண்ணிக்கையைப் பெற தரவுத்தளத்தில் தருக்கக் குழு-Bys பயன்படுத்தப்படவில்லை எனில், Node.js ஆனது DBயை முடிவில்லாமல் N+1 ஆக அழைக்கும்.\n'வாடிக்கையாளர்கள்' என்பதிலிருந்து 'நகரம்' புலத்தைத் தேர்ந்தெடுக்கும் ஒரு வினவலையும் டெர்மினல் கீவேர்ட் மூலம் தனித்துவமான குறிச்சொல்லைப் பயன்படுத்தி 'COUNT(id)' என்ற நிலையான Postgres எண்ணையும் எழுதவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

அற்பமானது: நகரத்தைத் தேர்ந்தெடு, வாடிக்கையாளர்களின் எண்ணிக்கை (ஐடி) நகரத்தின் அடிப்படையில்;

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்