Changes between Version 7 and Version 8 of QueryOptimization


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

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v7 v8  
    476476
    477477Бидејќи погледот користи сложени aggregation операции како {{{SUM}}}, {{{AVG}}}, {{{COUNT}}} и {{{GROUP BY}}}, planner-от проценува дека sequential processing е поефикасен од index traversal при обработка на голем број редици.
     478
     479
     480== 6. Анализа и оптимизација на vw_artist_schedule ==
     481
     482Погледот {{{vw_artist_schedule}}} се користи за прикажување на распоредот и достапноста на артистите и бендовите. Овој поглед се користи за пребарување според статус на достапност, конкретен артист и временски период.
     483
     484Прашалниците кои беа тестирани се следните:
     485
     486{{{
     487-- 6.1
     488SELECT *
     489FROM vw_artist_schedule
     490WHERE status = 'AVAILABLE';
     491
     492-- 6.2
     493SELECT *
     494FROM vw_artist_schedule
     495WHERE bookable_id = 150;
     496
     497-- 6.3
     498SELECT *
     499FROM vw_artist_schedule
     500WHERE start_datetime >= '2026-07-01'
     501AND start_datetime < '2026-08-01';
     502}}}
     503
     504=== Време на извршување без индекси ===
     505
     506'''6.1 - 192.437 ms'''
     507
     508{{{
     509Hash Join  (cost=28.50..17676.52 rows=199740 width=43) (actual time=37.987..185.463 rows=199835 loops=1)
     510  ->  Seq Scan on availabilityslot av
     511        Filter: ((status)::text = 'AVAILABLE'::text)
     512  ->  Seq Scan on bookable b
     513Planning Time: 0.401 ms
     514Execution Time: 192.437 ms
     515}}}
     516
     517'''6.2 - 51.157 ms'''
     518
     519{{{
     520Nested Loop  (cost=1000.27..13156.88 rows=993 width=43) (actual time=5.494..51.071 rows=1017 loops=1)
     521  ->  Index Scan using bookable_pkey on bookable b
     522  ->  Parallel Seq Scan on availabilityslot av
     523        Filter: (bookable_id = 150)
     524Planning Time: 0.178 ms
     525Execution Time: 51.157 ms
     526}}}
     527
     528'''6.3 - 96.327 ms'''
     529
     530{{{
     531Hash Join  (cost=28.50..18925.91 rows=104939 width=43) (actual time=5.043..92.669 rows=103896 loops=1)
     532  ->  Seq Scan on availabilityslot av
     533        Filter: ((start_datetime >= '2026-07-01 00:00:00'::timestamp without time zone)
     534              AND (start_datetime < '2026-08-01 00:00:00'::timestamp without time zone))
     535  ->  Seq Scan on bookable b
     536Planning Time: 0.345 ms
     537Execution Time: 96.327 ms
     538}}}
     539
     540При почетната анализа со {{{EXPLAIN ANALYZE}}} беше забележано дека PostgreSQL користи {{{Sequential Scan}}} и {{{Parallel Sequential Scan}}} врз табелата {{{AvailabilitySlot}}}. Ова значеше дека системот чита голем број редици за да ги пронајде потребните податоци, што предизвикуваше дополнително време на извршување.
     541
     542За оптимизација беа додадени следните индекси:
     543
     544{{{
     545CREATE INDEX idx_availability_status
     546ON AvailabilitySlot(status);
     547
     548CREATE INDEX idx_availability_bookable
     549ON AvailabilitySlot(bookable_id);
     550
     551CREATE INDEX idx_availability_start
     552ON AvailabilitySlot(start_datetime);
     553
     554CREATE INDEX idx_bookable_id
     555ON Bookable(bookable_id);
     556}}}
     557
     558=== Време на извршување со индекси ===
     559
     560'''6.1 - 109.389 ms'''
     561
     562{{{
     563Hash Join  (cost=2260.91..14905.68 rows=199740 width=43) (actual time=9.156..102.463 rows=199835 loops=1)
     564  ->  Bitmap Heap Scan on availabilityslot av
     565        ->  Bitmap Index Scan on idx_availability_status
     566  ->  Seq Scan on bookable b
     567Planning Time: 0.846 ms
     568Execution Time: 109.389 ms
     569}}}
     570
     571'''6.2 - 2.111 ms'''
     572
     573{{{
     574Nested Loop  (cost=12.40..2934.21 rows=993 width=43) (actual time=0.327..2.041 rows=1017 loops=1)
     575  ->  Index Scan using idx_bookable_id on bookable b
     576  ->  Bitmap Heap Scan on availabilityslot av
     577        ->  Bitmap Index Scan on idx_availability_bookable
     578Planning Time: 0.206 ms
     579Execution Time: 2.111 ms
     580}}}
     581
     582'''6.3 - 73.602 ms'''
     583
     584{{{
     585Hash Join  (cost=2260.55..13732.05 rows=104939 width=43) (actual time=11.382..70.012 rows=103896 loops=1)
     586  ->  Bitmap Heap Scan on availabilityslot av
     587        ->  Bitmap Index Scan on idx_availability_start
     588  ->  Seq Scan on bookable b
     589Planning Time: 0.410 ms
     590Execution Time: 73.602 ms
     591}}}
     592
     593По оптимизацијата PostgreSQL започна да користи:
     594
     595 * {{{Bitmap Index Scan}}}
     596 * {{{Bitmap Heap Scan}}}
     597 * {{{Index Scan}}}
     598
     599Најголемо подобрување беше забележано кај query-от што пребарува според {{{bookable_id}}}:
     600
     601 * од ~51 ms
     602 * на ~2 ms
     603
     604Кај query-от што пребарува според {{{status = 'AVAILABLE'}}} времето на извршување се намали:
     605
     606 * од ~192 ms
     607 * на ~109 ms
     608
     609Исто така, query-от што пребарува според временски период се подобри:
     610
     611 * од ~96 ms
     612 * на ~73 ms
     613
     614По оптимизацијата PostgreSQL престана да користи {{{Sequential Scan}}} и започна да ги пронаоѓа потребните редици преку индексно пребарување, што значително го подобри времето на извршување и ја намали количината на прочитани податоци.