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