Changes between Version 8 and Version 9 of QueryOptimization


Ignore:
Timestamp:
05/26/26 22:25:55 (16 hours ago)
Author:
231088
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v8 v9  
    613613
    614614По оптимизацијата PostgreSQL престана да користи {{{Sequential Scan}}} и започна да ги пронаоѓа потребните редици преку индексно пребарување, што значително го подобри времето на извршување и ја намали количината на прочитани податоци.
     615
     616
     617
     618
     619== 7. Анализа и оптимизација на vw_artist_reviews ==
     620
     621Погледот {{{vw_artist_reviews}}} се користи за прикажување на reviews за артистите и бендовите, нивниот рејтинг и коментари. Овој поглед се користи за пребарување според рејтинг, артист и display name.
     622
     623Прашалниците кои беа тестирани се следните:
     624
     625{{{
     626-- 7.1
     627SELECT *
     628FROM vw_artist_reviews
     629WHERE rating = 5;
     630
     631-- 7.2
     632SELECT *
     633FROM vw_artist_reviews
     634WHERE bookable_id = 150;
     635
     636-- 7.3
     637SELECT *
     638FROM vw_artist_reviews
     639WHERE display_name = 'Drake';
     640}}}
     641
     642=== Време на извршување без индекси ===
     643
     644'''7.1 - 122018.425 ms'''
     645
     646{{{
     647Gather  (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
     654Planning Time: 2.636 ms
     655Execution Time: 122018.425 ms
     656}}}
     657
     658'''7.2 - 681.679 ms'''
     659
     660{{{
     661Nested 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)
     666Planning Time: 0.795 ms
     667Execution Time: 681.679 ms
     668}}}
     669
     670'''7.3 - 1422.990 ms'''
     671
     672{{{
     673Gather  (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)
     678Planning Time: 0.737 ms
     679Execution Time: 1422.990 ms
     680}}}
     681
     682При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелите {{{Review}}} и {{{Offer}}}. Ова предизвикуваше големо време на извршување бидејќи системот обработуваше милиони редици за да ги пронајде потребните reviews.
     683
     684За оптимизација беа додадени следните индекси:
     685
     686{{{
     687CREATE INDEX idx_review_rating
     688ON Review(rating);
     689
     690CREATE INDEX idx_review_booking
     691ON Review(booking_id);
     692
     693CREATE INDEX idx_booking_offer
     694ON Booking(offer_id);
     695
     696CREATE INDEX idx_offer_bookable
     697ON Offer(bookable_id);
     698
     699CREATE INDEX idx_bookable_id
     700ON Bookable(bookable_id);
     701
     702CREATE INDEX idx_bookable_display
     703ON Bookable(display_name);
     704}}}
     705
     706=== Време на извршување со индекси ===
     707
     708'''7.1 - 1257.316 ms'''
     709
     710{{{
     711Gather  (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
     717Planning Time: 1.856 ms
     718Execution Time: 1257.316 ms
     719}}}
     720
     721'''7.2 - 0.144 ms'''
     722
     723{{{
     724Nested 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
     729Planning Time: 0.900 ms
     730Execution Time: 0.144 ms
     731}}}
     732
     733'''7.3 - 925.788 ms'''
     734
     735{{{
     736Gather  (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
     741Planning Time: 0.866 ms
     742Execution 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}}} за дел од пребарувањата и започна да користи индексно пребарување, што значително го намали времето на извршување и бројот на обработени редици.