Django ORM வினவல்களை (Queries) மேம்படுத்துதல்

Django ORM தரவுத்தளப் பணிகளை எளிதாக்குகிறது. ஆனால் இதில் ஒரு ஆபத்து மறைந்துள்ளது. நீங்கள் தொடர்புடைய பொருட்களை (related objects) சரியாகக் கையாளவில்லை என்றால், அது N+1 query சிக்கலை உருவாக்கும்.

அதாவது, நீங்கள் 100 பதிவுகளைப் (posts) பெற முயன்றால், உங்கள் செயலி 101 வினவல்களை இயக்கக்கூடும். இது உங்கள் செயலியை மிகவும் மெதுவாக்கும்.

இதைச் சரிசெய்ய இந்த இரண்டு கருவிகளைப் பயன்படுத்தவும்:

  1. select_related

இதை ForeignKey மற்றும் OneToOneField ஆகியவற்றிற்குப் பயன்படுத்தவும்.

இது ஒரு SQL JOIN-ஐப் பயன்படுத்துகிறது. இது தொடர்புடைய தரவை ஒரே வினவலில் பெறுகிறது.

  • உதாரணம்: Post-க்கு ஒரு Author உண்டு.
  • சாதாரண முறை: 100 பதிவுகளுக்கு 101 வினவல்கள்.
  • மேம்படுத்தப்பட்ட முறை: .select_related("author") மூலம் 1 வினவல்.
  1. prefetch_related

இதை ManyToManyField மற்றும் reverse ForeignKeys ஆகியவற்றிற்குப் பயன்படுத்தவும்.

இது தனித்தனி வினவல்களை இயக்கி, அவற்றை Python-இல் இணைக்கிறது.

  • உதாரணம்: Post-க்கு பல Tags உண்டு.
  • சாதாரண முறை: பதிவுகளுக்கு 1 வினவல் + ஒவ்வொரு பதிவின் Tags-களுக்கும் தலா 1 வினவல்.
  • மேம்படுத்தப்பட்ட முறை: .prefetch_related("tags") மூலம் மொத்தம் 2 வினவல்கள்.

Pro Tips:

  • உங்கள் லூப்பிற்குள் (loop) நுழைவதற்கு முன்பே தொடர்புடைய தரவை வடிகட்ட Prefetch பொருளைப் பயன்படுத்தவும்.
  • அவற்றை ஒன்றாகச் சங்கிலித் தொடராக (chain) இணைக்கலாம். ஒரே queryset-இல் authors மற்றும் tags இரண்டையும் ஒரே நேரத்தில் பெற இரண்டையும் பயன்படுத்தலாம்.
  • ஒரு லூப்பிற்குள், ஏற்கனவே prefetch செய்யப்பட்ட உறவின் (relationship) மீது .filter() முறையை அழைப்பதைத் தவிர்க்கவும். இது cache-ஐத் தவிர்த்து மீண்டும் தரவுத்தளத்தைத் தொடர்பு கொள்ளும்.
  • உங்களுக்குத் தேவையான நெடுவரிசைகளை (columns) மட்டும் பெற 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