| 3 | | Доколку сакаме да ги прикажеме сите комплетирани резервации со детали за гостин, хост, соба и локација, извршуваме: |
| | 3 | Погледот vw_booking_overview се користи за анализа на резервации според нивниот статус, со цел добивање комплетен преглед на сите поврзани информации за секоја резервација (гостин, соба, имот и домаќин). |
| | 4 | Во оваа операција се користи филтрирање booking_status = ‘COMPLETED’ за да се извлечат само завршените резервации. |
| | 5 | Иницијалното време за извршување на погледот е 23sec |
| | 6 | |
| | 7 | [[Image("booking query.png")]] |
| | 8 | |
| | 9 | Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. |
| | 10 | |
| | 11 | [[Image("booking analysis.png")]] |
| | 12 | |
| | 13 | Со креирање на индекс |
| 17 | | Најбавна операција е sequential scan на bookings табелата со филтер: |
| 18 | | |
| 19 | | {{{ |
| 20 | | booking_status = 'COMPLETED' |
| 21 | | }}} |
| 22 | | |
| 23 | | Со цел да се избегне sequential scan, додадовме partial index: |
| 24 | | |
| 25 | | {{{ |
| 26 | | CREATE INDEX CONCURRENTLY idx_bookings_completed |
| 27 | | ON bookings (guest_id, room_id) |
| 28 | | WHERE booking_status = 'COMPLETED'; |
| 29 | | }}} |
| 30 | | |
| 31 | | Време на извршување по додавање на индекс: |
| 32 | | |
| 33 | | {{{ |
| 34 | | ~18 sec -> ~11-12 sec |
| 35 | | }}} |
| 36 | | |
| 37 | | Со индексот добивме значително подобрување бидејќи PostgreSQL користи index scan наместо целосно пребарување на bookings. |
| 61 | | Доколку сакаме да ја анализираме заработката по сместување, извршуваме: |
| | 42 | Овој поглед служи за анализа на приход и перформанси по недвижнина (property). Ги комбинира податоците за резервации, плаќања, локација, тип на оглас и рецензии, и дава агрегирани метрики како вкупен приход, број на резервации и просечен рејтинг. |
| | 43 | Ако сакаме да видиме заработката по сместување, извршуваме со филтер total_revenue>10 000 |
| | 44 | |
| | 45 | Време на извршување: 5 минути |
| | 46 | |
| | 47 | [[Image("revenue_by_property query.png")]] |
| | 48 | |
| | 49 | За оптимизација се користи Materialized View со цел да се избегнат скапи JOIN операции со табелите bookings и payments, како и тешки агрегатни пресметки (SUM, COUNT, AVG) и групирање над големи сетови податоци. Со претходно пресметување и физичко складирање на резултатите значително се намалува времето на извршување и се подобрува перформансата при анализа на приходите и статистиките по недвижност. |
| | 50 | Новото време на извршување: 510ms |
| | 51 | |
| | 52 | [[Image("revenue by property opt.png")]] |
| | 53 | |
| | 54 | == 4. Aнализа на vw_payment_status == |
| | 55 | |
| | 56 | Овој поглед служи за анализа на статусот на плаќањата за секоја резервација. Ги комбинира податоците од резервации, плаќања, методи на плаќање, гости, хостови и недвижнини, со цел да даде целосен преглед на секоја трансакција и нејзината финансиска состојба. |
| | 57 | Ако сакаме да видиме само успешно платени резервации, користиме филтер payment_status = ‘PAID’ |
| | 58 | Време на извршување: 16 минути |
| | 59 | |
| | 60 | [[Image("payment_status query.png")]] |
| | 61 | |
| | 62 | Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање |
| | 63 | |
| | 64 | [[Image("payment_status analysis.png")]] |
| | 65 | |
| | 66 | Се креира индекс |
| 69 | | Време потребно за пребарување: |
| | 72 | Со што имаме значително подобрување: |
| | 73 | |
| | 74 | [[Image("paymnet status index query.png")]] |
| | 75 | |
| | 76 | == 5. Aнализа на vw_host_performance == |
| | 77 | |
| | 78 | Овој поглед служи за анализа на перформансите на хостовите (домаќините) на платформата. Ги комбинира податоците за хостови, корисници, недвижнини, соби, резервации, плаќања и рецензии, и дава агрегирани метрики за секој хост. |
| | 79 | Доколку сакаме да ги анализираме најуспешните хостови, можеме да извршиме пребарување со филтер avg_rating >= 4. |
| | 80 | Време на извршување: 2 минути |
| | 81 | |
| | 82 | [[Image("host_performance query.png")]] |
| | 83 | |
| | 84 | За оптимизација се користи Materialized View со цел да се избегнат скапи JOIN операции помеѓу табелите hosts, users, properties, rooms, bookings, payments и reviews, како и комплексни агрегатни функции како COUNT(DISTINCT), SUM и AVG над големи количини на податоци. Со претходно пресметување и физичко складирање на резултатите значително се намалува времето на извршување и се подобрува перформансата при анализа на успешноста на хостовите. |
| | 85 | |
| | 86 | [[Image("host performance opt.png")]] |
| | 87 | |
| | 88 | Новото време на извршување: 389 милисекунди |
| | 89 | |
| | 90 | |
| | 91 | == 6. Aнализа на vw_room_details == |
| | 92 | |
| | 93 | Овој поглед служи за детална анализа на собите во рамки на објектите. Ги комбинира податоците за соби, нивните типови, припадните недвижнини, локацијата, хостот, како и дополнителни информации како капацитет, цени, удобности и резервации. |
| | 94 | Доколку сакаме да гледаме собите од активни објекти користиме филтер: property_status = ‘ACTIVE’ |
| | 95 | Времето: 11 минути |
| | 96 | |
| | 97 | [[Image("room_details query.png")]] |
| | 98 | |
| | 99 | Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. |
| | 100 | |
| | 101 | [[Image("room details analysis.png")]] |
| | 102 | |
| | 103 | Со креирање на индекс |
| 85 | | Доколку сакаме да прикажеме детали за собите, нивната достапност и резервации, извршуваме: |
| | 116 | Овој поглед служи за анализа на рецензиите и задоволството на гостите за секоја недвижнина. Ги комбинира податоците за рецензии, резервации, гости, хостови и локацијата на сместувањето, со цел да обезбеди детален преглед на оценките и коментарите. |
| | 117 | Ако сакаме да ги видиме само позитивните рецензии со оцена користиме филтер: |
| | 118 | rating>=4 |
| | 119 | |
| | 120 | Време на извршување: 6 минути |
| | 121 | |
| | 122 | [[Image(review_summary_quary.png)]] |
| | 123 | |
| | 124 | Ова не е прифатливо време за апликацијата па затоа пристапуваме кон индексирање. |
| | 125 | |
| | 126 | [[Image(review_summary_analysis.png)]] |
| | 127 | |
| | 128 | Со креирање на индекс |
| 142 | | {{{ |
| 143 | | SELECT * |
| 144 | | FROM availability_windows aw |
| 145 | | JOIN rooms r ON aw.room_id = r.room_id |
| 146 | | WHERE aw.available_date >= CURRENT_DATE |
| 147 | | AND r.status = 'ACTIVE'; |
| 148 | | }}} |
| 149 | | |
| 150 | | Време потребно за пребарување: |
| 151 | | |
| 152 | | {{{ |
| 153 | | ~17 sec |
| 154 | | }}} |
| 155 | | |
| 156 | | Главниот проблем е sequential scan на availability_windows. |
| 157 | | |
| 158 | | Додадовме индекс: |
| 159 | | |
| 160 | | {{{ |
| 161 | | CREATE INDEX CONCURRENTLY idx_availability_windows_date_room |
| 162 | | ON availability_windows (available_date, room_id); |
| 163 | | }}} |
| 164 | | |
| 165 | | Време на извршување по додавање на индекс: |
| 166 | | |
| 167 | | {{{ |
| 168 | | ~17 sec -> ~8-9 sec |
| 169 | | }}} |
| 170 | | |
| 171 | | Со индексот добивме значително подобрување бидејќи PostgreSQL избегнува целосно sequential scan на availability_windows. |