| | 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 | }}} |