Changes between Version 5 and Version 6 of QueryOptimization


Ignore:
Timestamp:
07/01/26 15:32:31 (10 days ago)
Author:
231561
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v5 v6  
    33== Query and Views Optimization
    44
    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. Нема потреба да се преуреди прашалникот. 
     5attachment:"MedicalSystem Optimization.pdf"