| | 86 | |
| | 87 | === View 5: v_patient_diagnosis_history |
| | 88 | |
| | 89 | 1. Примарен филтер за погледот v_patient_diagnosis_history ќе биде според patient_id. |
| | 90 | |
| | 91 | 2. Погледот ќе се користи за преглед на историјата на дијагнози на пациент. Перформансите се критични бидејќи овој поглед е дел од медицинскиот картон. |
| | 92 | |
| | 93 | 3. Иницијалното време за извршување на погледот е 6s 230ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| | 94 | |
| | 95 | ''medicalsystem.public> select * from v_patient_diagnosis_history where patient_id = 10000'' |
| | 96 | |
| | 97 | ''[2026-05-10 10:55:14] 5 rows retrieved starting from 1 in 6 s 230 ms (execution: 6 s 174 ms, fetching: 56 ms) '' |
| | 98 | |
| | 99 | 4. Најбавната операција е full scan на табелата patient_diagnosis и таа може да се подобри со индекс. |
| | 100 | |
| | 101 | ''create index idx_patient_diagnosis_patient_id on patient_diagnosis(patient_id); '' |
| | 102 | |
| | 103 | 5. Времето изминато во извршување на query-то со индекси изнесува 44ms, и тоа е прифатливо време. |
| | 104 | |
| | 105 | ''medicalsystem.public> select * from v_patient_diagnosis_history where patient_id = 10000 '' |
| | 106 | |
| | 107 | ''[2026-05-10 11:00:22] 5 rows retrieved starting from 1 in 44 ms (execution: 12 ms, fetching: 32 ms) '' |
| | 108 | |
| | 109 | === View 6: v_lab_test_overview |
| | 110 | |
| | 111 | 1. Примарен филтер за погледот v_lab_test_overview ќе биде според patient_id. |
| | 112 | |
| | 113 | 2. Погледот ќе се користи за преглед на лабораториски резултати по пациент. Перформансите се важни бидејќи лабораторискиот персонал го користи постојано. |
| | 114 | |
| | 115 | 3. Иницијалното време за извршување на погледот е 9s 210ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| | 116 | |
| | 117 | ''medicalsystem.public> select * from v_lab_test_overview where patient_id = 100000 '' |
| | 118 | |
| | 119 | ''[2026-05-10 11:05:30] 12 rows retrieved starting from 1 in 9 s 210 ms (execution: 9 s 148 ms, fetching: 62 ms) '' |
| | 120 | |
| | 121 | 4. Најбавната операција е full scan на табелата laboratory_test (10 милиони редици) и таа може да се подобри со индекс. |
| | 122 | |
| | 123 | ''create index idx_lab_test_patient_id on laboratory_test(patient_id); '' |
| | 124 | |
| | 125 | 5. Времето изминато во извршување на query-то со индекси изнесува 56ms, и тоа е прифатливо време. |
| | 126 | |
| | 127 | ''medicalsystem.public> select * from v_lab_test_overview where patient_id = 100000 '' |
| | 128 | |
| | 129 | ''[2026-05-10 11:10:44] 12 rows retrieved starting from 1 in 56 ms (execution: 18 ms, fetching: 38 ms) '' |
| | 130 | |
| | 131 | === View 7: v_prescription_dispensing |
| | 132 | |
| | 133 | 1. Примарен филтер за погледот v_prescription_dispensing ќе биде според patient_id или doctor_id. |
| | 134 | |
| | 135 | 2. Погледот ќе се користи за преглед на издадени рецепти по пациент или доктор. |
| | 136 | |
| | 137 | 3. Иницијалното време за извршување на погледот е 4s 870ms. Ова е прифатливо за апликацијата па затоа не пристапуваме кон индексирање. |
| | 138 | |
| | 139 | '' medicalsystem.public> select * from v_prescription_dispensing where patient_id = 100000'' |
| | 140 | |
| | 141 | '' [2026-05-10 11:15:05] 8 rows retrieved starting from 1 in 4 s 870 ms (execution: 4 s 810 ms, fetching: 60 ms) '' |
| | 142 | |
| | 143 | 4. Нема потреба од правење план на извршување, бидејќи времето е задоволително. |
| | 144 | |
| | 145 | 5. Нема потреба да се преуреди прашалникот. |
| | 146 | |
| | 147 | === View 8: v_referral_tracking |
| | 148 | |
| | 149 | 1. Примарен филтер за погледот v_referral_tracking ќе биде според patient_id. |
| | 150 | |
| | 151 | 2. Погледот ќе се користи за следење на упатувања на пациенти помеѓу доктори и оддели. Перформансите се важни бидејќи упатувањата се клучни за работниот тек на болницата. |
| | 152 | |
| | 153 | 3. Иницијалното време за извршување на погледот е 6s 780ms кога се бара по patient_id. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање и преуредување на прашалникот. |
| | 154 | |
| | 155 | ''medicalsystem.public> select * from v_referral_tracking where patient_id = 200000 '' |
| | 156 | |
| | 157 | ''[2026-05-10 11:25:15] 4 rows retrieved starting from 1 in 6 s 780 ms (execution: 6 s 718 ms, fetching: 62 ms) '' |
| | 158 | |
| | 159 | 4. Најбавните операции се два корелирани потпрашалници (EXISTS и COUNT) кои за секој ред правеа full scan на appointment (15 милиони редици). Потребно е и преуредување на прашалникот. |
| | 160 | |
| | 161 | * Преуредување: |
| | 162 | |
| | 163 | create or replace view v_referral_tracking as |
| | 164 | |
| | 165 | select r.referral_id, p.patient_id, |
| | 166 | |
| | 167 | p.first_name and ' ' and p.last_name as patient_name, |
| | 168 | |
| | 169 | ref_dr.first_name and ' ' and ref_dr.last_name as referring_doctor, |
| | 170 | |
| | 171 | ref_sp.spec_name as referring_specialization, |
| | 172 | |
| | 173 | rfd.first_name and ' ' and rfd.last_name as referred_to_doctor, |
| | 174 | |
| | 175 | dep.department_name as referred_department, |
| | 176 | |
| | 177 | case when count(a.appointment_id) > 0 then 'YES' else 'NO' end as appointment_booked, |
| | 178 | |
| | 179 | count(a.appointment_id) as appointments_count |
| | 180 | |
| | 181 | from referral r |
| | 182 | |
| | 183 | join patient p on p.patient_id = r.patient_id |
| | 184 | |
| | 185 | join doctor ref_dr on ref_dr.doctor_id = r.referring_doctor_id |
| | 186 | |
| | 187 | join specialization ref_sp on ref_sp.spec_id = ref_dr.spec_id |
| | 188 | |
| | 189 | left join doctor rfd on rfd.doctor_id = r.referred_doctor_id |
| | 190 | |
| | 191 | join department dep on dep.department_id = r.department_id |
| | 192 | |
| | 193 | left join appointment a on a.referral_id = r.referral_id |
| | 194 | |
| | 195 | group by r.referral_id, p.patient_id, p.first_name, p.last_name, |
| | 196 | |
| | 197 | ref_dr.first_name, ref_dr.last_name, ref_sp.spec_name, |
| | 198 | |
| | 199 | rfd.first_name, rfd.last_name, dep.department_name; |
| | 200 | |
| | 201 | * Индекс: |
| | 202 | |
| | 203 | ''create index idx_referral_patient_id on referral(patient_id); '' |
| | 204 | |
| | 205 | 5. По преуредување на прашалникот (замена на корелирани потпрашалници со LEFT JOIN + агрегација) и додавање индекси, времето изнесува 28ms, и тоа е прифатливо. |
| | 206 | |
| | 207 | ''medicalsystem.public> select * from v_referral_tracking where patient_id = 200000 '' |
| | 208 | |
| | 209 | |
| | 210 | ''[2026-05-10 11:32:20] 4 rows retrieved starting from 1 in 28 ms (execution: 8 ms, fetching: 20 ms) '' |
| | 211 | |
| | 212 | === View 9: v_department_performance |
| | 213 | |
| | 214 | 1. Примарен филтер за погледот v_department_performance ќе биде според department_id. |
| | 215 | |
| | 216 | 2. Погледот ќе се користи за споредба на перформансите на одделите во болницата. Перформансите се важни за управувањето со болницата. |
| | 217 | |
| | 218 | 3. Иницијалното време за извршување на погледот е 9s 920ms. Ова е прифатливо за апликацијата, причината е бидејќи не се извршува често, а и потребно е време за собирање на сите информации, па затоа не пристапуваме кон индексирање. |
| | 219 | |
| | 220 | '' medicalsystem.public> select * from v_department_performance where department_id = 1 '' |
| | 221 | |
| | 222 | '' [2026-05-10 11:38:10] 1 row retrieved starting from 1 in 9 s 920 ms (execution: 8 s 851 ms, fetching: 69 ms) '' |
| | 223 | |
| | 224 | 4. Нема потреба од правење план на извршување, бидејќи времето е задоволително. |
| | 225 | |
| | 226 | 5. Нема потреба да се преуреди прашалникот. |