Changes between Version 4 and Version 5 of QueryOptimization


Ignore:
Timestamp:
06/12/26 21:34:10 (7 days ago)
Author:
231238
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v4 v5  
    7777План на евалуација по додавање индекси:
    7878[[Image(11.png)]]
     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]]
     93CREATE 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]]
     96CREATE 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]]
     99CREATE 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]]
     142CREATE 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]]
     145CREATE 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