| | 79 | |
| | 80 | |
| | 81 | |
| | 82 | |
| | 83 | = View 4. vw_match_summary |
| | 84 | |
| | 85 | Филтер кој ќе се користи за vw_match_summary ќе биде според match_id. Случај на употреба е преглед на резултати и статистики за натпревари — голови, картони, судија и стадион. |
| | 86 | |
| | 87 | Иницијалното време на извршување е 8s 751ms. Времето не е прифатливо. |
| | 88 | [[Image(Ev1.png)]] |
| | 89 | |
| | 90 | Најскапите операции се Parallel Seq Scan на табелата event_attribute — скенира ~26 милиони редици при барање картони, и Parallel Seq Scan на табелата event — скенира ~12 милиони редици при барање голови. |
| | 91 | |
| | 92 | Додаваме индекс на Event_attribute(attribute_value, event_id) where attribute_name = 'shot.outcome' за да се забрза филтрирањето на голови:[[BR]] |
| | 93 | CREATE INDEX idx_event_attr_shot ON public.event_attribute USING btree (attribute_value, event_id) WHERE ((attribute_name)::text = 'shot.outcome'::text); |
| | 94 | |
| | 95 | Додаваме индекс на Event_attribute(attribute_value, event_id) where attribute_name IN ('foul_committed.card', 'bad_behaviour.card') за да се елиминира Seq Scan при броење картони:[[BR]] |
| | 96 | CREATE INDEX idx_event_attr_cards ON public.event_attribute USING btree (attribute_value, event_id) WHERE ((attribute_name)::text = ANY ('{foul_committed.card,bad_behaviour.card}')); |
| | 97 | |
| | 98 | Додаваме индекс на Event(event_type_id, match_id, team_id) за да се забрза спојувањето на Event табелата:[[BR]] |
| | 99 | CREATE INDEX h2h_idx ON public.event USING btree (event_type_id, match_id, team_id); |
| | 100 | |
| | 101 | По додавањето на индексите времето се намалува на 373ms што е прифатливо (~23x побрзо). |
| | 102 | |
| | 103 | План на евалуација по индексите: |
| | 104 | [[Image(SEv1.png)]] |
| | 105 | |
| | 106 | Иницијално време на инсерт и упдате (пред индекси): |
| | 107 | [[Image(Iv1.png)]] |
| | 108 | |
| | 109 | По додавањето на индексите времето на инсерт и упдате: |
| | 110 | [[Image(SIv1.png)]] |
| | 111 | |
| | 112 | Иницијално време на упдате (пред индекси): |
| | 113 | [[Image(Uv1.png)]] |
| | 114 | |
| | 115 | По додавањето на индексите времето на упдате: |
| | 116 | [[Image(SUv1.png)]] |
| | 117 | |
| | 118 | = View 5. vw_team_season_table |
| | 119 | |
| | 120 | Филтер кој ќе се користи за vw_team_season_table ќе биде според id на сезоната и дивизијата. Случај на употреба е преглед на табела за лига — победи, порази, голови и бодови за секој тим во сезона. |
| | 121 | |
| | 122 | Иницијалното време на извршување е 6s 250ms. Времето не е прифатливо. |
| | 123 | [[Image(Ev2.png)]] |
| | 124 | |
| | 125 | Овој поглед внатрешно го повикува vw_match_summary преку CTE match_results, па ги наследува истите проблеми — Parallel Seq Scan на event и event_attribute табелите. Се реискористуваат истите индекси додадени за vw_match_summary: idx_event_attr_shot за голови, idx_event_attr_cards за картони и h2h_idx за event табелата. Бидејќи vw_team_season_table се базира на vw_match_summary, нема потреба од додатни индекси. |
| | 126 | |
| | 127 | По реискористување на индексите од првиот поглед времето се намалува на 164ms што е прифатливо (~38x побрзо). |
| | 128 | |
| | 129 | План на евалуација по оптимизациите: |
| | 130 | [[Image(SEv2.png)]] |
| | 131 | |
| | 132 | = View 6. vw_player_season_stats |
| | 133 | |
| | 134 | Филтер кој ќе се користи за vw_player_season_stats ќе биде според id на играчот и сезоната. Случај на употреба е преглед на статистики за играч во сезона — настапи, голови, асистенции, картони и проценка на изиграни минути. |
| | 135 | |
| | 136 | Иницијалното време на извршување е 29s. Времето не е прифатливо. |
| | 137 | [[Image(Ev3.png)]] |
| | 138 | |
| | 139 | Од планот на евалуација гледаме дека најскапите операции се Parallel Seq Scan на event табелата за Pass тип (асистенции) — скенира ~12 милиони редици × 5 паралелни работници, Parallel Seq Scan на event_attribute × 2 пати за жолти и црвени картони, и Seq Scan на lineup табелата со 131,707 редици без индекс со external merge sort на диск (2968kB). |
| | 140 | |
| | 141 | Се реискористуваат индексите idx_event_attr_shot, idx_event_attr_cards и h2h_idx од претходните погледи. Дополнително се додава индекс на Event_attribute(attribute_value, event_id) where attribute_name = 'pass.goal_assist' за да го замениме Seq Scan за асистенции со Index Only Scan:[[BR]] |
| | 142 | CREATE INDEX idx_event_attr_assist ON public.event_attribute USING btree (attribute_value, event_id) WHERE ((attribute_name)::text = 'pass.goal_assist'::text); |
| | 143 | |
| | 144 | Додаваме индекс на Lineup(player_id, match_id, team_id, is_starter) за да го елиминираме external merge sort на диск при групирање на настапи по играч и сезона:[[BR]] |
| | 145 | CREATE INDEX idx_lineup_player_match ON public.lineup USING btree (player_id, match_id, team_id, is_starter); |
| | 146 | |
| | 147 | По реискористувањето на постоечките индекси и додавањето на новите, времето се намалува на 324ms што е прифатливо (~89x побрзо). |
| | 148 | |
| | 149 | План на евалуација по додавање индекси: |
| | 150 | [[Image(SEv3.png)]] |
| | 151 | |
| | 152 | Иницијално време на инсерт и упдате (пред индекси): |
| | 153 | [[Image(Iv3.png)]] |
| | 154 | |
| | 155 | По додавањето на индексите времето на инсерт и упдате: |
| | 156 | [[Image(SIv3.png)]] |
| | 157 | |
| | 158 | Иницијално време на упдате (пред индекси): |
| | 159 | [[Image(Uv3.png)]] |
| | 160 | |
| | 161 | По додавањето на индексите времето на упдате: |
| | 162 | [[Image(SUv3.png)]] |
| | 163 | |