Changes between Initial Version and Version 1 of QueryOptimization


Ignore:
Timestamp:
07/02/26 00:34:08 (4 days ago)
Author:
231024
Comment:

Додадена документација за индекси

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v1 v1  
     1= Индекси и оптимизација на прашалници =
     2
     3== View1: My bookings ==
     4
     5 * Примарен филтер за погледот `vw_my_bookings` ќе биде според id на корисникот, а може да се користи и дополнително со име на миленичето.
     6 * Примарен случај на употреба ќе е преглед на сите резервации кои ги има направено корисник. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''5s 356ms'''.
     7
     8{{{#!sql
     9SELECT * FROM vw_my_bookings
     10WHERE customer_id = 100286
     11ORDER BY reservation_date DESC;
     12
     13-- 500 rows retrieved starting from 1 in 5 s 356 ms
     14-- (execution: 4 s 952 ms, fetching: 404 ms)
     15}}}
     16
     17 * Ова не е прифатливо време за апликацијата и query-то не може понатаму да се оптимизира со менување на логиката, па затоа пристапуваме кон индексирање.
     18 * Се приметува дека главниот проблем е Full Scan на табелата `reservation` и `payment`, и бидејќи и правиме join преку `pet_id` на `reservation` и join преку `reservation_id` на `payment`, можеме да ја индексираме по тие податоци.
     19
     20{{{#!sql
     21CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id);
     22CREATE INDEX idx_petID_reservation ON reservation(pet_id);
     23}}}
     24
     25 * Со помош на овие индекси времето за извршување значително се намалува на '''2s 665ms'''.
     26
     27{{{#!sql
     28SELECT * FROM vw_my_bookings
     29WHERE customer_id = 100286
     30ORDER BY reservation_date DESC;
     31
     32-- 500 rows retrieved starting from 1 in 2 s 665 ms
     33-- (execution: 2 s 283 ms, fetching: 382 ms)
     34}}}
     35
     36----
     37
     38== View2: Pending actions ==
     39
     40 * Примарен филтер за погледот `vw_my_pending_actions` ќе биде според id на корисникот.
     41 * Примарен случај на употреба ќе е преглед на сите идни резервации кои сеуште ги нема потврдено ("pending") или кои сеуште ги нема платено. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''6s 949ms'''.
     42
     43{{{#!sql
     44SELECT * FROM vw_my_pending_actions
     45WHERE customer_id = 100286;
     46
     47-- 100 rows retrieved starting from 1 in 6 s 949 ms
     48-- (execution: 6 s 617 ms, fetching: 332 ms)
     49}}}
     50
     51 * Ова не е прифатливо време за апликацијата и query-то не може понатаму да се оптимизира со менување на логиката, па затоа пристапуваме кон индексирање.
     52 * Се забележува дека главниот проблем е Full Scan на табелата `reservation` и `payment`, и бидејќи и правиме join преку `pet_id` на `reservation` и join преку `reservation_id` на `payment`, можеме да ја индексираме по тие податоци.
     53
     54{{{#!sql
     55CREATE INDEX idx_payment_reservation_id ON Payment (reservation_id);
     56CREATE INDEX idx_petID_reservation ON reservation(pet_id);
     57}}}
     58
     59 * Со помош на овој индекс времето за извршување значително се намалува на '''2s 794ms'''.
     60
     61{{{#!sql
     62SELECT * FROM vw_my_pending_actions
     63WHERE customer_id = 100286;
     64
     65-- 100 rows retrieved starting from 1 in 2 s 794 ms
     66-- (execution: 2 s 455 ms, fetching: 339 ms)
     67}}}
     68
     69----
     70
     71== View3: Room Occupancy ==
     72
     73 * Примарен филтер за погледот `vw_room_occupancy` ќе биде според `check_in_date` и `check_out_date`, а може да се користи и дополнително со име на хотел.
     74 * Примарен случај на употреба ќе е преглед на статусот на сите соби. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''3s 108ms'''.
     75
     76{{{#!sql
     77SELECT * FROM vw_room_occupancy
     78WHERE check_in_date >= '2024-01-01' AND check_out_date <= '2024-01-31';
     79
     80-- 500 rows retrieved starting from 1 in 3 s 108 ms
     81-- (execution: 2 s 770 ms, fetching: 338 ms)
     82}}}
     83
     84 * Ова не е прифатливо време за апликацијата, ама query-то може понатаму да се оптимизира со менување на логиката, со тоа што го изоставаме името на миленичето за кое е направена резервацијата бидејќи сметаме дека главната функционалност е да се прегледа статусот на собата.
     85 * Со наведените оптимизации времето на извршување е '''441ms'''.
     86
     87{{{#!sql
     88SELECT * FROM vw_room_occupancy
     89WHERE check_in_date >= '2024-01-01' AND check_out_date <= '2024-01-31';
     90
     91-- 500 rows retrieved starting from 1 in 441 ms
     92-- (execution: 60 ms, fetching: 381 ms)
     93}}}
     94
     95----
     96
     97== View4: Pet Profile ==
     98
     99 * Примарен филтер за погледот `vw_pet_profile` ќе биде според `pet_id`.
     100 * Примарен случај на употреба ќе е преглед на профилот на милениче. За овој поглед ни се важни перформансите, бидејќи ќе биде користен секојдневно од клиенти. Иницијалното време за извршување на погледот е '''369ms'''.
     101
     102{{{#!sql
     103SELECT * FROM vw_pet_profile
     104WHERE pet_id = 80;
     105
     106-- 1 row retrieved starting from 1 in 369 ms
     107-- (execution: 12 ms, fetching: 357 ms)
     108}}}
     109
     110 * Ова е прифатливо време за апликацијата и поради тоа нема потреба од оптимизации.
     111
     112----
     113
     114== View5: Reservation Financials ==
     115
     116 * Примарен филтер за погледот `vw_reservation_financials` ќе биде според `reservation_date`.
     117 * Примарен случај на употреба ќе е преглед на профитот во одреден датум или период. За овој поглед не ни се важни перформансите, бидејќи е аналитички поглед кој не е наменет за секојдневна употреба од корисници.
     118
     119{{{#!sql
     120SELECT * FROM vw_reservation_financials -- analitika
     121WHERE reservation_date = CURRENT_DATE;
     122
     123-- 500 rows retrieved starting from 1 in 6 m 31 s 843 ms
     124-- (execution: 6 m 31 s 483 ms, fetching: 360 ms)
     125}}}
     126
     127 * Погледот се извршува '''6m 31s 843ms'''. Ова е прифатливо време за извршување поради тоа што е аналитички поглед, нема потреба од оптимизации.
     128
     129----
     130
     131== View6: Today's check-ins and check-outs ==
     132
     133 * Примарен филтер за погледот `vw_todays_checkins_checkouts` ќе биде според `hotel_name`.
     134 * Примарен случај на употреба ќе е преглед на профитот на одреден датум. За овој поглед не ни се важни перформансите, бидејќи е аналитички.
     135
     136{{{#!sql
     137SELECT * FROM vw_todays_checkins_checkouts
     138WHERE hotel_name = 'Paw Palace';
     139
     140-- 500 rows retrieved starting from 1 in 974 ms
     141-- (execution: 579 ms, fetching: 395 ms)
     142}}}
     143
     144 * Погледот се извршува '''974ms'''. Ова е прифатливо време за извршување, нема потреба од оптимизации.
     145
     146----
     147
     148== View7: Available rooms ==
     149
     150 * Примарен филтер за погледот `vw_available_rooms` ќе биде според `date`.
     151 * Примарен случај на употреба ќе е преглед на достапност на собите за одреден временски период.
     152
     153{{{#!sql
     154SELECT * FROM vw_available_rooms
     155WHERE date > '2026-07-10' AND date < '2026-07-22'
     156ORDER BY room_number;
     157
     158-- 8 rows retrieved starting from 1 in 467 ms
     159-- (execution: 16 ms, fetching: 451 ms)
     160}}}
     161
     162 * Погледот се извршува '''467ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации.
     163
     164----
     165
     166== View8: Service schedule ==
     167
     168 * Примарен филтер за погледот `vw_service_schedule` ќе биде според `date`.
     169 * Примарен случај на употреба ќе е преглед на сервисите кои треба да се извршени од вработените во одреден временски период.
     170
     171{{{#!sql
     172SELECT * FROM vw_service_schedule
     173WHERE scheduled_date = CURRENT_DATE;
     174
     175-- 500 rows retrieved starting from 1 in 512 ms
     176-- (execution: 149 ms, fetching: 363 ms)
     177}}}
     178
     179 * Погледот се извршува '''512ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации.
     180
     181----
     182
     183== View9: Medical history ==
     184
     185 * Примарен филтер за погледот `vw_medical_history` ќе биде според `pet_id`.
     186 * Примарен случај на употреба ќе е преглед на медицинска историја на одредено милениче.
     187
     188{{{#!sql
     189SELECT * FROM vw_medical_history
     190WHERE pet_id = 67890
     191ORDER BY record_date DESC;
     192}}}
     193
     194 * Погледот се извршува '''490ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации.
     195
     196----
     197
     198== View10: Employee workload ==
     199
     200 * Примарен филтер за погледот `vw_employee_workload` ќе биде според `employee_id`.
     201 * Примарен случај на употреба ќе е преглед на колку работа има извршено даден вработен во одреден период.
     202
     203{{{#!sql
     204SELECT * FROM vw_employee_workload
     205WHERE employee_id = 7;
     206
     207-- 500 rows retrieved starting from 1 in 861 ms
     208-- (execution: 527 ms, fetching: 334 ms)
     209}}}
     210
     211 * Погледот се извршува '''861ms'''. Ова е прифатливо време за извршување, поради тоа нема потреба од оптимизации.
     212
     213----
     214
     215== View11: Top customers ==
     216
     217 * Примарен филтер за погледот `vw_top_customers` ќе биде според `hotel_name`.
     218 * Примарен случај на употреба ќе е преглед на кои корисници најмногу пари имаат потрошено. За овој поглед не ни се важни перформансите, бидејќи е аналитички.
     219
     220{{{#!sql
     221SELECT * FROM vw_top_customers
     222WHERE hotel_name = 'Paw Palace';
     223
     224-- 500 rows retrieved starting from 1 in 4 s 703 ms
     225-- (execution: 4 s 373 ms, fetching: 330 ms)
     226}}}
     227
     228 * Погледот се извршува '''4s 703ms'''. Ова е прифатливо време за извршување поради тоа што е аналитички поглед, нема потреба од оптимизации.
     229
     230----
     231
     232== View13: Guest stay summary ==
     233
     234 * Примарен филтер за погледот `vw_guest_stay_summary` ќе биде според `pet_id`.
     235 * Примарен случај на употреба ќе е преглед на престој на милениче.
     236
     237{{{#!sql
     238SELECT * FROM vw_guest_stay_summary
     239WHERE pet_id = 8
     240ORDER BY check_in_date DESC;
     241
     242-- 400 rows retrieved starting from 1 in 493 ms
     243-- (execution: 32 ms, fetching: 461 ms)
     244}}}
     245
     246 * Погледот се извршува '''493ms'''. Ова е прифатливо време за извршување, нема потреба од оптимизации.