Changes between Version 8 and Version 9 of Indexing


Ignore:
Timestamp:
08/27/25 01:59:11 (7 days ago)
Author:
221007
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Indexing

    v8 v9  
    9595CREATE INDEX IF NOT EXISTS ix_ar_institution_id ON academicreport(institution_id);
    9696}}}
     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 пребарувања
     127CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS ux_mrd_report_diagnosis ON medicalreport_diagnosis (report_id, diagnosis_id);
     128
     129-- Слично со горното, но во обратна насока
     130CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_mrd_diagnosis_report ON medicalreport_diagnosis (diagnosis_id, report_id);
     131
     132-- филтрирање на персони
     133CREATE INDEX CONCURRENTLY IF NOT EXISTS ix_report_person ON report (person_id);
     134}}}