| | 393 | |
| | 394 | |
| | 395 | |
| | 396 | == 5. Анализа и оптимизација на vw_artist_dashboard == |
| | 397 | |
| | 398 | Погледот {{{vw_artist_dashboard}}} се користи за прикажување на статистики за артистите и бендовите, вклучувајќи број на bookings, вкупна заработка и просечен рејтинг. Овој поглед се користи во artist dashboard делот од апликацијата. |
| | 399 | |
| | 400 | Прашалникот кој беше тестиран е следниот: |
| | 401 | |
| | 402 | {{{ |
| | 403 | SELECT * |
| | 404 | FROM vw_artist_dashboard |
| | 405 | WHERE average_rating >= 4.5; |
| | 406 | }}} |
| | 407 | |
| | 408 | === Време на извршување без индекси === |
| | 409 | |
| | 410 | '''5.1 - 32835.819 ms''' |
| | 411 | |
| | 412 | {{{ |
| | 413 | HashAggregate (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=32833.146..32833.154 rows=0 loops=1) |
| | 414 | Group Key: b.bookable_id |
| | 415 | Filter: (round(avg(r.rating), 2) >= 4.5) |
| | 416 | -> Hash Right Join |
| | 417 | -> Hash Left Join |
| | 418 | -> Seq Scan on offer o |
| | 419 | -> Seq Scan on booking bk |
| | 420 | -> Seq Scan on payment p |
| | 421 | -> Seq Scan on review r |
| | 422 | Planning Time: 0.945 ms |
| | 423 | Execution Time: 32835.819 ms |
| | 424 | }}} |
| | 425 | |
| | 426 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} врз табелите {{{Offer}}}, {{{Booking}}}, {{{Payment}}} и {{{Review}}}, како и {{{HashAggregate}}} операции за пресметување на заработката и просечниот рејтинг. |
| | 427 | |
| | 428 | Поради големиот број редици и aggregation операции, query-от имаше многу долго време на извршување. |
| | 429 | |
| | 430 | За оптимизација беа додадени следните индекси: |
| | 431 | |
| | 432 | {{{ |
| | 433 | CREATE INDEX idx_offer_bookable |
| | 434 | ON Offer(bookable_id); |
| | 435 | |
| | 436 | CREATE INDEX idx_booking_offer |
| | 437 | ON Booking(offer_id); |
| | 438 | |
| | 439 | CREATE INDEX idx_payment_booking |
| | 440 | ON Payment(booking_id); |
| | 441 | |
| | 442 | CREATE INDEX idx_payment_status |
| | 443 | ON Payment(payment_status); |
| | 444 | |
| | 445 | CREATE INDEX idx_review_booking |
| | 446 | ON Review(booking_id); |
| | 447 | |
| | 448 | CREATE INDEX idx_review_rating |
| | 449 | ON Review(rating); |
| | 450 | }}} |
| | 451 | |
| | 452 | === Време на извршување со индекси === |
| | 453 | |
| | 454 | '''5.1 - 30002.268 ms''' |
| | 455 | |
| | 456 | {{{ |
| | 457 | HashAggregate (cost=1485307.72..1485320.22 rows=200 width=87) (actual time=29999.572..29999.580 rows=0 loops=1) |
| | 458 | Group Key: b.bookable_id |
| | 459 | Filter: (round(avg(r.rating), 2) >= 4.5) |
| | 460 | -> Hash Right Join |
| | 461 | -> Hash Left Join |
| | 462 | -> Seq Scan on offer o |
| | 463 | -> Seq Scan on booking bk |
| | 464 | -> Seq Scan on payment p |
| | 465 | -> Seq Scan on review r |
| | 466 | Planning Time: 1.395 ms |
| | 467 | Execution Time: 30002.268 ms |
| | 468 | }}} |
| | 469 | |
| | 470 | По оптимизацијата беше забележано подобрување кај query-от што филтрира според просечен рејтинг: |
| | 471 | |
| | 472 | * од ~32.8 s |
| | 473 | * на ~30.0 s |
| | 474 | |
| | 475 | И покрај тоа што PostgreSQL продолжи да користи {{{Sequential Scan}}}, индексите помогнаа при join операциите и hash processing, што резултираше со побрзо извршување на query-от. |
| | 476 | |
| | 477 | Бидејќи погледот користи сложени aggregation операции како {{{SUM}}}, {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}, planner-от проценува дека sequential processing е поефикасен од index traversal при обработка на голем број редици. |