= Напредна тема - партиционирање '''Членови на тим:''' * 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_result.png)]] Можеме да видиме дека имаме поодбрување од 1662ms на 314ms. Сега ќе искористиме индекс на погледо: [[Image(upcoming_index.png)]] Може да видиме индексот ни го намалува времето на извршување на 606ms. [[Image(upcoming_index_result_1.png)]] [[Image(upcoming_index_result_2.png)]] Ако поставиме индекс на новиот поглед и го тестираме може да видиме дека добиваме време на извршување од 170ms. [[Image(new_upcoming_index.png)]] [[Image(new_upcoming_index_result_1.png)]] [[Image(new_upcoming_index_result_2.png)]] === Погледот `season_standing` Овој поглед враќа статистики за секој тим во секоја сезона. Во него се извршува спојување со дуели кои се веќе изминати. Ова има потенцијал за подобрување со партиционирање. [[Image(season_standing.png)]] Првин ќе го адаптираме за да корсити партициони и ќе добиеме ваков поглед: [[Image(new_season_standing_1.png)]] [[Image(new_season_standing_2.png)]] [[Image(new_season_standing_3.png)]] Ако извршиме анализа на стариот поглед добиваме време на извршување 3909ms. [[Image(season_standing_analyzis_1.png)]] [[Image(season_standing_analyzis_2.png)]] Сега ако извршиме проверка на новиот поглед со партиционирање може да видиме дека имаме минимално убрзување, со добиено време на извршување 2659ms. [[Image(new_season_standing_analyzis_1.png)]] [[Image(new_season_standing_analyzis_2.png)]] Ако сега додадеме индекс на стариот поглед го добиваме овој резултат: [[Image(season_standing_index.png)]] [[Image(season_standing_index_result_1.png)]] [[Image(season_standing_index_result_2.png)]] Ако истото направиме кај новиот поглед го добиваме овие резултати. [[Image(new_season_standing_index.png)]] [[Image(new_season_standing_index_result_1.png)]] [[Image(new_season_standing_index_result_2.png)]] Се гледа со индексирање се намалува времето на извршување од 120ms на 42ms. == Заклучок Можеме да заклучиме дека во поголемите случаи добиваме подобрување при извршувањње на погледите. Но комбинација со правилно индексирање може да се добие уште подобро убрзвуање.