wiki:QueryOptimization

Индекси и оптимизација на прашалници

View1: My bookings

  • Примарен филтер за погледот vw_my_bookings ќе биде според id на корисникот, а може да се користи и дополнително со име на миленичето.
  • Примарен случај на употреба ќе е преглед на сите резервации кои ги има направено корисник. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е 5s 356ms.
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, можеме да ја индексираме по тие податоци.
CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id);
CREATE INDEX idx_petID_reservation ON reservation(pet_id);
  • Со помош на овие индекси времето за извршување значително се намалува на 2s 665ms.
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.
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, можеме да ја индексираме по тие податоци.
CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id);
CREATE INDEX idx_petID_reservation ON reservation(pet_id);
  • Со помош на овој индекс времето за извршување значително се намалува на 2s 794ms.
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.
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.
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.
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.
  • Примарен случај на употреба ќе е преглед на профитот во одреден датум или период. За овој поглед не ни се важни перформансите, бидејќи е аналитички поглед кој не е наменет за секојдневна употреба од корисници.
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.
  • Примарен случај на употреба ќе е преглед на профитот на одреден датум. За овој поглед не ни се важни перформансите, бидејќи е аналитички.
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.
  • Примарен случај на употреба ќе е преглед на достапност на собите за одреден временски период.
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.
  • Примарен случај на употреба ќе е преглед на сервисите кои треба да се извршени од вработените во одреден временски период.
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.
  • Примарен случај на употреба ќе е преглед на медицинска историја на одредено милениче.
SELECT * FROM vw_medical_history
WHERE pet_id = 67890
ORDER BY record_date DESC;
  • Погледот се извршува 490ms. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации.

View10: Employee workload

  • Примарен филтер за погледот vw_employee_workload ќе биде според employee_id.
  • Примарен случај на употреба ќе е преглед на колку работа има извршено даден вработен во одреден период.
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.
  • Примарен случај на употреба ќе е преглед на кои корисници најмногу пари имаат потрошено. За овој поглед не ни се важни перформансите, бидејќи е аналитички.
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.
  • Примарен случај на употреба ќе е преглед на престој на милениче.
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. Ова е прифатливо време за извршување, нема потреба од оптимизации.
Last modified 4 days ago Last modified on 07/02/26 00:34:08

Attachments (1)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.