coronasafe / care

Care is a Digital Public Good enabling TeleICU & Decentralised Administration of Healthcare Capacity across States.
https://careapi.ohc.network/swagger
MIT License
224 stars 258 forks source link

Fix N+1 queries in `/api/v1/patient/` #1337

Open sainak opened 1 year ago

sainak commented 1 year ago
Sentry Issue: CARE-NF
Transaction Name /api/v1/patient/
Parent Span django.view - patientregistration-list
Repeating Spans (0) db - SELECT hcx_policy.id, hcx_policy.external_id, hcx_policy.created_date, hcx_policy.modified_date, hcx_policy.deleted, hcx_policy.patient_id, hcx_policy.subscriber_id, hcx_policy.policy_id, hcx_policy.insurer_id, hcx_policy.insurer_name, hcx_policy.status, hcx_policy.priority, hcx_policy.purpose, hcx_policy.outcome, hcx_policy.error_text, hcx_policy.created_by_id, hcx_policy.last_modified_by_id FROM hcx_policy WHERE (hcx_policy."delete...
db - SELECT COUNT(*) AS __count FROM facility_patientregistration WHERE (facility_patientregistration.deleted = %s AND facility_patientregistration.facility_id = %s AND facility_patientregistration.is_active = %s)
db - SELECT COUNT(*) AS __count FROM facility_bed WHERE (facility_bed.deleted = %s AND facility_bed.facility_id = %s)
satyam0601 commented 1 year ago

i would like to work on this can you assign me this issue?

rithviknishad commented 8 months ago

Hey @satyam0601 Any updates on this? Any blockers?

ClawedCatalyst commented 5 months ago

hey, @sainak @rithviknishad I want to work on this issue. Can you please assign this issue to me?

ClawedCatalyst commented 5 months ago

Hey @sainak @rithviknishad,

I believe the primary issue with the hcx_policy query comes from https://github.com/coronasafe/care/blob/411e89c63c7daa4b13cc76a1754debec9c19bea7/care/facility/api/serializers/patient.py#L93

    def get_has_eligible_policy(self, patient):
        eligible_policies = Policy.objects.filter(
            (Q(error_text="") | Q(error_text=None)),
            outcome="complete",
            patient=patient.id,
        )
        return bool(len(eligible_policies))

in the patient serializer.

To address this, we can utilize prefetch_related and then filter the patient object with the necessary policy set. Additionally, I suggest replacing len with count, as both accomplish the same task.