= Индекси и оптимизација на прашалници = == View1: My bookings == * Примарен филтер за погледот `vw_my_bookings` ќе биде според id на корисникот, а може да се користи и дополнително со име на миленичето. * Примарен случај на употреба ќе е преглед на сите резервации кои ги има направено корисник. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''5s 356ms'''. {{{#!sql SELECT * FROM vw_my_bookings WHERE customer_id = 100286 ORDER BY reservation_date DESC; -- 500 rows retrieved starting from 1 in 5 s 356 ms -- (execution: 4 s 952 ms, fetching: 404 ms) }}} * Ова не е прифатливо време за апликацијата и query-то не може понатаму да се оптимизира со менување на логиката, па затоа пристапуваме кон индексирање. * Се приметува дека главниот проблем е Full Scan на табелата `reservation` и `payment`, и бидејќи и правиме join преку `pet_id` на `reservation` и join преку `reservation_id` на `payment`, можеме да ја индексираме по тие податоци. {{{#!sql CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id); CREATE INDEX idx_petID_reservation ON reservation(pet_id); }}} * Со помош на овие индекси времето за извршување значително се намалува на '''2s 665ms'''. {{{#!sql SELECT * FROM vw_my_bookings WHERE customer_id = 100286 ORDER BY reservation_date DESC; -- 500 rows retrieved starting from 1 in 2 s 665 ms -- (execution: 2 s 283 ms, fetching: 382 ms) }}} ---- == View2: Pending actions == * Примарен филтер за погледот `vw_my_pending_actions` ќе биде според id на корисникот. * Примарен случај на употреба ќе е преглед на сите идни резервации кои сеуште ги нема потврдено ("pending") или кои сеуште ги нема платено. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''6s 949ms'''. {{{#!sql SELECT * FROM vw_my_pending_actions WHERE customer_id = 100286; -- 100 rows retrieved starting from 1 in 6 s 949 ms -- (execution: 6 s 617 ms, fetching: 332 ms) }}} * Ова не е прифатливо време за апликацијата и query-то не може понатаму да се оптимизира со менување на логиката, па затоа пристапуваме кон индексирање. * Се забележува дека главниот проблем е Full Scan на табелата `reservation` и `payment`, и бидејќи и правиме join преку `pet_id` на `reservation` и join преку `reservation_id` на `payment`, можеме да ја индексираме по тие податоци. {{{#!sql CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id); CREATE INDEX idx_petID_reservation ON reservation(pet_id); }}} * Со помош на овој индекс времето за извршување значително се намалува на '''2s 794ms'''. {{{#!sql SELECT * FROM vw_my_pending_actions WHERE customer_id = 100286; -- 100 rows retrieved starting from 1 in 2 s 794 ms -- (execution: 2 s 455 ms, fetching: 339 ms) }}} ---- == View3: Room Occupancy == * Примарен филтер за погледот `vw_room_occupancy` ќе биде според `check_in_date` и `check_out_date`, а може да се користи и дополнително со име на хотел. * Примарен случај на употреба ќе е преглед на статусот на сите соби. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''3s 108ms'''. {{{#!sql SELECT * FROM vw_room_occupancy WHERE check_in_date >= '2024-01-01' AND check_out_date <= '2024-01-31'; -- 500 rows retrieved starting from 1 in 3 s 108 ms -- (execution: 2 s 770 ms, fetching: 338 ms) }}} * Ова не е прифатливо време за апликацијата, ама query-то може понатаму да се оптимизира со менување на логиката, со тоа што го изоставаме името на миленичето за кое е направена резервацијата бидејќи сметаме дека главната функционалност е да се прегледа статусот на собата. * Со наведените оптимизации времето на извршување е '''441ms'''. {{{#!sql SELECT * FROM vw_room_occupancy WHERE check_in_date >= '2024-01-01' AND check_out_date <= '2024-01-31'; -- 500 rows retrieved starting from 1 in 441 ms -- (execution: 60 ms, fetching: 381 ms) }}} ---- == View4: Pet Profile == * Примарен филтер за погледот `vw_pet_profile` ќе биде според `pet_id`. * Примарен случај на употреба ќе е преглед на профилот на милениче. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''369ms'''. {{{#!sql SELECT * FROM vw_pet_profile WHERE pet_id = 80; -- 1 row retrieved starting from 1 in 369 ms -- (execution: 12 ms, fetching: 357 ms) }}} * Ова е прифатливо време за апликацијата и поради тоа нема потреба од оптимизации. ---- == View5: Reservation Financials == * Примарен филтер за погледот `vw_reservation_financials` ќе биде според `reservation_date`. * Примарен случај на употреба ќе е преглед на профитот во одреден датум или период. За овој поглед не ни се важни перформансите, бидејќи е аналитички поглед кој не е наменет за секојдневна употреба од корисници. {{{#!sql SELECT * FROM vw_reservation_financials -- analitika WHERE reservation_date = CURRENT_DATE; -- 500 rows retrieved starting from 1 in 6 m 31 s 843 ms -- (execution: 6 m 31 s 483 ms, fetching: 360 ms) }}} * Погледот се извршува '''6m 31s 843ms'''. Ова е прифатливо време за извршување поради тоа што е аналитички поглед, нема потреба од оптимизации. ---- == View6: Today's check-ins and check-outs == * Примарен филтер за погледот `vw_todays_checkins_checkouts` ќе биде според `hotel_name`. * Примарен случај на употреба ќе е преглед на профитот на одреден датум. За овој поглед не ни се важни перформансите, бидејќи е аналитички. {{{#!sql SELECT * FROM vw_todays_checkins_checkouts WHERE hotel_name = 'Paw Palace'; -- 500 rows retrieved starting from 1 in 974 ms -- (execution: 579 ms, fetching: 395 ms) }}} * Погледот се извршува '''974ms'''. Ова е прифатливо време за извршување, нема потреба од оптимизации. ---- == View7: Available rooms == * Примарен филтер за погледот `vw_available_rooms` ќе биде според `date`. * Примарен случај на употреба ќе е преглед на достапност на собите за одреден временски период. {{{#!sql SELECT * FROM vw_available_rooms WHERE date > '2026-07-10' AND date < '2026-07-22' ORDER BY room_number; -- 8 rows retrieved starting from 1 in 467 ms -- (execution: 16 ms, fetching: 451 ms) }}} * Погледот се извршува '''467ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации. ---- == View8: Service schedule == * Примарен филтер за погледот `vw_service_schedule` ќе биде според `date`. * Примарен случај на употреба ќе е преглед на сервисите кои треба да се извршени од вработените во одреден временски период. {{{#!sql SELECT * FROM vw_service_schedule WHERE scheduled_date = CURRENT_DATE; -- 500 rows retrieved starting from 1 in 512 ms -- (execution: 149 ms, fetching: 363 ms) }}} * Погледот се извршува '''512ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации. ---- == View9: Medical history == * Примарен филтер за погледот `vw_medical_history` ќе биде според `pet_id`. * Примарен случај на употреба ќе е преглед на медицинска историја на одредено милениче. {{{#!sql SELECT * FROM vw_medical_history WHERE pet_id = 67890 ORDER BY record_date DESC; }}} * Погледот се извршува '''490ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации. ---- == View10: Employee workload == * Примарен филтер за погледот `vw_employee_workload` ќе биде според `employee_id`. * Примарен случај на употреба ќе е преглед на колку работа има извршено даден вработен во одреден период. {{{#!sql SELECT * FROM vw_employee_workload WHERE employee_id = 7; -- 500 rows retrieved starting from 1 in 861 ms -- (execution: 527 ms, fetching: 334 ms) }}} * Погледот се извршува '''861ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации. ---- == View11: Top customers == * Примарен филтер за погледот `vw_top_customers` ќе биде според `hotel_name`. * Примарен случај на употреба ќе е преглед на кои корисници најмногу пари имаат потрошено. За овој поглед не ни се важни перформансите, бидејќи е аналитички. {{{#!sql SELECT * FROM vw_top_customers WHERE hotel_name = 'Paw Palace'; -- 500 rows retrieved starting from 1 in 4 s 703 ms -- (execution: 4 s 373 ms, fetching: 330 ms) }}} * Погледот се извршува '''4s 703ms'''. Ова е прифатливо време за извршување поради тоа што е аналитички поглед, нема потреба од оптимизации. ---- == View13: Guest stay summary == * Примарен филтер за погледот `vw_guest_stay_summary` ќе биде според `pet_id`. * Примарен случај на употреба ќе е преглед на престој на милениче. {{{#!sql SELECT * FROM vw_guest_stay_summary WHERE pet_id = 8 ORDER BY check_in_date DESC; -- 400 rows retrieved starting from 1 in 493 ms -- (execution: 32 ms, fetching: 461 ms) }}} * Погледот се извршува '''493ms'''. Ова е прифатливо време за извршување, нема потреба од оптимизации.