= Напредна тема - партиционирање '''Членови на тим:''' * Aлександар Тодороски 231153 * Антонио Трајковски 231156 * Вељко Аџиќ 231267 Табелата `DUEL` има многу податоци и таа е една од наважниите и најголемите табели во нашиот систем. Барањето податоци ни неа е бавен процес и поради тоа искористивме '''партиционирање'''. Оваа ни помага да имаме многу добри перформанси при пребараување на податоци низ оваа табела, и кога користиме прашалници да не ја изминнуваме целата табела, туку дел кој е потребен. == Партиционирање на табелата Прво и основно, ние хористиме `range` партиционирање бидејќи имаме време кога се оддржал дуелот па најдобро е да правиме според тоа. Вењќе имаме DDL и податоци пополнети во нашиот систем ќе креираме нова табела каде ќе ставиме по што да партиционираме, затоа имаме `PARTITION BY RANGE(duel_date)`. [[Image(new_duel.png)]] Потоа мора да направиме поделби за секоја партиција од кога до кога да биде. Затоа тука креираме нова табела `DUEL_YEARS_RANGES` и ќе ги генерираме датумите на опсезите. Потоа со циклус ќе ги креираме генерираните партициите на `NEW_DUEL` со додделено име во формат`'new_duel_' + year`. [[Image(duel_year_ranges.png)]] == Мигрирање податоци во `NEW_DUEL` Одкако ги креираме партициите, ќе треба да се мигрираат податоците од старата табела во новата. Тоа го извршуваме со кверито подолу. [[Image(new_duel_migrate.png)]] Бидејќи ги копираме сите податоци од една табела во друга, вклучувајќи го и `id` кое е декларирано како `SERIAL`, секвенцата на `id` во нова табела не се ажурира и потребно е да се мигрира секвенцата. Тоа се извршува на следен начин: [[Image(new_duel_sequence.png)]] Табелите `TEAM_ROSTER`, `REFEREEING_DUEL` и `SCORE` ја референцираат табелата `DUEL` треба и нив да ги мигрираме. Затоа ги имаме креирано следниве табели: [[Image(new_tables.png)]] Овие табели исто треба да се мигрираат на следниот начин: [[Image(migrate_tables.png)]] [[Image(new_score_sequence.png)]] По ова, со помош на `ALTER TABLE` ќе ги поставиме старите ограничувања на новите табелите. [[Image(constraints.png)]] == Тестирање погледи Одкако завршивме со миграции потребно е да провериме дали ни го намалува времето на извршување. Ќе извршиме споредба на неколку погледи без партиционирање и со партиционирање. === Погледот `upcoming_duels` Овој поглед враќа податоци за дуели што се во иднина, ова е добар кандидат да се провери партиционирање. Треба да го прилагодиме за партиционирање, така што ќе мора да смениме `start_time` со `duel_date`, затоа новиот поглед ќе изгледа вака: [[Image(new_upcoming_duels.png)]] Прво ќе го провериме стариот поглед без индекси. [[Image(upcoming_analyze.png)]] И добиваме ваков резултат: [[Image(upcoming_result.png)]] Сега ако го провериме новиот поглед добиваме ваков реззултат: [[Image(new_upcoming_analyze.png)]] [[Image(new_upcoming_analyze.png)]] Можеме да видиме дека имаме поодбрување од 1662ms на 314ms. Сега ќе искористиме индекс на погледо: [[Image(upcoming_index.png)]] Може да видиме индексот ни го намалува времето на извршување на 606ms. [[Image(upcoming_index_result.png)]] Ако поставиме индекс на новиот поглед и го тестираме може да видиме дека добиваме време на извршување од 170ms. [[Image(new_upcoming_index.png)]] [[Image(new_upcoming_index_result)]] === Погледот `season_standing` Овој поглед враќа статистики за секој тим во секоја сезона. Во него се извршува спојување со дуели кои се веќе изминати. Ова има потенцијал за подобрување со партиционирање. [[Image(season_standing.png)]] Првин ќе го адаптираме за да корсити партициони и ќе добиеме ваков поглед: [[Image(new_season_standing.png)]] Ако извршиме анализа на стариот поглед добиваме време на извршување 3909ms. [[Image(season_standing_analyzis.png)]] Сега ако извршиме проверка на новиот поглед со партиционирање може да видиме дека имаме минимално убрзување, со добиено време на извршување 2659ms. Ако сега додадеме индекс на стариот поглед го добиваме овој резултат: [[Image(season_standing_index.png)]] [[Image(season_standing_index_result.png)]] Ако истото направиме кај новиот поглед го добиваме овие резултати. [[Image(new_season_standing_index.png)]] [[Image(new_season_standing_index_result.png)]] Се гледа со индексирање се намалува времето на извршување од 120ms на 42ms. == Заклучок Можеме да заклучиме дека во поголемите случаи добиваме подобрување при извршувањње на погледите. Но комбинација со правилно индексирање може да се добие уште подобро убрзвуање.