Django ORM Queries ਨੂੰ Optimize ਕਰਨਾ

Django ORM ਡਾਟਾਬੇਸ ਦੇ ਕੰਮ ਨੂੰ ਆਸਾਨ ਬਣਾਉਂਦਾ ਹੈ। ਪਰ ਇਹ ਇੱਕ ਖ਼ਤਰਾ ਵੀ ਛੁਪਾਉਂਦਾ ਹੈ। ਜੇਕਰ ਤੁਸੀਂ ਸਬੰਧਤ (related) objects ਨੂੰ ਗਲਤ ਤਰੀਕੇ ਨਾਲ fetch ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਸੀਂ N+1 query ਦੀ ਸਮੱਸਿਆ ਪੈਦਾ ਕਰਦੇ ਹੋ।

ਇਸਦਾ ਮਤਲਬ ਹੈ ਕਿ ਜੇਕਰ ਤੁਸੀਂ 100 posts fetch ਕਰਦੇ ਹੋ, ਤਾਂ ਤੁਹਾਡੀ app 101 queries ਚਲਾ ਸਕਦੀ ਹੈ। ਇਹ ਤੁਹਾਡੀ app ਦੀ ਰਫ਼ਤਾਰ ਨੂੰ ਬਹੁਤ ਹੌਲੀ ਕਰ ਦਿੰਦਾ ਹੈ।

ਇਸਨੂੰ ਠੀਕ ਕਰਨ ਲਈ ਇਹਨਾਂ ਦੋਵਾਂ tools ਦੀ ਵਰਤੋਂ ਕਰੋ:

  1. select_related

ਇਸਦੀ ਵਰਤੋਂ ForeignKey ਅਤੇ OneToOneField ਲਈ ਕਰੋ।

ਇਹ ਇੱਕ SQL JOIN ਦੀ ਵਰਤੋਂ ਕਰਦਾ ਹੈ। ਇਹ ਸਬੰਧਤ ਡਾਟਾ ਨੂੰ ਇੱਕ ਸਿੰਗਲ query ਵਿੱਚ ਪ੍ਰਾਪਤ ਕਰਦਾ ਹੈ।

  • ਉਦਾਹਰਨ: Post ਦਾ ਇੱਕ Author ਹੁੰਦਾ ਹੈ।
  • ਆਮ ਤਰੀਕਾ: 100 posts ਲਈ 101 queries।
  • Optimized ਤਰੀਕਾ: .select_related("author") ਦੀ ਵਰਤੋਂ ਕਰਕੇ 1 query।
  1. prefetch_related

ਇਸਦੀ ਵਰਤੋਂ ManyToManyField ਅਤੇ reverse ForeignKeys ਲਈ ਕਰੋ।

ਇਹ ਵੱਖ-ਵੱਖ queries ਚਲਾਉਂਦਾ ਹੈ ਅਤੇ ਉਹਨਾਂ ਨੂੰ Python ਵਿੱਚ join ਕਰਦਾ ਹੈ।

  • ਉਦਾਹਰਨ: Post ਦੇ ਕਈ Tags ਹੁੰਦੇ ਹਨ।
  • ਆਮ ਤਰੀਕਾ: posts ਲਈ 1 query + ਹਰ ਇੱਕ post ਦੇ tags ਲਈ 1 query।
  • Optimized ਤਰੀਕਾ: .prefetch_related("tags") ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਕੁੱਲ 2 queries।

Pro Tips:

  • ਆਪਣੇ loop ਵਿੱਚ ਜਾਣ ਤੋਂ ਪਹਿਲਾਂ ਸਬੰਧਤ ਡਾਟਾ ਨੂੰ filter ਕਰਨ ਲਈ Prefetch object ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • ਇਹਨਾਂ ਨੂੰ ਇਕੱਠੇ chain ਕਰੋ। ਤੁਸੀਂ ਇੱਕੋ ਵਾਰ authors ਅਤੇ tags ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਇੱਕ queryset ਵਿੱਚ ਦੋਵਾਂ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।
  • Loop ਦੇ ਅੰਦਰ prefetched relationship 'ਤੇ .filter() ਕਾਲ ਕਰਨ ਤੋਂ ਬਚੋ। ਇਹ cache ਨੂੰ bypass ਕਰ ਦਿੰਦਾ ਹੈ ਅਤੇ ਦੁਬਾਰਾ database ਨੂੰ hit ਕਰਦਾ ਹੈ।
  • ਸਿਰਫ਼ ਉਹਨਾਂ columns ਨੂੰ fetch ਕਰਨ ਲਈ select_related ਦੇ ਨਾਲ .only() ਦੀ ਵਰਤੋਂ ਕਰੋ ਜਿਨ੍ਹਾਂ ਦੀ ਤੁਹਾਨੂੰ ਲੋੜ ਹੈ।

Summary:

  • ForeignKey / OneToOne: select_related ਦੀ ਵਰਤੋਂ ਕਰੋ।
  • ManyToMany / Reverse FK: prefetch_related ਦੀ ਵਰਤੋਂ ਕਰੋ।

ਇਹਨਾਂ ਸਮੱਸਿਆਵਾਂ ਨੂੰ ਜਲਦੀ ਲੱਭਣ ਲਈ django-debug-toolbar ਨਾਲ ਆਪਣੀਆਂ query counts ਦੀ ਜਾਂਚ ਕਰੋ।

Source: https://dev.to/fhva29/optimizing-django-orm-queries-a-practical-guide-to-selectrelated-and-prefetchrelated-1gpl