Django ORM క్వెరీలను ఆప్టిమైజ్ చేయడం
Django ORM డేటాబేస్ పనులను సులభతరం చేస్తుంది. కానీ ఇది ఒక ప్రమాదాన్ని దాచిపెడుతుంది. మీరు సంబంధిత ఆబ్జెక్ట్లను (related objects) సరిగ్గా ఫెచ్ చేయకపోతే, N+1 క్వెరీ సమస్య ఏర్పడుతుంది.
దీని అర్థం ఏమిటంటే, మీరు 100 పోస్ట్లను ఫెచ్ చేస్తే, మీ యాప్ 101 క్వెరీలను రన్ చేయవచ్చు. ఇది మీ యాప్ వేగాన్ని గణనీయంగా తగ్గిస్తుంది.
దీనిని పరిష్కరించడానికి ఈ రెండు సాధనాలను ఉపయోగించండి:
- select_related
దీనిని ForeignKey మరియు OneToOneField కోసం ఉపయోగించండి.
ఇది SQL JOINని ఉపయోగిస్తుంది. ఇది సంబంధిత డేటాను ఒకే క్వెరీలో తీసుకువస్తుంది.
- ఉదాహరణ: Post కి ఒక Author ఉంటారు.
- సాధారణ పద్ధతి: 100 పోస్ట్ల కోసం 101 క్వెరీల.
- ఆప్టిమైజ్ చేసిన పద్ధతి: .select_related("author") ఉపయోగించి 1 క్వెరీ.
- prefetch_related
దీనిని ManyToManyField మరియు రివర్స్ ForeignKeys కోసం ఉపయోగించండి.
ఇది విడివిడి క్వెరీలను రన్ చేసి, వాటిని Pythonలో కలుపుతుంది.
- ఉదాహరణ: Post కి చాలా Tags ఉంటాయి.
- సాధారణ పద్ధతి: పోస్ట్ల కోసం 1 క్వెరీ + ప్రతి పోస్ట్ యొక్క ట్యాగ్ల కోసం ఒక్కో క్వెరీ.
- ఆప్టిమైజ్ చేసిన పద్ధతి: .prefetch_related("tags") ఉపయోగించి మొత్తం 2 క్వెరీలు.
ప్రో టిప్స్ (Pro Tips):
- మీ లూప్లోకి వెళ్లే ముందే సంబంధిత డేటాను ఫిల్టర్ చేయడానికి Prefetch ఆబ్జెక్ట్ను ఉపయోగించండి.
- వాటిని చైన్ (chain) చేయండి. ఒకేసారి authors మరియు tags పొందడానికి ఒకే querysetలో రెండింటినీ ఉపయోగించవచ్చు.
- లూప్ లోపల prefetched రిలేషన్షిప్పై .filter()ని పిలవడాన్ని నివారించండి. ఇది క్యాచీని (cache) దాటవేసి, మళ్ళీ డేటాబేస్ను హిట్ చేస్తుంది.
- మీకు కావాల్సిన కాలమ్స్ను మాత్రమే ఫెచ్ చేయడానికి select_relatedతో పాటు .only()ని ఉపయోగించండి.
సారాంశం (Summary):
- ForeignKey / OneToOne: select_related ఉపయోగించండి.
- ManyToMany / Reverse FK: prefetch_related ఉపయోగించండి.
ఈ సమస్యలను ముందుగానే గుర్తించడానికి django-debug-toolbarతో మీ క్వెరీ కౌంట్లను తనిఖీ చేయండి.
మూలం (Source): https://dev.to/fhva29/optimizing-django-orm-queries-a-practical-guide-to-selectrelated-and-prefetchrelated-1gpl