Changes between Version 2 and Version 3 of QueryOptimization


Ignore:
Timestamp:
05/20/26 17:23:26 (5 days ago)
Author:
231151
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v2 v3  
    4747
    48486. По индексирање, планерот користи Bitmap Index Scan на idx_trip_status наместо Seq Scan, со што филтрирањето на 135,807 активни возења се врши директно преку индексот.
     49
     50
     51== View2: Анализа на поглед - **Распоред на возачи и инструктори**
     52
     531. Примарен филтер за погледот vw_staff_schedule ќе биде според DRIVER_ID, CONDUCTOR_ID, TRIP_ID и SCHEDULE_DATE, бидејќи view-от со UNION ALL ги спојува распоредите на возачи и кондуктори.
     542. Примарен случај на употреба е преглед на смени на персоналот по ден и линија. View-от користи UNION ALL па без индекси двете страни — DRIVER_SCHEDULE и CONDUCTOR_SCHEDULE — се скенираат целосно.
     553. Иницијалното време за извршување на погледот е над 30 минути (query прекинато). Ова е сосема неприфатливо, па затоа пристапуваме кон индексирање на двете распоредни табели.
     564. Набљудувани операции се Seq Scan на DRIVER_SCHEDULE (387,533 редови) и Seq Scan на CONDUCTOR_SCHEDULE (271,712 редови), со повеќе Hash Join операции низ TRIP, EMPLOYEE, SHIFT, ROUTE и VEHICLE.
     575. Времето изминато во извршување на query-то со индекси изнесува 22.1 секунди, вкупно обработени 659,245 редови.
     58
     59{{{
     60Append  (cost=21578.58..91196.61 rows=659245 width=269) (actual time=265.002..22100.792 rows=659245 loops=1)
     61  ->  Hash Join  (cost=21578.58..47282.64 rows=387533 width=269) (actual time=265.001..11422.640 rows=387533 loops=1)
     62        Hash Cond: ((t.vehicle_id)::text = (v.vehicle_id)::text)
     63        ->  Hash Join  (cost=21412.08..44160.34 rows=387533 width=216) (actual time=263.090..11245.169 rows=387533 loops=1)
     64              Hash Cond: ((t.route_id)::text = (r.route_id)::text)
     65              ->  Hash Join  (cost=21364.47..43089.94 rows=387533 width=203) (actual time=262.753..11133.889 rows=387533 loops=1)
     66                    Hash Cond: (ds.shift_id = sh.shift_id)
     67                    ->  Hash Join  (cost=21345.24..42042.93 rows=387533 width=73) (actual time=254.783..11030.818 rows=387533 loops=1)
     68                          Hash Cond: ((dr.employee_id)::text = (e.employee_id)::text)
     69                          ->  Hash Join  (cost=20241.74..39921.98 rows=387533 width=55) (actual time=241.790..10861.173 rows=387533 loops=1)
     70                                Hash Cond: ((ds.trip_id)::text = (t.trip_id)::text)
     71                                ->  Hash Join  (cost=377.25..9577.20 rows=387533 width=35) (actual time=27.301..10254.297 rows=387533 loops=1)
     72                                      Hash Cond: ((ds.driver_id)::text = (dr.driver_id)::text)
     73                                      ->  Seq Scan on driver_schedule ds  (cost=0.00..8182.33 rows=387533 width=35) (actual time=23.007..10084.784 rows=387533 loops=1)
     74                                      ->  Hash  (cost=221.00..221.00 rows=12500 width=12) (actual time=4.261..4.262 rows=12500 loops=1)
     75                                            Buckets: 16384  Batches: 1  Memory Usage: 674kB
     76                                            ->  Seq Scan on driver dr  (cost=0.00..221.00 rows=12500 width=12) (actual time=0.019..1.918 rows=12500 loops=1)
     77                                ->  Hash  (cost=11613.33..11613.33 rows=387533 width=41) (actual time=213.993..213.994 rows=387533 loops=1)
     78                                      Buckets: 131072  Batches: 8  Memory Usage: 4531kB
     79                                      ->  Seq Scan on trip t  (cost=0.00..11613.33 rows=387533 width=41) (actual time=0.011..78.219 rows=387533 loops=1)
     80                          ->  Hash  (cost=791.00..791.00 rows=25000 width=30) (actual time=12.938..12.939 rows=25000 loops=1)
     81                                Buckets: 32768  Batches: 1  Memory Usage: 1787kB
     82                                ->  Seq Scan on employee e  (cost=0.00..791.00 rows=25000 width=30) (actual time=0.012..6.373 rows=25000 loops=1)
     83                    ->  Hash  (cost=14.10..14.10 rows=410 width=138) (actual time=7.960..7.960 rows=3 loops=1)
     84                          Buckets: 1024  Batches: 1  Memory Usage: 9kB
     85                          ->  Seq Scan on shift sh  (cost=0.00..14.10 rows=410 width=138) (actual time=7.954..7.955 rows=3 loops=1)
     86              ->  Hash  (cost=37.83..37.83 rows=783 width=41) (actual time=0.326..0.327 rows=783 loops=1)
     87                    Buckets: 1024  Batches: 1  Memory Usage: 65kB
     88                    ->  Seq Scan on route r  (cost=0.00..37.83 rows=783 width=41) (actual time=0.022..0.155 rows=783 loops=1)
     89        ->  Hash  (cost=104.00..104.00 rows=5000 width=13) (actual time=1.888..1.889 rows=5000 loops=1)
     90              Buckets: 8192  Batches: 1  Memory Usage: 288kB
     91              ->  Seq Scan on vehicle v  (cost=0.00..104.00 rows=5000 width=13) (actual time=0.025..0.877 rows=5000 loops=1)
     92  ->  Hash Join  (cost=21500.33..40617.75 rows=271712 width=269) (actual time=558.212..10626.730 rows=271712 loops=1)
     93        Hash Cond: ((t_1.vehicle_id)::text = (v_1.vehicle_id)::text)
     94        ->  Hash Join  (cost=21333.83..38378.85 rows=271712 width=216) (actual time=556.482..10501.186 rows=271712 loops=1)
     95              Hash Cond: ((t_1.route_id)::text = (r_1.route_id)::text)
     96              ->  Hash Join  (cost=21286.22..37614.12 rows=271712 width=203) (actual time=556.125..10420.599 rows=271712 loops=1)
     97                    Hash Cond: (cs.shift_id = sh_1.shift_id)
     98                    ->  Hash Join  (cost=21266.99..36874.28 rows=271712 width=73) (actual time=556.099..10353.492 rows=271712 loops=1)
     99                          Hash Cond: ((c.employee_id)::text = (e_1.employee_id)::text)
     100                          ->  Hash Join  (cost=20163.49..35057.41 rows=271712 width=55) (actual time=543.852..10227.463 rows=271712 loops=1)
     101                                Hash Cond: ((cs.trip_id)::text = (t_1.trip_id)::text)
     102                                ->  Hash Join  (cost=299.00..6826.66 rows=271712 width=35) (actual time=333.030..9745.885 rows=271712 loops=1)
     103                                      Hash Cond: ((cs.conductor_id)::text = (c.conductor_id)::text)
     104                                      ->  Seq Scan on conductor_schedule cs  (cost=0.00..5814.12 rows=271712 width=36) (actual time=118.020..9414.529 rows=271712 loops=1)
     105                                      ->  Hash  (cost=174.00..174.00 rows=10000 width=13) (actual time=214.970..214.971 rows=10000 loops=1)
     106                                            Buckets: 16384  Batches: 1  Memory Usage: 582kB
     107                                            ->  Seq Scan on conductor c  (cost=0.00..174.00 rows=10000 width=13) (actual time=0.023..212.927 rows=10000 loops=1)
     108                                ->  Hash  (cost=11613.33..11613.33 rows=387533 width=41) (actual time=210.327..210.328 rows=387533 loops=1)
     109                                      Buckets: 131072  Batches: 8  Memory Usage: 4531kB
     110                                      ->  Seq Scan on trip t_1  (cost=0.00..11613.33 rows=387533 width=41) (actual time=0.013..70.554 rows=387533 loops=1)
     111                          ->  Hash  (cost=791.00..791.00 rows=25000 width=30) (actual time=12.196..12.196 rows=25000 loops=1)
     112                                Buckets: 32768  Batches: 1  Memory Usage: 1787kB
     113                                ->  Seq Scan on employee e_1  (cost=0.00..791.00 rows=25000 width=30) (actual time=0.011..5.545 rows=25000 loops=1)
     114                    ->  Hash  (cost=14.10..14.10 rows=410 width=138) (actual time=0.014..0.014 rows=3 loops=1)
     115                          Buckets: 1024  Batches: 1  Memory Usage: 9kB
     116                          ->  Seq Scan on shift sh_1  (cost=0.00..14.10 rows=410 width=138) (actual time=0.010..0.011 rows=3 loops=1)
     117              ->  Hash  (cost=37.83..37.83 rows=783 width=41) (actual time=0.335..0.336 rows=783 loops=1)
     118                    Buckets: 1024  Batches: 1  Memory Usage: 65kB
     119                    ->  Seq Scan on route r_1  (cost=0.00..37.83 rows=783 width=41) (actual time=0.026..0.162 rows=783 loops=1)
     120        ->  Hash  (cost=104.00..104.00 rows=5000 width=13) (actual time=1.703..1.704 rows=5000 loops=1)
     121              Buckets: 8192  Batches: 1  Memory Usage: 288kB
     122              ->  Seq Scan on vehicle v_1  (cost=0.00..104.00 rows=5000 width=13) (actual time=0.018..0.746 rows=5000 loops=1)
     123Planning Time: 543.865 ms
     124Execution Time: 22127.391 ms
     125
     126}}}
     127
     1286. По индексирање планот сеуште користи Seq Scan на DRIVER_SCHEDULE и CONDUCTOR_SCHEDULE бидејќи query-от враќа целата содржина на табелите — индексите помагаат при филтрирање по конкретен датум или вработен, не при SELECT *.