| 97 | |
| 98 | === 4. Пронаоѓање на слични дијагнози со селектиран пациент |
| 99 | Query кое се извршува со секое вклучување на панелот на пациентот: |
| 100 | {{{ |
| 101 | EXPLAIN (ANALYZE, BUFFERS) |
| 102 | with selected_person_diagnosis as( |
| 103 | select distinct d.diagnosis_id as diagnosis_id, d.short_description as label |
| 104 | from person p |
| 105 | join report r on r.person_id = p.person_id |
| 106 | join medicalreport_diagnosis mrd on mrd.report_id = r.report_id |
| 107 | join diagnosis d on mrd.diagnosis_id = d.diagnosis_id |
| 108 | where p.person_id = :person_id |
| 109 | ) |
| 110 | select cast(p2.person_id as bigint), |
| 111 | p2.name || ' ' || p2.surname as full_name, |
| 112 | cast(count(distinct spd.diagnosis_id) as bigint) as matching_diagnoses_count, |
| 113 | string_agg(distinct spd.label, ', ') as matching_labels |
| 114 | from selected_person_diagnosis spd |
| 115 | join medicalreport_diagnosis mrd2 on mrd2.diagnosis_id = spd.diagnosis_id |
| 116 | join report r2 on r2.report_id = mrd2.report_id |
| 117 | join person p2 on p2.person_id = r2.person_id |
| 118 | where p2.person_id != :person_id |
| 119 | group by p2.person_id, p2.name, p2.surname |
| 120 | having count(distinct spd.diagnosis_id) >=1 |
| 121 | order by matching_diagnoses_count desc; |
| 122 | }}} |
| 123 | Тука имаме појава на многу операции (join, grouping, ordering). Истото ова квери кога би имало многу дијагнози и многу персони со многу медицински извештаи, може значително да го успори побарувањето. За да го превентираме истото, ќе додадеме некои едноставни но корисни индекси. |
| 124 | |
| 125 | {{{ |
| 126 | -- Индекс на табелата medicalreport_diagnosis што убрзува процесот на report->diagnosis пребарувања |
| 127 | CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS ux_mrd_report_diagnosis ON medicalreport_diagnosis (report_id, diagnosis_id); |
| 128 | |
| 129 | -- Слично со горното, но во обратна насока |
| 130 | CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_mrd_diagnosis_report ON medicalreport_diagnosis (diagnosis_id, report_id); |
| 131 | |
| 132 | -- филтрирање на персони |
| 133 | CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_report_person ON report (person_id); |
| 134 | }}} |