== Оптимизација на прашалници и погледи = View 1. Head to head Филтер кој ќе се користи за vw_head_to_head ќе биде според id на двата тима. Случај на употреба е преглед на претходни средби помеѓу двата тима за еден натпревар. Иницијалното време на извршување е 3s 123ms. Времето не е прифатливо. [[Image(1.png)]] Најскапите операции се full scan на табелите event и event_attribute. Прво се преуредува кверито да филтрира според полето event.event_type_id наместо според event_type.type, со цел да се искористи индексот кој ќе биде поставен на Event табелата: Before:[[BR]] FROM Event e[[BR]] JOIN Event_type et ON et.event_type_id = e.event_type_id[[BR]] LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]] AND ea.attribute_name = 'shot.outcome'[[BR]] WHERE[[BR]] (et.type = 'Shot' AND ea.attribute_value = 'Goal')[[BR]] OR et.type = 'Own Goal For'[[BR]][[BR]] After:[[BR]] FROM Event e [[BR]] LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]] AND ea.attribute_name = 'shot.outcome'[[BR]] WHERE[[BR]] (e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Shot')[[BR]] AND ea.attribute_value = 'Goal')[[BR]] OR e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Own Goal For') [[Image(2.png)]] Додаваме индекс на Event(event_type_id, match_id, team_id). По преуредувањето на погледот и користење на индексот на Event табелата времето се намалува на 738ms. [[Image(3.png)]] WHERE (et.type = 'Shot' AND ea.attribute_value = 'Goal') OR et.type = 'Own Goal For' – во овој случај, едната гранка треба да дојде до event attribute, додека другата (за автогол) нема event_attributes. Планерот мора да избере еден план и во случајов го бира да ги спои сите евенти со event_attributes па потоа да го провери условот. Поради тоа овој услов го преуредуваме со UNION за да се оптимизира додатно и да се искористи индексот на event_attribute табелата.[[BR]] Додаваме индекс на Event_attribute(attribute_value, event_id) where attribute_name = ‘shot.outcome’ Времето се намалува на 485ms што е прифатливо. [[Image(4.png)]] План на евалуација по индексите: [[Image(5.png)]] = View 2. Season overview Филтер кој ќе се користи за vw_season_overview ќе биде според id на сезоната и дивизијата. Случај на употреба е преглед на статистики за една сезона во една лига (дивизија). Иницијалното време на извршување е 4s 792ms. Времето не е прифатливо. [[Image(6.png)]] Се прави истото преуредување за агрегирање на головите како и во првиот поглед за да се искористат истите индекси на Event и Event_attribute табелите. Дополнително се додава индекс на Ticket(match_id) where is_scanned = true [[BR]] По реискористување на индексите од првиот поглед и додавање на новиот, времето се намалува на 1s 64ms што е прифатливо земајќи в предвид дека се агрегираат податоци помеѓу 3 табели со по ~15 милиони редици: [[Image(7.png)]] План на евалуација по оптимизациите: [[Image(8.png)]] = View 3. Stadium utilization Филтер кој ќе се користи за vw_utilization ќе биде според id на стадионот и сезоната. Случај на употреба е преглед на статистики за користење на стадион во една сезона.[[BR]] Иницијалното време на извршување е 1s 571ms. Времето не е прифатливо. [[Image(9.png)]] Од планот на евалуација гледаме дека најскапата операција е full scan на Ticket табелата. Додаваме индекс на Ticket(match_id)[[BR]] Оптимизираното време на извршување е 433ms што е прифатливо. [[Image(10.png)]] План на евалуација по додавање индекси: [[Image(11.png)]]