మాడ్యూల్ పాఠాలు (4/4)
N+1 సమస్య
బ్యాకెండ్ డెవలప్మెంట్లో, API పనితీరును విపత్తుగా ట్యాంక్ చేసే అత్యంత తరచుగా జరిగే పొరపాట్లలో ఒకటి అపఖ్యాతి పాలైన "N + 1 ప్రశ్నలు" సమస్య.
Node.js నుండి డేటాబేస్తో మాట్లాడటానికి "ORMలు" (ఆబ్జెక్ట్-రిలేషనల్ మ్యాపర్లు: ఉదా. ప్రిస్మా లేదా సీక్వెలైజ్) వంటి లైబ్రరీ సారాంశాలను ఉపయోగిస్తున్న డెవలపర్కు ఇది సాధారణంగా తెలియదు.
అనాటమీ ఆఫ్ ది డిజాస్టర్
ఒక యాప్ మొత్తం ఇ-కామర్స్ హోమ్పేజీ జాబితాను తిరిగి ఇవ్వాలనుకుంటోందని ఊహించండి: అన్ని ఉత్పత్తులు మరియు ప్రతి ఒక్కటి చెందిన వర్గం పేరు యొక్క స్ట్రింగ్. Node.js వైపు నుండి చూస్తే, అనుభవం లేని ప్రోగ్రామర్ పునరావృత లూప్ను వ్రాస్తాడు:
products = await db.query("SELECT * FROM products");(ఒక పెద్ద, భారీ ఆపరేషన్ 1)- డెవలపర్ కనుగొనబడిన 100 శ్రేణిలో ప్రతి
productకంటే (for..of) మళ్ళిస్తుంది - ప్రతి దశలోనూ, 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" గందరగోళాన్ని పరిష్కరించే ఏకైక, అజేయమైన ప్రశ్నలో అమలులను మిల్లీసెకన్లలో కలపండి:
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 వలె చేరిన మొత్తం కాంప్లెక్స్ను తిరిగి అందించడానికి మిమ్మల్ని అనుమతిస్తాయి, మీ JavaScript ఏ స్థానిక స్క్రిప్ట్ జిగురు లేకుండా ఆకృతీకరించిన సమీక్షల ఉప-శ్రేణితో సహా products శ్రేణిని స్వీకరించడానికి అనుమతిస్తుంది! (అధునాతన మార్గాలు మరియు సవాళ్లలో మీరు Postgres యొక్క JSONb నిబంధనను అధ్యయనం చేస్తారు.)
మీ వంతు
మేకింగ్లో ఉన్న నిజమైన N+1 సమస్యను పరిష్కరిద్దాం.\nనోడ్ ఈ ఉదయం షిప్పింగ్ చేసిన ఆర్డర్ల రీక్యాప్ కావాలనుకుంటే ప్రతి కస్టమర్కి వారి పేర్లను కనుగొనడానికి గ్లోబల్ సెలెక్ట్ని అమలు చేసి, ఆపై దాన్ని మళ్లీ మళ్లీ చూపుతుంది.\n'కస్టమర్లు' (అసలు టెక్స్ట్వల్ అలియాస్ 'c'ని ఉపయోగించండి) మరియు 'అసలు టెక్స్ట్వల్ అలియాస్ 'c'ని ఉపయోగించండి)\nఒక స్థానిక షాట్లో నన్ను ప్రింట్ చేయడం ద్వారా దాన్ని పరిష్కరించండి. ట్రివియల్ ఫీల్డ్లు (ఫార్మల్ అలియాస్ ప్రిఫిక్సింగ్ను బలవంతం చేయడం): 'c.first_name' (కస్టమర్ నుండి) మరియు 'o.status' (పెండింగ్ ఆర్డర్ నుండి).
సూచనను చూపించు
సింటాక్స్: c.first_name, o.status ను కస్టమర్ల నుండి ఎంచుకోండి c. ON c.id = o.customer_id;
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
సమర్ధత ద్వారా సమూహాన్ని అన్వేషించడం
ప్రతి అడ్డు వరుస మరియు వర్గానికి మొత్తం గణనను పొందడానికి డేటాబేస్లో లాజికల్ గ్రూప్-బైలు ఉపయోగించబడకపోతే, Node.js DBని అనంతంగా కాల్ చేస్తుంది, N+1లోకి దూసుకుపోతుంది.\n'కస్టమర్లు' నుండి 'సిటీ' ఫీల్డ్ను ఎంచుకునే ఒక ప్రశ్నను వ్రాయండి మరియు టెర్మినల్గాగ్రీగ్ నేమ్ ద్వారా యూనిక్గా ఉండే కీవర్డ్ని ఉపయోగించి ప్రామాణిక పోస్ట్గ్రెస్ కౌంట్ 'COUNT(id)'.
సూచనను చూపించు
అల్పమైనది: నగరాన్ని ఎంపిక చేసుకోండి, నగరాల వారీగా కస్టమర్ల నుండి COUNT(id);
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది