= QueryOptimization == View1: Анализа на поглед - **Активни возења** 1. Примарен филтер за погледот vw_active_trips ќе биде според STATUS на патувањето ('SCHEDULED', 'IN_PROGRESS'), бидејќи view-от ги прикажува само активните возења во моментот. 2. Примарен случај на употреба е за real-time мониторинг на активни возења. За овој поглед ни се важни перформансите, бидејќи се користи континуирано. 3. Иницијалното време за извршување на погледот е 7.38 секунди. Ова не е прифатливо време за апликација која треба да прикажува live статус на возења, па затоа пристапуваме кон индексирање на колоната STATUS во табелата TRIP. 4. Набљудувани операции се full scan на табелата TRIP без индекс на колоната STATUS, со повеќе Hash Join операции низ ROUTE, VEHICLE, DRIVER и EMPLOYEE табелите. 5. Времето изминато во извршување на query-то со индекс изнесува 485 ms (0.48 секунди), и тоа е прифатливо подобрување — 15 пати побрзо. {{{ Hash Left Join (cost=3171.49..15071.96 rows=135727 width=287) (actual time=31.892..479.130 rows=135807 loops=1) Hash Cond: (t.vehicle_type_id = vt.vehicle_type_id) -> Hash Join (cost=3151.59..14013.71 rows=135727 width=155) (actual time=31.841..429.095 rows=135807 loops=1) Hash Cond: ((dr.employee_id)::text = (e.employee_id)::text) -> Hash Join (cost=2048.09..12553.87 rows=135727 width=147) (actual time=17.571..354.868 rows=135807 loops=1) Hash Cond: ((t.driver_id)::text = (dr.driver_id)::text) -> Hash Join (cost=1670.84..11820.22 rows=135727 width=139) (actual time=11.744..290.015 rows=135807 loops=1) Hash Cond: ((t.vehicle_id)::text = (v.vehicle_id)::text) -> Hash Join (cost=1504.34..11297.13 rows=135727 width=123) (actual time=9.158..232.483 rows=135807 loops=1) Hash Cond: ((t.route_id)::text = (r.route_id)::text) -> Bitmap Heap Scan on trip t (cost=1456.72..10891.31 rows=135727 width=97) (actual time=8.634..168.601 rows=135807 loops=1) Recheck Cond: ((status)::text = ANY ('{SCHEDULED,IN_PROGRESS}'::text[])) Heap Blocks: exact=7738 -> Bitmap Index Scan on idx_trip_status (cost=0.00..1422.79 rows=135727 width=0) (actual time=7.136..7.136 rows=135807 loops=1) Index Cond: ((status)::text = ANY ('{SCHEDULED,IN_PROGRESS}'::text[])) -> Hash (cost=37.83..37.83 rows=783 width=41) (actual time=0.458..0.458 rows=783 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 65kB -> Seq Scan on route r (cost=0.00..37.83 rows=783 width=41) (actual time=0.053..0.216 rows=783 loops=1) -> Hash (cost=104.00..104.00 rows=5000 width=21) (actual time=2.512..2.513 rows=5000 loops=1) Buckets: 8192 Batches: 1 Memory Usage: 329kB -> Seq Scan on vehicle v (cost=0.00..104.00 rows=5000 width=21) (actual time=0.009..1.018 rows=5000 loops=1) -> Hash (cost=221.00..221.00 rows=12500 width=20) (actual time=5.693..5.693 rows=12500 loops=1) Buckets: 16384 Batches: 1 Memory Usage: 771kB -> Seq Scan on driver dr (cost=0.00..221.00 rows=12500 width=20) (actual time=0.021..2.062 rows=12500 loops=1) -> Hash (cost=791.00..791.00 rows=25000 width=20) (actual time=14.020..14.021 rows=25000 loops=1) Buckets: 32768 Batches: 1 Memory Usage: 1542kB -> Seq Scan on employee e (cost=0.00..791.00 rows=25000 width=20) (actual time=0.025..6.289 rows=25000 loops=1) -> Hash (cost=14.40..14.40 rows=440 width=122) (actual time=0.037..0.038 rows=3 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 9kB -> Seq Scan on vehicle_type vt (cost=0.00..14.40 rows=440 width=122) (actual time=0.010..0.012 rows=3 loops=1) Planning Time: 4.422 ms Execution Time: 485.098 ms }}} 6. По индексирање, планерот користи Bitmap Index Scan на idx_trip_status наместо Seq Scan, со што филтрирањето на 135,807 активни возења се врши директно преку индексот.