| | 49 | |
| | 50 | |
| | 51 | == View2: Анализа на поглед - **Распоред на возачи и инструктори** |
| | 52 | |
| | 53 | 1. Примарен филтер за погледот vw_staff_schedule ќе биде според DRIVER_ID, CONDUCTOR_ID, TRIP_ID и SCHEDULE_DATE, бидејќи view-от со UNION ALL ги спојува распоредите на возачи и кондуктори. |
| | 54 | 2. Примарен случај на употреба е преглед на смени на персоналот по ден и линија. View-от користи UNION ALL па без индекси двете страни — DRIVER_SCHEDULE и CONDUCTOR_SCHEDULE — се скенираат целосно. |
| | 55 | 3. Иницијалното време за извршување на погледот е над 30 минути (query прекинато). Ова е сосема неприфатливо, па затоа пристапуваме кон индексирање на двете распоредни табели. |
| | 56 | 4. Набљудувани операции се Seq Scan на DRIVER_SCHEDULE (387,533 редови) и Seq Scan на CONDUCTOR_SCHEDULE (271,712 редови), со повеќе Hash Join операции низ TRIP, EMPLOYEE, SHIFT, ROUTE и VEHICLE. |
| | 57 | 5. Времето изминато во извршување на query-то со индекси изнесува 22.1 секунди, вкупно обработени 659,245 редови. |
| | 58 | |
| | 59 | {{{ |
| | 60 | Append (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) |
| | 123 | Planning Time: 543.865 ms |
| | 124 | Execution Time: 22127.391 ms |
| | 125 | |
| | 126 | }}} |
| | 127 | |
| | 128 | 6. По индексирање планот сеуште користи Seq Scan на DRIVER_SCHEDULE и CONDUCTOR_SCHEDULE бидејќи query-от враќа целата содржина на табелите — индексите помагаат при филтрирање по конкретен датум или вработен, не при SELECT *. |