| 2 | | Документот е достапен тука: [[attachment:QueryOptimization.pdf]] |
| | 2 | = View 1. Head to head |
| | 3 | Филтер кој ќе се користи за vw_head_to_head ќе биде според id на двата тима. |
| | 4 | Случај на употреба е преглед на претходни средби помеѓу двата тима за еден |
| | 5 | натпревар. |
| | 6 | |
| | 7 | Иницијалното време на извршување е 3s 123ms. Времето не е прифатливо. |
| | 8 | [[Image(1.png)]] |
| | 9 | Најскапите операции се full scan на табелите event и event_attribute. |
| | 10 | Прво се преуредува кверито да филтрира според полето event.event_type_id наместо |
| | 11 | според event_type.type, со цел да се искористи индексот кој ќе биде поставен на Event |
| | 12 | табелата: |
| | 13 | |
| | 14 | Before:[[BR]] |
| | 15 | FROM Event e[[BR]] |
| | 16 | JOIN Event_type et ON et.event_type_id = e.event_type_id[[BR]] |
| | 17 | LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]] |
| | 18 | AND ea.attribute_name = 'shot.outcome'[[BR]] |
| | 19 | WHERE[[BR]] |
| | 20 | (et.type = 'Shot' AND ea.attribute_value = 'Goal')[[BR]] |
| | 21 | OR et.type = 'Own Goal For'[[BR]][[BR]] |
| | 22 | After:[[BR]] |
| | 23 | FROM Event e [[BR]] |
| | 24 | LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]] |
| | 25 | AND ea.attribute_name = 'shot.outcome'[[BR]] |
| | 26 | WHERE[[BR]] |
| | 27 | (e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Shot')[[BR]] |
| | 28 | AND ea.attribute_value = 'Goal')[[BR]] |
| | 29 | OR e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Own |
| | 30 | Goal |
| | 31 | For') |
| | 32 | [[Image(2.png)]] |
| | 33 | Додаваме индекс на Event(event_type_id, match_id, team_id). По преуредувањето на |
| | 34 | погледот и користење на индексот на Event табелата времето се намалува на 738ms. |
| | 35 | [[Image(3.png)]] |
| | 36 | |
| | 37 | WHERE (et.type = 'Shot' AND ea.attribute_value = 'Goal') OR et.type = 'Own Goal For' – во |
| | 38 | овој случај, едната гранка треба да дојде до event attribute, додека другата (за автогол) |
| | 39 | нема event_attributes. Планерот мора да избере еден план и во случајов го бира да ги |
| | 40 | спои сите евенти со event_attributes па потоа да го провери условот. Поради тоа овој |
| | 41 | услов го преуредуваме со UNION за да се оптимизира додатно и да се искористи |
| | 42 | индексот на event_attribute табелата.[[BR]] |
| | 43 | Додаваме индекс на Event_attribute(attribute_value, event_id) where attribute_name = |
| | 44 | ‘shot.outcome’ |
| | 45 | Времето се намалува на 485ms што е прифатливо. |
| | 46 | [[Image(4.png)]] |
| | 47 | План на евалуација по индексите: |
| | 48 | [[Image(5.png)]] |
| | 49 | |
| | 50 | = View 2. Season overview |
| | 51 | Филтер кој ќе се користи за vw_season_overview ќе биде според id на сезоната и |
| | 52 | дивизијата. Случај на употреба е преглед на статистики за една сезона во една |
| | 53 | лига (дивизија). |
| | 54 | |
| | 55 | Иницијалното време на извршување е 4s 792ms. Времето не е прифатливо. |
| | 56 | [[Image(6.png)]] |
| | 57 | Се прави истото преуредување за агрегирање на головите како и во првиот поглед за |
| | 58 | да се искористат истите индекси на Event и Event_attribute табелите. Дополнително се |
| | 59 | додава индекс на Ticket(match_id) where is_scanned = true [[BR]] |
| | 60 | По реискористување на индексите од првиот поглед и додавање на новиот, времето |
| | 61 | се намалува на 1s 64ms што е прифатливо земајќи в предвид дека се агрегираат |
| | 62 | податоци помеѓу 3 табели со по ~15 милиони редици: |
| | 63 | [[Image(7.png)]] |
| | 64 | План на евалуација по оптимизациите: |
| | 65 | [[Image(8.png)]] |
| | 66 | |
| | 67 | = View 3. Stadium utilization |
| | 68 | Филтер кој ќе се користи за vw_utilization ќе биде според id на стадионот и |
| | 69 | сезоната. Случај на употреба е преглед на статистики за користење на стадион во |
| | 70 | една сезона.[[BR]] |
| | 71 | Иницијалното време на извршување е 1s 571ms. Времето не е прифатливо. |
| | 72 | [[Image(9.png)]] |
| | 73 | Од планот на евалуација гледаме дека најскапата операција е full scan на Ticket |
| | 74 | табелата. Додаваме индекс на Ticket(match_id)[[BR]] |
| | 75 | Оптимизираното време на извршување е 433ms што е прифатливо. |
| | 76 | [[Image(10.png)]] |
| | 77 | План на евалуација по додавање индекси: |
| | 78 | [[Image(11.png)]] |