| | 113 | |
| | 114 | |
| | 115 | |
| | 116 | == 2. Анализа и оптимизација на vw_client_booking_history == |
| | 117 | |
| | 118 | Погледот {{{vw_client_booking_history}}} се користи за прикажување на историјата на booking-ите на клиентите, нивниот статус и информациите за плаќање. |
| | 119 | |
| | 120 | Прашалниците кои беа тестирани се следните: |
| | 121 | |
| | 122 | {{{ |
| | 123 | -- 2.1 |
| | 124 | SELECT * |
| | 125 | FROM vw_client_booking_history |
| | 126 | WHERE client_id = 1500; |
| | 127 | |
| | 128 | -- 2.2 |
| | 129 | SELECT * |
| | 130 | FROM vw_client_booking_history |
| | 131 | WHERE payment_status = 'PAID'; |
| | 132 | }}} |
| | 133 | |
| | 134 | === Време на извршување без индекси === |
| | 135 | |
| | 136 | '''2.1 - 478.399 ms''' |
| | 137 | |
| | 138 | {{{ |
| | 139 | Nested Loop (cost=394513.00..438192.78 rows=3976 width=58) (actual time=434.407..443.008 rows=0 loops=1) |
| | 140 | -> Gather |
| | 141 | -> Parallel Hash Right Join |
| | 142 | -> Parallel Seq Scan on payment p |
| | 143 | -> Parallel Seq Scan on bookingrequest br |
| | 144 | Filter: (client_id = 1500) |
| | 145 | Planning Time: 44.765 ms |
| | 146 | Execution Time: 478.399 ms |
| | 147 | }}} |
| | 148 | |
| | 149 | '''2.2 - 159.853 ms''' |
| | 150 | |
| | 151 | {{{ |
| | 152 | Nested Loop (cost=1001.86..42632.01 rows=1 width=58) (actual time=142.971..159.779 rows=0 loops=1) |
| | 153 | -> Gather |
| | 154 | -> Parallel Seq Scan on payment p |
| | 155 | Filter: ((payment_status)::text = 'PAID'::text) |
| | 156 | Planning Time: 1.571 ms |
| | 157 | Execution Time: 159.853 ms |
| | 158 | }}} |
| | 159 | |
| | 160 | При почетната анализа беше забележано дека PostgreSQL користи {{{Parallel Sequential Scan}}} врз табелите {{{BookingRequest}}}, {{{Booking}}} и {{{Payment}}}. Ова предизвикуваше значително време на извршување, особено кај query-ите што пребаруваат според клиент или статус на плаќање. |
| | 161 | |
| | 162 | За оптимизација беа додадени следните индекси: |
| | 163 | |
| | 164 | {{{ |
| | 165 | CREATE INDEX idx_bookingrequest_client |
| | 166 | ON BookingRequest(client_id); |
| | 167 | |
| | 168 | CREATE INDEX idx_offer_request |
| | 169 | ON Offer(request_id); |
| | 170 | |
| | 171 | CREATE INDEX idx_booking_offer |
| | 172 | ON Booking(offer_id); |
| | 173 | |
| | 174 | CREATE INDEX idx_booking_status |
| | 175 | ON Booking(booking_status); |
| | 176 | |
| | 177 | CREATE INDEX idx_payment_booking |
| | 178 | ON Payment(booking_id); |
| | 179 | |
| | 180 | CREATE INDEX idx_payment_status |
| | 181 | ON Payment(payment_status); |
| | 182 | |
| | 183 | CREATE INDEX idx_bookable_id |
| | 184 | ON Bookable(bookable_id); |
| | 185 | }}} |
| | 186 | |
| | 187 | === Време на извршување со индекси === |
| | 188 | |
| | 189 | '''2.1 - 44.997 ms''' |
| | 190 | |
| | 191 | {{{ |
| | 192 | Nested Loop (cost=1115.31..63410.15 rows=3975 width=58) (actual time=38.480..44.907 rows=0 loops=1) |
| | 193 | -> Parallel Bitmap Heap Scan on bookingrequest br |
| | 194 | -> Bitmap Index Scan on idx_bookingrequest_client |
| | 195 | -> Index Scan using idx_offer_request on offer o |
| | 196 | -> Index Scan using idx_booking_offer on booking bk |
| | 197 | Planning Time: 2.529 ms |
| | 198 | Execution Time: 44.997 ms |
| | 199 | }}} |
| | 200 | |
| | 201 | '''2.2 - 0.114 ms''' |
| | 202 | |
| | 203 | {{{ |
| | 204 | Nested Loop (cost=2.29..14.64 rows=1 width=58) (actual time=0.047..0.049 rows=0 loops=1) |
| | 205 | -> Index Scan using idx_payment_status on payment p |
| | 206 | Planning Time: 2.188 ms |
| | 207 | Execution Time: 0.114 ms |
| | 208 | }}} |
| | 209 | |
| | 210 | По оптимизацијата PostgreSQL започна да користи: |
| | 211 | |
| | 212 | * {{{Bitmap Index Scan}}} |
| | 213 | * {{{Index Scan}}} |
| | 214 | * {{{Index Only Scan}}} |
| | 215 | |
| | 216 | Најголемо подобрување беше забележано кај query-от што пребарува според {{{payment_status}}}, каде времето на извршување се намали: |
| | 217 | |
| | 218 | * од ~159 ms |
| | 219 | * на ~0.1 ms |
| | 220 | |
| | 221 | Исто така, query-от што пребарува според {{{client_id}}} се подобри: |
| | 222 | |
| | 223 | * од ~478 ms |
| | 224 | * на ~44 ms |
| | 225 | |
| | 226 | Со додавањето на индексите planner-от започна да користи индексно пребарување наместо {{{Parallel Sequential Scan}}}, што овозможи значително побрзо извршување на query-ите и подобар execution plan. |