| | 309 | |
| | 310 | |
| | 311 | == 4. Анализа и оптимизација на vw_trending_bookables == |
| | 312 | |
| | 313 | Погледот {{{vw_trending_bookables}}} се користи за прикажување на најпопуларните артисти и бендови според бројот на bookings и просечниот рејтинг. Овој поглед се користи за homepage recommendations и analytics. |
| | 314 | |
| | 315 | Прашалникот кој беше тестиран е следниот: |
| | 316 | |
| | 317 | {{{ |
| | 318 | SELECT * |
| | 319 | FROM vw_trending_bookables |
| | 320 | ORDER BY total_bookings DESC |
| | 321 | LIMIT 10; |
| | 322 | }}} |
| | 323 | |
| | 324 | === Време на извршување без индекси === |
| | 325 | |
| | 326 | '''4.1 - 22675.664 ms''' |
| | 327 | |
| | 328 | {{{ |
| | 329 | Limit (cost=1149893.25..1149893.28 rows=10 width=61) (actual time=22673.555..22673.564 rows=10 loops=1) |
| | 330 | -> Sort |
| | 331 | Sort Key: (count(bk.booking_id)) DESC |
| | 332 | -> HashAggregate |
| | 333 | Group Key: b.bookable_id |
| | 334 | -> Hash Right Join |
| | 335 | -> Hash Left Join |
| | 336 | -> Seq Scan on offer o |
| | 337 | -> Seq Scan on booking bk |
| | 338 | -> Seq Scan on review r |
| | 339 | Planning Time: 1.190 ms |
| | 340 | Execution Time: 22675.664 ms |
| | 341 | }}} |
| | 342 | |
| | 343 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}} и {{{Review}}}, како и {{{HashAggregate}}} и {{{Sort}}} операции за пресметување на бројот на bookings и просечниот рејтинг. |
| | 344 | |
| | 345 | Поради огромниот број редици и aggregation операции, query-от имаше многу долго време на извршување. |
| | 346 | |
| | 347 | За оптимизација беа додадени следните индекси: |
| | 348 | |
| | 349 | {{{ |
| | 350 | CREATE INDEX idx_offer_bookable |
| | 351 | ON Offer(bookable_id); |
| | 352 | |
| | 353 | CREATE INDEX idx_booking_offer |
| | 354 | ON Booking(offer_id); |
| | 355 | |
| | 356 | CREATE INDEX idx_review_booking |
| | 357 | ON Review(booking_id); |
| | 358 | |
| | 359 | CREATE INDEX idx_review_rating |
| | 360 | ON Review(rating); |
| | 361 | |
| | 362 | CREATE INDEX idx_bookable_id |
| | 363 | ON Bookable(bookable_id); |
| | 364 | }}} |
| | 365 | |
| | 366 | === Време на извршување со индекси === |
| | 367 | |
| | 368 | '''4.1 - 22582.888 ms''' |
| | 369 | |
| | 370 | {{{ |
| | 371 | Limit (cost=1149893.25..1149893.28 rows=10 width=61) (actual time=22580.768..22580.777 rows=10 loops=1) |
| | 372 | -> Sort |
| | 373 | Sort Key: (count(bk.booking_id)) DESC |
| | 374 | -> HashAggregate |
| | 375 | Group Key: b.bookable_id |
| | 376 | -> Hash Right Join |
| | 377 | -> Hash Left Join |
| | 378 | -> Seq Scan on offer o |
| | 379 | -> Seq Scan on booking bk |
| | 380 | -> Seq Scan on review r |
| | 381 | Planning Time: 1.633 ms |
| | 382 | Execution Time: 22582.888 ms |
| | 383 | }}} |
| | 384 | |
| | 385 | По оптимизацијата беше забележано мало подобрување кај query-от што ги прикажува најпопуларните артисти: |
| | 386 | |
| | 387 | * од ~22.6 s |
| | 388 | * на ~22.5 s |
| | 389 | |
| | 390 | И покрај додадените индекси, PostgreSQL продолжи да користи {{{Sequential Scan}}} бидејќи query-от обработува огромен број редици и користи сложени aggregation операции како {{{COUNT}}}, {{{AVG}}}, {{{GROUP BY}}} и {{{ORDER BY}}}. |
| | 391 | |
| | 392 | Во вакви ситуации planner-от проценува дека sequential processing е поефикасен од index traversal, па индексите имаат ограничено влијание врз вкупното време на извршување. |