| | 615 | |
| | 616 | |
| | 617 | |
| | 618 | |
| | 619 | == 7. Анализа и оптимизација на vw_artist_reviews == |
| | 620 | |
| | 621 | Погледот {{{vw_artist_reviews}}} се користи за прикажување на reviews за артистите и бендовите, нивниот рејтинг и коментари. Овој поглед се користи за пребарување според рејтинг, артист и display name. |
| | 622 | |
| | 623 | Прашалниците кои беа тестирани се следните: |
| | 624 | |
| | 625 | {{{ |
| | 626 | -- 7.1 |
| | 627 | SELECT * |
| | 628 | FROM vw_artist_reviews |
| | 629 | WHERE rating = 5; |
| | 630 | |
| | 631 | -- 7.2 |
| | 632 | SELECT * |
| | 633 | FROM vw_artist_reviews |
| | 634 | WHERE bookable_id = 150; |
| | 635 | |
| | 636 | -- 7.3 |
| | 637 | SELECT * |
| | 638 | FROM vw_artist_reviews |
| | 639 | WHERE display_name = 'Drake'; |
| | 640 | }}} |
| | 641 | |
| | 642 | === Време на извршување без индекси === |
| | 643 | |
| | 644 | '''7.1 - 122018.425 ms''' |
| | 645 | |
| | 646 | {{{ |
| | 647 | Gather (cost=17340.83..132489.41 rows=238310 width=40) (actual time=606.629..121857.202 rows=240417 loops=1) |
| | 648 | -> Hash Join |
| | 649 | -> Parallel Hash Join |
| | 650 | -> Parallel Seq Scan on booking bk |
| | 651 | -> Parallel Seq Scan on review r |
| | 652 | Filter: (rating = 5) |
| | 653 | -> Seq Scan on bookable b |
| | 654 | Planning Time: 2.636 ms |
| | 655 | Execution Time: 122018.425 ms |
| | 656 | }}} |
| | 657 | |
| | 658 | '''7.2 - 681.679 ms''' |
| | 659 | |
| | 660 | {{{ |
| | 661 | Nested Loop (cost=193407.74..209111.43 rows=1 width=40) (actual time=646.913..680.325 rows=0 loops=1) |
| | 662 | -> Parallel Hash Join |
| | 663 | -> Parallel Seq Scan on review r |
| | 664 | -> Parallel Seq Scan on offer o |
| | 665 | Filter: (bookable_id = 150) |
| | 666 | Planning Time: 0.795 ms |
| | 667 | Execution Time: 681.679 ms |
| | 668 | }}} |
| | 669 | |
| | 670 | '''7.3 - 1422.990 ms''' |
| | 671 | |
| | 672 | {{{ |
| | 673 | Gather (cost=197989.27..213886.91 rows=2000 width=40) (actual time=1387.691..1421.437 rows=0 loops=1) |
| | 674 | -> Parallel Hash Join |
| | 675 | -> Parallel Seq Scan on offer o |
| | 676 | -> Seq Scan on bookable b |
| | 677 | Filter: ((display_name)::text = 'Drake'::text) |
| | 678 | Planning Time: 0.737 ms |
| | 679 | Execution Time: 1422.990 ms |
| | 680 | }}} |
| | 681 | |
| | 682 | При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелите {{{Review}}} и {{{Offer}}}. Ова предизвикуваше големо време на извршување бидејќи системот обработуваше милиони редици за да ги пронајде потребните reviews. |
| | 683 | |
| | 684 | За оптимизација беа додадени следните индекси: |
| | 685 | |
| | 686 | {{{ |
| | 687 | CREATE INDEX idx_review_rating |
| | 688 | ON Review(rating); |
| | 689 | |
| | 690 | CREATE INDEX idx_review_booking |
| | 691 | ON Review(booking_id); |
| | 692 | |
| | 693 | CREATE INDEX idx_booking_offer |
| | 694 | ON Booking(offer_id); |
| | 695 | |
| | 696 | CREATE INDEX idx_offer_bookable |
| | 697 | ON Offer(bookable_id); |
| | 698 | |
| | 699 | CREATE INDEX idx_bookable_id |
| | 700 | ON Bookable(bookable_id); |
| | 701 | |
| | 702 | CREATE INDEX idx_bookable_display |
| | 703 | ON Bookable(display_name); |
| | 704 | }}} |
| | 705 | |
| | 706 | === Време на извршување со индекси === |
| | 707 | |
| | 708 | '''7.1 - 1257.316 ms''' |
| | 709 | |
| | 710 | {{{ |
| | 711 | Gather (cost=14992.67..130141.25 rows=238310 width=40) (actual time=307.260..1241.990 rows=240417 loops=1) |
| | 712 | -> Hash Join |
| | 713 | -> Parallel Hash Join |
| | 714 | -> Parallel Seq Scan on booking bk |
| | 715 | -> Parallel Bitmap Heap Scan on review r |
| | 716 | -> Bitmap Index Scan on idx_review_rating |
| | 717 | Planning Time: 1.856 ms |
| | 718 | Execution Time: 1257.316 ms |
| | 719 | }}} |
| | 720 | |
| | 721 | '''7.2 - 0.144 ms''' |
| | 722 | |
| | 723 | {{{ |
| | 724 | Nested Loop (cost=1.57..25.66 rows=1 width=40) (actual time=0.096..0.097 rows=0 loops=1) |
| | 725 | -> Index Scan using idx_bookable_id on bookable b |
| | 726 | -> Index Scan using idx_offer_bookable on offer o |
| | 727 | -> Index Scan using idx_booking_offer on booking bk |
| | 728 | -> Index Scan using idx_review_booking on review r |
| | 729 | Planning Time: 0.900 ms |
| | 730 | Execution Time: 0.144 ms |
| | 731 | }}} |
| | 732 | |
| | 733 | '''7.3 - 925.788 ms''' |
| | 734 | |
| | 735 | {{{ |
| | 736 | Gather (cost=1009.16..198914.73 rows=2000 width=40) (actual time=890.434..924.427 rows=0 loops=1) |
| | 737 | -> Nested Loop |
| | 738 | -> Hash Join |
| | 739 | -> Parallel Seq Scan on offer o |
| | 740 | -> Index Scan using idx_bookable_display on bookable b |
| | 741 | Planning Time: 0.866 ms |
| | 742 | Execution Time: 925.788 ms |
| | 743 | }}} |
| | 744 | |
| | 745 | По оптимизацијата PostgreSQL започна да користи: |
| | 746 | |
| | 747 | * {{{Bitmap Index Scan}}} |
| | 748 | * {{{Bitmap Heap Scan}}} |
| | 749 | * {{{Index Scan}}} |
| | 750 | |
| | 751 | Најголемо подобрување беше забележано кај query-от што пребарува според {{{rating = 5}}}: |
| | 752 | |
| | 753 | * од ~122 s |
| | 754 | * на ~1.2 s |
| | 755 | |
| | 756 | Кај query-от што пребарува според {{{bookable_id}}} времето на извршување се намали: |
| | 757 | |
| | 758 | * од ~681 ms |
| | 759 | * на ~0.14 ms |
| | 760 | |
| | 761 | Исто така, query-от што пребарува според {{{display_name}}} се подобри: |
| | 762 | |
| | 763 | * од ~1422 ms |
| | 764 | * на ~925 ms |
| | 765 | |
| | 766 | По оптимизацијата PostgreSQL престана да користи {{{Sequential Scan}}} за дел од пребарувањата и започна да користи индексно пребарување, што значително го намали времето на извршување и бројот на обработени редици. |