Changes between Version 3 and Version 4 of QueryOptimization


Ignore:
Timestamp:
05/23/26 23:42:15 (2 days ago)
Author:
231091
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • QueryOptimization

    v3 v4  
    11== Оптимизација на прашалници и погледи
    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
     14Before:[[BR]]
     15FROM Event e[[BR]]
     16JOIN Event_type et ON et.event_type_id = e.event_type_id[[BR]]
     17LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]]
     18AND ea.attribute_name = 'shot.outcome'[[BR]]
     19WHERE[[BR]]
     20(et.type = 'Shot' AND ea.attribute_value = 'Goal')[[BR]]
     21OR et.type = 'Own Goal For'[[BR]][[BR]]
     22After:[[BR]]
     23FROM Event e [[BR]]
     24LEFT JOIN Event_attribute ea ON ea.event_id = e.event_id[[BR]]
     25AND ea.attribute_name = 'shot.outcome'[[BR]]
     26WHERE[[BR]]
     27(e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Shot')[[BR]]
     28AND ea.attribute_value = 'Goal')[[BR]]
     29OR e.event_type_id = (SELECT event_type_id FROM Event_type WHERE type = 'Own
     30Goal
     31For')
     32[[Image(2.png)]]
     33Додаваме индекс на Event(event_type_id, match_id, team_id). По преуредувањето на
     34погледот и користење на индексот на Event табелата времето се намалува на 738ms.
     35[[Image(3.png)]]
     36
     37WHERE (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)]]