Django ORM క్వెరీలను ఆప్టిమైజ్ చేయడం

Django ORM డేటాబేస్ పనులను సులభతరం చేస్తుంది. కానీ ఇది ఒక ప్రమాదాన్ని దాచిపెడుతుంది. మీరు సంబంధిత ఆబ్జెక్ట్‌లను (related objects) సరిగ్గా ఫెచ్ చేయకపోతే, N+1 క్వెరీ సమస్య ఏర్పడుతుంది.

దీని అర్థం ఏమిటంటే, మీరు 100 పోస్ట్‌లను ఫెచ్ చేస్తే, మీ యాప్ 101 క్వెరీలను రన్ చేయవచ్చు. ఇది మీ యాప్ వేగాన్ని గణనీయంగా తగ్గిస్తుంది.

దీనిని పరిష్కరించడానికి ఈ రెండు సాధనాలను ఉపయోగించండి:

  1. select_related

దీనిని ForeignKey మరియు OneToOneField కోసం ఉపయోగించండి.

ఇది SQL JOINని ఉపయోగిస్తుంది. ఇది సంబంధిత డేటాను ఒకే క్వెరీలో తీసుకువస్తుంది.

  • ఉదాహరణ: Post కి ఒక Author ఉంటారు.
  • సాధారణ పద్ధతి: 100 పోస్ట్‌ల కోసం 101 క్వెరీల.
  • ఆప్టిమైజ్ చేసిన పద్ధతి: .select_related("author") ఉపయోగించి 1 క్వెరీ.
  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