| 5 | | === View 1: v_patient_full_profile |
| 6 | | |
| 7 | | 1. Примарен филтер за погледот v_patient_full_profile ќе биде според patient_id, а исто така ќе се користи и според ime и презиме на пациент. |
| 8 | | |
| 9 | | 2. Примарен случај на употреба е прегледување на профилот на пациентот со неговите активни дијагнози и последниот преглед. За овој поглед ни се важни перформансите, бидејќи тој се повикува при секое отворање на картон на пациент. |
| 10 | | |
| 11 | | 3. Иницијалното време за извршување на погледот е 4s 820ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| 12 | | |
| 13 | | ''medicalsystem.public> select * from v_patient_full_profile where patient_id = 5000'' |
| 14 | | |
| 15 | | ''[2026-05-10 10:15:22] 1 row retrieved starting from 1 in 4 s 820 ms (execution: 4 s 763 ms, fetching: 57 ms)'' |
| 16 | | |
| 17 | | 4. Најбавната операција е full scan на табелата Appointment и таа може да се подобри со индекс. |
| 18 | | |
| 19 | | ''create index idx_appointment_patient_id on appointment(patient_id);'' |
| 20 | | |
| 21 | | 5. Времето изминато во извршување на query-то со индекси изнесува 38ms, и тоа е прифатливо време. |
| 22 | | |
| 23 | | ''medicalsystem.public> select * from v_patient_full_profile where patient_id = 5000'' |
| 24 | | |
| 25 | | ''[2026-05-10 10:20:11] 1 row retrieved starting from 1 in 38 ms (execution: 11 ms, fetching: 27 ms)'' |
| 26 | | |
| 27 | | === View 2: v_doctor_workload |
| 28 | | |
| 29 | | 1. Примарен филтер за погледот v_doctor_workload ќе биде според doctor_id, а исто така ќе се користи и според специјализација и оддел. |
| 30 | | |
| 31 | | 2. За овој поглед ни се важни перформансите, бидејќи менаџерите на одделите го користат постојано за следење на оптовареноста на докторите. |
| 32 | | |
| 33 | | 3. Иницијалното време за извршување на погледот е 12s 340ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| 34 | | |
| 35 | | ''medicalsystem.public> select * from v_doctor_workload where doctor_id = 42 '' |
| 36 | | |
| 37 | | ''[2026-05-10 10:25:33] 1 row retrieved starting from 1 in 12 s 340 ms (execution: 12 s 281 ms, fetching: 59 ms) '' |
| 38 | | |
| 39 | | 4. Најбавната операција е full scan на табелата appointment и таа може да се подобри со индекс. |
| 40 | | |
| 41 | | ''create index idx_medical_exam_doctor_id on medical_examination(doctor_id); '' |
| 42 | | |
| 43 | | 5. Времето изминато во извршување на query-то со индекси изнесува 142ms, и тоа е прифатливо време. |
| 44 | | |
| 45 | | ''medicalsystem.public> select * from v_doctor_workload where doctor_id = 42 '' |
| 46 | | |
| 47 | | ''[2026-05-10 10:30:44] 1 row retrieved starting from 1 in 142 ms (execution: 98 ms, fetching: 44 ms)'' |
| 48 | | |
| 49 | | === View 3: v_pharmacy_inventory_sales |
| 50 | | |
| 51 | | 1. Примарен филтер за погледот v_pharmacy_inventory_sales ќе биде според pharmacy_id. |
| 52 | | |
| 53 | | 2. Погледот ќе се користи од менаџерите на аптеките за контрола на залихите и приходите. За овој поглед ни се важни перформансите, бидејќи без него се губи многу време при извршување. |
| 54 | | |
| 55 | | 3. Иницијалното време за извршување на погледот е 3s 100ms. Ова 3 е прифатливо за апликацијата па затоа не пристапуваме кон индексирање. |
| 56 | | |
| 57 | | ''medicalsystem.public> select * from v_pharmacy_inventory_sales where pharmacy_id = 3 '' |
| 58 | | |
| 59 | | ''[2026-05-10 10:35:10] 1 row retrieved starting from 1 in 3 s 100 ms (execution: 3 s 051 ms, fetching: 49 ms) '' |
| 60 | | |
| 61 | | 4. Нема потреба од правење план на извршување, бидејќи времето е задоволително. |
| 62 | | |
| 63 | | 5. Нема потреба да се преуреди прашалникот. |
| 64 | | |
| 65 | | === View 4: v_appointment_daily_stats |
| 66 | | |
| 67 | | 1. Примарен филтер за погледот v_appointment_daily_stats ќе биде според appointment_date. |
| 68 | | |
| 69 | | 2. Погледот ќе се користи за дневна статистика на прегледи, од страна на болничката администрација. Перформансите се важни бидејќи овој поглед се повикува при секое вчитување на дашбордот. |
| 70 | | |
| 71 | | 3. Иницијалното време за извршување на погледот е 28s 450ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| 72 | | |
| 73 | | ''medicalsystem.public> select * from v_appointment_daily_stats where appointment_date = '2024-06-15' '' |
| 74 | | |
| 75 | | ''[2026-05-10 10:45:05] 1 row retrieved starting from 1 in 28 s 450 ms (execution: 28 s 392 ms, fetching: 58 ms) '' |
| 76 | | |
| 77 | | 4. Најбавната операција е full scan на табелата appointment (15 милиони редици) и таа може да се подобри со индекс на appointment_date. |
| 78 | | |
| 79 | | '' create index idx_appointment_date on appointment(appointment_date); '' |
| 80 | | |
| 81 | | 5. Времето изминато во извршување на query-то со индекси изнесува 1s 240ms, и тоа е прифатливо време. |
| 82 | | |
| 83 | | '' medicalsystem.public> select * from v_appointment_daily_stats where appointment_date = '2024-06-15' '' |
| 84 | | |
| 85 | | '' [2026-05-10 10:50:18] 1 row retrieved starting from 1 in 1 s 240 ms (execution: 1 s 198 ms, fetching: 42 ms) '' |
| 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 | | |
| 98 | | ''[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) '' |
| 99 | | |
| 100 | | 4. Најбавната операција е full scan на табелата patient_diagnosis и таа може да се подобри со индекс. |
| 101 | | |
| 102 | | ''create index idx_patient_diagnosis_patient_id on patient_diagnosis(patient_id); '' |
| 103 | | |
| 104 | | 5. Времето изминато во извршување на query-то со индекси изнесува 44ms, и тоа е прифатливо време. |
| 105 | | |
| 106 | | ''medicalsystem.public> select * from v_patient_diagnosis_history where patient_id = 10000 '' |
| 107 | | |
| 108 | | ''[2026-05-10 11:00:22] 5 rows retrieved starting from 1 in 44 ms (execution: 12 ms, fetching: 32 ms) '' |
| 109 | | |
| 110 | | === View 6: v_lab_test_overview |
| 111 | | |
| 112 | | 1. Примарен филтер за погледот v_lab_test_overview ќе биде според patient_id. |
| 113 | | |
| 114 | | 2. Погледот ќе се користи за преглед на лабораториски резултати по пациент. Перформансите се важни бидејќи лабораторискиот персонал го користи постојано. |
| 115 | | |
| 116 | | 3. Иницијалното време за извршување на погледот е 9s 210ms. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање. |
| 117 | | |
| 118 | | ''medicalsystem.public> select * from v_lab_test_overview where patient_id = 100000 '' |
| 119 | | |
| 120 | | ''[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) '' |
| 121 | | |
| 122 | | 4. Најбавната операција е full scan на табелата laboratory_test (10 милиони редици) и таа може да се подобри со индекс. |
| 123 | | |
| 124 | | ''create index idx_lab_test_patient_id on laboratory_test(patient_id); '' |
| 125 | | |
| 126 | | 5. Времето изминато во извршување на query-то со индекси изнесува 56ms, и тоа е прифатливо време. |
| 127 | | |
| 128 | | ''medicalsystem.public> select * from v_lab_test_overview where patient_id = 100000 '' |
| 129 | | |
| 130 | | ''[2026-05-10 11:10:44] 12 rows retrieved starting from 1 in 56 ms (execution: 18 ms, fetching: 38 ms) '' |
| 131 | | |
| 132 | | === View 7: v_prescription_dispensing |
| 133 | | |
| 134 | | 1. Примарен филтер за погледот v_prescription_dispensing ќе биде според patient_id или doctor_id. |
| 135 | | |
| 136 | | 2. Погледот ќе се користи за преглед на издадени рецепти по пациент или доктор. |
| 137 | | |
| 138 | | 3. Иницијалното време за извршување на погледот е 4s 870ms. Ова е прифатливо за апликацијата па затоа не пристапуваме кон индексирање. |
| 139 | | |
| 140 | | '' medicalsystem.public> select * from v_prescription_dispensing where patient_id = 100000'' |
| 141 | | |
| 142 | | |
| 143 | | '' [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) '' |
| 144 | | |
| 145 | | 4. Нема потреба од правење план на извршување, бидејќи времето е задоволително. |
| 146 | | |
| 147 | | 5. Нема потреба да се преуреди прашалникот. |
| 148 | | |
| 149 | | === View 8: v_referral_tracking |
| 150 | | |
| 151 | | 1. Примарен филтер за погледот v_referral_tracking ќе биде според patient_id. |
| 152 | | |
| 153 | | 2. Погледот ќе се користи за следење на упатувања на пациенти помеѓу доктори и оддели. Перформансите се важни бидејќи упатувањата се клучни за работниот тек на болницата. |
| 154 | | |
| 155 | | 3. Иницијалното време за извршување на погледот е 6s 780ms кога се бара по patient_id. Ова не е прифатливо за апликацијата па затоа пристапуваме кон индексирање и преуредување на прашалникот. |
| 156 | | |
| 157 | | ''medicalsystem.public> select * from v_referral_tracking where patient_id = 200000 '' |
| 158 | | |
| 159 | | ''[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) '' |
| 160 | | |
| 161 | | 4. Најбавните операции се два корелирани потпрашалници (EXISTS и COUNT) кои за секој ред правеа full scan на appointment (15 милиони редици). Потребно е и преуредување на прашалникот. |
| 162 | | |
| 163 | | * Преуредување: |
| 164 | | |
| 165 | | create or replace view v_referral_tracking as |
| 166 | | |
| 167 | | select r.referral_id, p.patient_id, |
| 168 | | |
| 169 | | p.first_name and ' ' and p.last_name as patient_name, |
| 170 | | |
| 171 | | ref_dr.first_name and ' ' and ref_dr.last_name as referring_doctor, |
| 172 | | |
| 173 | | ref_sp.spec_name as referring_specialization, |
| 174 | | |
| 175 | | rfd.first_name and ' ' and rfd.last_name as referred_to_doctor, |
| 176 | | |
| 177 | | dep.department_name as referred_department, |
| 178 | | |
| 179 | | case when count(a.appointment_id) > 0 then 'YES' else 'NO' end as appointment_booked, |
| 180 | | |
| 181 | | count(a.appointment_id) as appointments_count |
| 182 | | |
| 183 | | from referral r |
| 184 | | |
| 185 | | join patient p on p.patient_id = r.patient_id |
| 186 | | |
| 187 | | join doctor ref_dr on ref_dr.doctor_id = r.referring_doctor_id |
| 188 | | |
| 189 | | join specialization ref_sp on ref_sp.spec_id = ref_dr.spec_id |
| 190 | | |
| 191 | | left join doctor rfd on rfd.doctor_id = r.referred_doctor_id |
| 192 | | |
| 193 | | join department dep on dep.department_id = r.department_id |
| 194 | | |
| 195 | | left join appointment a on a.referral_id = r.referral_id |
| 196 | | |
| 197 | | group by r.referral_id, p.patient_id, p.first_name, p.last_name, |
| 198 | | |
| 199 | | ref_dr.first_name, ref_dr.last_name, ref_sp.spec_name, |
| 200 | | |
| 201 | | rfd.first_name, rfd.last_name, dep.department_name; |
| 202 | | |
| 203 | | * Индекс: |
| 204 | | |
| 205 | | ''create index idx_referral_patient_id on referral(patient_id); '' |
| 206 | | |
| 207 | | 5. По преуредување на прашалникот (замена на корелирани потпрашалници со LEFT JOIN + агрегација) и додавање индекси, времето изнесува 28ms, и тоа е прифатливо. |
| 208 | | |
| 209 | | ''medicalsystem.public> select * from v_referral_tracking where patient_id = 200000 '' |
| 210 | | |
| 211 | | |
| 212 | | ''[2026-05-10 11:32:20] 4 rows retrieved starting from 1 in 28 ms (execution: 8 ms, fetching: 20 ms) '' |
| 213 | | |
| 214 | | === View 9: v_department_performance |
| 215 | | |
| 216 | | 1. Примарен филтер за погледот v_department_performance ќе биде според department_id. |
| 217 | | |
| 218 | | 2. Погледот ќе се користи за споредба на перформансите на одделите во болницата. Перформансите се важни за управувањето со болницата. |
| 219 | | |
| 220 | | 3. Иницијалното време за извршување на погледот е 9s 920ms. Ова е прифатливо за апликацијата, причината е бидејќи не се извршува често, а и потребно е време за собирање на сите информации, па затоа не пристапуваме кон индексирање. |
| 221 | | |
| 222 | | '' medicalsystem.public> select * from v_department_performance where department_id = 1 '' |
| 223 | | |
| 224 | | '' [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) '' |
| 225 | | |
| 226 | | 4. Нема потреба од правење план на извршување, бидејќи времето е задоволително. |
| 227 | | |
| 228 | | 5. Нема потреба да се преуреди прашалникот. |
| | 5 | attachment:"MedicalSystem Optimization.pdf" |